[読書] 達人に学ぶSQL徹底指南書 初級者で終わりたくないあなたへ

SQLを業務で使用することが多く、本のタイトルでもあるように
初級者で終わりたくないと感じたため、この本を手にとった。

内容を忘れないように個人的に重要だと感じた箇所をまとめた

https://www.amazon.co.jp/達人に学ぶSQL徹底指南書-第2版-初級者で終わりたくないあなたへ-CodeZine-BOOKS/dp/4798157821

2値論理と3値論理

プログラミング言語では、真理値型:true, false の2値論理が使われるが、
SQLの場合は、これに unknown という第三の値を持ち、
3値論理という論理体系が使われる。

これにより、直感に反したトリッキーな動作を見せることがある。

▫️真理値の優先順位
・AND の場合 : false > unknown > true
・OR の場合 :   true > unknown > false

例えば、true AND unknown の場合、結果は unknown になる。

例. NOT IN のサブクエリで使用されるテーブルの選択列にNULLが存在する場合、結果が返らない

テーブルAの列aに (1、2、3) のデータ
テーブルBの列bに (1、2、NULL) のデータ

テーブルBに存在していないテーブルAのデータが欲しい

SELECT * FROM A
WHERE a NOT IN (SELECT b FROM B ※BにはNULLが存在)

WHERE a NOT IN (1, 2, NULL)

WHERE NOT(a = 1 OR a = 2 OR a = NULL)
↓ド・モルガンの法則
WHERE (NOT(a = 1) AND NOT(a = 2) AND NOT(a = NULL))

WHERE (NOT(a = 1) AND NOT(a = 2) AND unknown)
↓unknown を含む AND条件の場合、false or unknown になる
WHERE false or unknown

よって、どの場合でも結果が返らない。
EXISTS は 結果を true or false で返すので、今回の場合、3が返される。

union より、union all の方がパフォーマンスが良い

union は重複行を削除し、union all は重複行を削除しない。
重複行を削除するために、union はソートを発生させるので
パフォーマンスが落ちるため、重複を気にしなくていい場合、
union all を使う方が良い。

INより、EXISTS の方がパフォーマンスが良い

▫️理由
・もし結合キーにインデックスが張られていれば、実表は見に行かず、
 インデックスを参照するだけで済む
・(NOT) EXISTSは1行でも条件に合致する行を見つけたら、
 そこで検索を打ちきるため、全表検索の必要がない。
 INの場合、サブクエリから実行し、ワークテーブルに格納して
 そのワークテーブルを全件走査する。

複合インデックスの場合、その列の順番で条件を記述する

複合インデックスに対して、条件の記述の順番を
その列の順番で記述しないと、インデックスが利用できず
パフォーマンスが落ちる。

KISS (Keep It Short & Simple)

SQLを書く上で、動けばいい、効率こそすべてという考え方ではなく
未来の自分は他人と思って、可読性の高いコーディング重要。

この記事が気に入ったらサポートをしてみませんか?