次の 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;正答
- ann-10
- ann-10, bob-NULL
- ann-10, ann-11, bob-NULL
- 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
この問題を含む SQL のテストを制限時間つきで解く
SQLクイズへ