[読書] 達人に学ぶSQL徹底指南書 初級者で終わりたくないあなたへ
SQLを業務で使用することが多く、本のタイトルでもあるように
初級者で終わりたくないと感じたため、この本を手にとった。
内容を忘れないように個人的に重要だと感じた箇所をまとめた
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を書く上で、動けばいい、効率こそすべてという考え方ではなく
未来の自分は他人と思って、可読性の高いコーディング重要。
この記事が気に入ったらサポートをしてみませんか?