JOINは、通常は外部キーである条件で一致させて、2つのテーブルの行を結合します。joinの種類が、もう一方の側に一致がない行をどう扱うかを決めます。
JOINは、通常は外部キーである条件で一致させて、2つのテーブルの行を結合します。joinの種類が、もう一方の側に一致がない行をどう扱うかを決めます。
NULLになります。-- customers(id, name) orders(id, customer_id, total)
-- INNER: only customers who have at least one order
SELECT c.name, o.total
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id;
-- LEFT: every customer, even those with zero orders (total = NULL)
SELECT c.name, o.total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- Classic use: find customers with NO orders
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL; -- the LEFT JOIN's NULL side reveals the gap
WHEREで右テーブルをフィルタする(例: WHERE o.total > 100)と、NULL > 100が偽になるため、LEFT JOINが気づかぬうちにINNER JOINに戻ってしまいます。一致しない行を残したい場合は、そうした条件をON句に置いてください。実際のクエリの多くは複数のテーブルにまたがり、誤ったjoinの種類は静かに行を落としたり重複させたりします。これはもっともらしい結果を返すバグです。LEFT JOIN + IS NULLが「欠けている」行を見つけること、そしてnull側へのWHEREがLEFTを打ち消すことを知っていれば、レポート処理の誤り一群を防げます。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する