SQL4 択難易度 応用

注文の無いユーザーを出したいが 0 件になる。直したものは?

SELECT name FROM users WHERE id NOT IN(SELECT user_id FROM orders) ORDER BY name;

正答

  1. SELECT name FROM users WHERE id NOT IN (SELECT user_id FROM orders WHERE user_id IS NOT NULL) ORDER BY name;
  2. SELECT name FROM users WHERE id NOT IN (SELECT user_id FROM orders WHERE user_id <> NULL) ORDER BY name;
  3. SELECT name FROM users WHERE id NOT IN (SELECT DISTINCT user_id FROM orders) ORDER BY name;
  4. SELECT name FROM users WHERE NOT id IN (SELECT user_id FROM orders) ORDER BY name;

解説

NOT IN (1, 3, NULL) は id <> 1 AND id <> 3 AND id <> NULL と同じで、最後の NULL との比較が不明になるため、どの行も真にならず 0 件になる。サブクエリから NULL を除けば期待どおり bob が返る。選択肢 2 の user_id <> NULL は常に不明でサブクエリが空になり、全員が返ってしまう。選択肢 3 の DISTINCT は重複を除くだけで NULL は残る。NOT EXISTS を使えば NULL の影響を受けない。

参考: www.sqlite.org

subqueryinnull

この問題を含む SQL のテストを制限時間つきで解く

SQLクイズへ