"商品"表,"在庫"表に対する次のSQL文の結果と同じ結果が得られるSQL文はどれか。
ここで,(主キー)を付けた項目は主キーを表す。
SELECT 商品番号 FROM 商品
WHERE 商品番号 NOT IN (SELECT 商品番号 FROM 在庫)
商品表:商品番号(主キー)|商品名|単価
在庫表:倉庫番号(主キー)|商品番号(主キー)|在庫数
SELECT 商品番号 FROM 在庫
WHERE EXISTS (SELECT 商品番号 FROM 商品) SELECT 商品番号 FROM 在庫
WHERE NOT EXISTS (SELECT 商品番号 FROM 商品) SELECT 商品番号 FROM 商品
WHERE EXISTS (SELECT 商品番号 FROM 在庫
WHERE 商品.商品番号 = 在庫.商品番号) SELECT 商品番号 FROM 商品
WHERE NOT EXISTS (SELECT 商品番号 FROM 在庫
WHERE 商品.商品番号 = 在庫.商品番号) 購入状況を確認しています… 正答 4
解説 正解は4です。
NOT INを使った副問合せと同じ結果になるSQL文を選ぶ問題です。
元のSQL文は、商品表の商品番号のうち、在庫表に現れない商品番号を取り出します。
これは、在庫表に対応する行が存在しない商品を選ぶことと同じです。
問題文の表では、商品表は商品番号、在庫表は倉庫番号と商品番号の組が主キーです。
在庫表の商品番号は主キーの一部なので、NULL(空値)になることはありません。
そのため、NOT INとNOT EXISTSの結果が食い違うことはありません。
【選択肢別解説】
1:× 副問合せが外側の表と関連付けられていないので、商品表に1行でもあればEXISTSは常に真になります。
結果は在庫表のすべての商品番号になり、在庫がある商品を返してしまいます。
2:× 副問合せが外側と関連付けられていないので、商品表に1行でもあればNOT EXISTSは常に偽になります。
結果は何も返らず、元のSQL文と一致しません。
3:× 商品番号を条件に関連付けた相関副問合せですが、EXISTSなので在庫表に対応する行がある商品を返します。
元のSQL文とは逆の結果になります。
4:○ 商品表の各行について、同じ商品番号の行が在庫表に存在しないときだけ選びます。
在庫表に現れない商品番号を返すので、NOT INと同じ結果になります。
【ポイント】
EXISTSは副問合せの結果が1行以上あれば真、NOT EXISTSは0行なら真になります。
外側の表の列を副問合せの条件に使う形を相関副問合せといいます。
副問合せの列にNULLが含まれると、NOT INは1行も返さなくなるので注意が必要です。