TL;DR
これを読んだメモです。自分が知らなかったことととか書いてきます。個人的には、長いSQL文を読む、というところに1章使っているのがいいなと思いました。(その割に薄っぺらい感想ですが、まあSQL文読むってのは実践あるのみだと思うので・・・)
SQLの実行順について
select文の実行順はFROM→JOIN→ON→WHERE→GROUP BY→HAVING→SELECT→OVER(ウィンドウ関数)→ROWS/RANGE(ウィンドウ関数)→PARTITIOON BY(OVER句内)→ORDER BY(OVER句内)→ORDER BY→LIMITとなる。これを意識するだけでも実行性能に効いてくる
例えば、HAVINGとWHEREはどちらも条件でデータを絞る、ものだが、できればWHEREで絞れるものは絞ったほうがいい。なぜなら、先に実行されるWHEREで条件を絞ったほうが、SQL実行順の関係で早くデータを絞ることができるため。
NULLとCOALESCE関数
SQLでは、NULLと文字列を結合するとNULLとなる(NULL伝播という)。そのため、四則演算をしたいが、NULLカラムがある場合は、置き換えが必要。そこでCOALESCE関数を使う。
COALESCE(A, B)で「カラムAがNULLじゃなかったらその値を、NULLだったらBを返す」という感じ。例えば、以下のようなpurchaseテーブルがあるとする
purchase_id | price | coupon |
---|---|---|
100001 | 2000 | NULL |
price - discountを求めたいとき、そのまま引き算するとNULLとなる。NULLの場合は0として計算したい場合、以下のようにする
SELECT purchase_id, price, coupon, price - COALESCE(coupon, 0) AS discount_price from PURCHASE:
自己結合
二つの別々のテーブルを外部キーにより結合するだけでなく、同じテーブルを結合することができる。
SELECT * FROM employees FROM employee emp1 INNER JOIN employee emp2 ON emp1.position = emp2.position AND emp1.department <> emp2.department;
このSQLにより、employeesテーブル内で、役職は一緒だけど、部署が異なる、という人を抽出できる。行同士を細かい条件で絞り込むなどすることが可能
長いSQLの読み方
内側のSQL(サブクエリなど)から読むことと、句の処理順に読むことを意識する。