SQLを使い始めたので最初に詰まった事を全部まとめておく

SQL, Programming, DB09 November 2020

最近機械学習の勉強を始めたことと、業務の中で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は見た通りに上から下へと実行がされません。 以下のサイトに一覧の記載がある。

【SQL】実行の順序

where句とhaving句

条件を指定するための、where句とhaving句ですが1番の違いは前段でも記載した実行のタイミングです。 havingはselect句より後に実行されるため、selectで抽出した結果に対してその後で条件によるフィルタリングを行うことができます。

select時に新たなカラムを一時的に生成したい時

例えば、select実行時に一時的になんらかのフラグなどを格納するためのカラムを生成したい場合 (例えば、身長170cm以上というデータをもつときに、高身長というカラムを付けたいとか)

case句により条件を指定することで実現が可能です。

CASE式で条件分岐をSQL文に任せる

ここで追加した後で、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を指定すると、日付や時間を切り捨てて返してくれる

tags: SQL, Programming, DB