メインコンテンツへ
データベース

「注文をしたことがない顧客」を取得するSQL文として正しいものはどれか。

ア.SELECT * FROM 顧客 WHERE NOT EXISTS (SELECT * FROM 注文 WHERE 注文.顧客ID = 顧客.顧客ID)正解
イ.SELECT * FROM 顧客 WHERE 顧客ID NOT IN (SELECT MAX(顧客ID) FROM 注文)
ウ.SELECT * FROM 顧客 LEFT JOIN 注文 ON 顧客.顧客ID = 注文.顧客ID WHERE 注文.顧客ID IS NOT NULL
エ.SELECT * FROM 顧客 WHERE EXISTS (SELECT * FROM 注文 WHERE 注文.顧客ID != 顧客.顧客ID)

解説

NOT EXISTSは「引き出しに何も入っていない人を探す」検索。その顧客に対応する注文が存在しないことを確認する。

なぜ ア が正解か

NOT EXISTS (SELECT * FROM 注文 WHERE 注文.顧客ID = 顧客.顧客ID) は、各顧客についてその顧客IDを持つ注文レコードが存在しない場合にTRUEを返す。これが「注文をしたことがない顧客」の正確な定義。

なぜ イ は間違いか

NOT IN (SELECT MAX(顧客ID) FROM 注文) は最大顧客IDのみを除外するため、ほぼすべての顧客が返ってしまう誤り。

なぜ ウ は間違いか

LEFT JOINしてWHERE 注文.顧客ID IS NOT NULLは「注文がある顧客」を取得する。NOTが逆。

なぜ エ は間違いか

EXISTS (SELECT * FROM 注文 WHERE 注文.顧客ID != 顧客.顧客ID) は「他の顧客の注文が存在する」という意味で全顧客がほぼ該当する誤り。

出典: AI生成問題(学習用)