最近機械学習の勉強を始めたことと、業務の中でSQLに触れることが増えてきたので これまで疎かにしてきたSQL構文周りで知らなかったことや覚えておきたいことを箇条書きでまとめておきます。
完全に自分用のメモですが、SQL始めたての人にはもしかしたら参考になるかもしれません。
SQLの種類について
SQLは大きく以下の2つに分類される。
-
DDL(Data Definition Language) テーブルの作成など、データではなく本体のに対するクエリ
-
DML(Data Manipulation Language) SELECTとやUPDATEなどテーブルのデータに対するクエリ
JOINの種類について
テーブルを結合するにはJOINを用いる。結合の条件にカラムの値を指定しその値に応じて結合を行う。 種類として以下の3つがある。 (便宜上テーブルAを結合元、テーブルBを結合先とする)
-
INNER JOIN テーブルA、テーブルBの両方に指定したカラムの値が存在するレコードのみ抽出し結合
-
OUTER JOIN OUTER JOINは、「LEFT OUTER JOIN」と「RIGHT OUTER JOIN」の2つがある。 LEFTとRIGHTはテーブルAを基準とするかBを基準とするかの違い。
LEFTの場合はテーブルAのレコードは残し、テーブルBにカラムの値がないものはnullで埋められる。
RIGHTはその逆。
ちなみに、「OUTER」は省略できる
- CROSS JOIN 両方のテーブルの全ての組み合わせを取得する。 あまり使わない。 参考
各句の実行順序について
他のプログラミング言語と違い、SQLは見た通りに上から下へと実行がされません。 以下のサイトに一覧の記載がある。
where句とhaving句
条件を指定するための、where句とhaving句ですが1番の違いは前段でも記載した実行のタイミングです。 havingはselect句より後に実行されるため、selectで抽出した結果に対してその後で条件によるフィルタリングを行うことができます。
select時に新たなカラムを一時的に生成したい時
例えば、select実行時に一時的になんらかのフラグなどを格納するためのカラムを生成したい場合 (例えば、身長170cm以上というデータをもつときに、高身長というカラムを付けたいとか)
case句により条件を指定
することで実現が可能です。
ここで追加した後で、group by句でグルーピングするとかできます。
LEFT JOINしたテーブルに対してのSELECT
LEFT JOINしたテーブルへのSELECTには、どちらのテーブルかどうかを明示する必要がある。 例えば、on句で(a.id = b.id)としそのままselect id ~~とすると取れない。
select a.idとする必要がある。
(データベースによるかも?オラクルとかPostgresとかMySQLとか)
LEFT OUTER JOIN
OUTER JOINのOUTERは省略可能なのでLEFT JOIN
Oracleでカラム情報を取得するクエリ
SELECT
column_name
FROM
all_tab_columns
WHERE
owner = :OWNER_NAME
AND
table_name = :TABLE_NAME
ORDER BY
column_id;
update時の挙動
データベースのテーブルをアップデートする際、 直接ディスク上のデータを変更する前に一度メモリ上に変更を記録する。 その後で、別のプロセスがディスク上に書き込みにいく。なのでupdate時に大量の書き換えを行うときはメモリに注意。
WALとは
WALは Write Ahead Logの略 実際のトランザクションの処理の適用の前にログに書き込むことでミスが生じた時もログから復元できる。 またデータの一貫性も保たれる 詳しくはこちら
TRUNC
- formatを指定すると、日付や時間を切り捨てて返してくれる