SQL4 択難易度 応用

次の SQL の結果は?(ann の注文 10 は paid、11 は unpaid。bob に注文は無い)

SELECT u.name, o.id AS oidFROM users u LEFT JOIN orders o ON u.id = o.user_idWHERE o.status = 'paid' ORDER BY u.id;

正答

  1. ann-10
  2. ann-10, bob-NULL
  3. ann-10, ann-11, bob-NULL
  4. ann-10, ann-11

解説

LEFT JOIN の時点では ann-10, ann-11, bob-NULL の 3 行があるが、WHERE o.status = 'paid' が後から適用される。ann-11 は unpaid なので落ち、bob の行は o.status が NULL で NULL = 'paid' は真にならないため落ちる。結果は ann-10 の 1 行だけになる。bob を残したいなら条件を ON 句に移す必要がある。選択肢 2 は WHERE が NULL 行を通すと誤解した結果。

参考: www.sqlite.org

joinleft-joinon-vs-wherenull

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

SQLクイズへ