“商品”表,“在庫”表に対する次の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文は、在庫表に一度も現れない商品番号、つまり在庫のない商品の商品番号を商品表から取り出します。
【選択肢別解説】
1:× 在庫表から商品番号を取り出しており、相関条件のないEXISTSは商品表に1行でもあれば常に真になります。
結果は在庫表の全商品番号となり、在庫のない商品は得られません。
2:× 相関条件のないNOT EXISTSは、商品表に1行でもあれば常に偽になります。
結果は空になり、元のSQL文と一致しません。
3:× 商品表の各行について、同じ商品番号の在庫が存在する場合に取り出します。
在庫のある商品が得られるので、元のSQL文と逆の結果です。
4:○ 商品表の各行について、同じ商品番号の在庫が存在しない場合に取り出します。
在庫表に現れない商品番号が得られ、元のSQL文と同じ結果になります。
【ポイント】
「〜に含まれないもの」はNOT INでもNOT EXISTSでも書けます。
NOT EXISTSで書くときは、外側の表と副問合せの表を結ぶ相関条件(商品.商品番号=在庫.商品番号)が必要です。