以下の本の例題で分からないところがあります。
達人に学ぶSQL徹底指南書
以下の二つのテーブルがあります。
tableA
name | age | city |
---|---|---|
a | 22 | tokyo |
b | 19 | saitama |
c | 21 | chiba |
tableB
name | age | city |
---|---|---|
aa | 22 | tokyo |
bb | 23 | tokyo |
cc | tokyo | |
dd | 25 | chiba |
「tableBのtokyoの人と年齢が一致しないtableAの人」を抽出するのですが、
下記のNOT INで書いたSQLだと、一行も抽出されないことは理解できました。
SQL
1select * 2 from tableA 3 where age NOT IN 4 (select age 5 from tableB 6 where city = 'tokyo');
しかし、下記のNOT EXISTSで書いたSQLは、なぜbとcが抽出されるのか理解できません。
SQL
1select * 2 from tableA A 3 where NOT EXISTS 4 (select * 5 from tableB B 6 where A.age = B.age 7 and B.city = 'tokyo');
NOT EXISTS内の評価は、
tableAのage 22とtableBのage 22 23 NULLとがイコールかどうか比較するので、
True and False and unknown = False
となって、このNOTなのでTrueとなるのでしょうか。
しかしそうなると、tableAのage 19とtableBのage 22 23 NULLとの比較も
False and False and unknown = False
となってTrueになってしまいます。
なぜ、NOT EXISTSで書いたSQLは、bとcが抽出されるのでしょうか。
ご教示の程何卒よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー