指摘・レビュー4 択難易度 応用

注文の無いユーザーを出したい。このSQLへの指摘として正しいものは?

SELECT * FROM usersWHERE id NOT IN (SELECT user_id FROM orders);

正答

  1. IN の中のサブクエリには AS で別名を付けないとエラーになる
  2. SQLite では NOT IN が使えないので NOT EXISTS に書き換える
  3. user_id に NULL があると 1 行も返らない。除外するか NOT EXISTS にする
  4. IN のサブクエリは 1 行しか返せないので、注文が複数あるとエラーになる

解説

x NOT IN (1, NULL) は「x <> 1 かつ x <> NULL」と同じで、後半が NULL になるため全体が真にならない。user_id が NULL の注文(ゲスト購入など)が 1 件でもあると結果が空になる。WHERE user_id IS NOT NULL を足すか、NOT EXISTS で書くと安全。NOT IN は SQLite でも使え、IN のサブクエリは複数行を返してよいので 2・4 番目は誤り。

参考: www.sqlite.org

sqlnullsubquery

この問題を含む 指摘・レビュー のテストを制限時間つきで解く

指摘・レビュークイズへ