LEFT JOIN の考え方と、JOIN した結果を GROUP BY で集計して「顧客ごと」「商品ごと」の数を出す方法を練習します。
前回の JOIN(= INNER JOIN)は、 両方のテーブルに一致がある行だけ を返します。
LEFT JOIN は、 左のテーブルの行を すべて残し、 右に一致がなければ
その部分を NULL で埋めます。
SELECT c.name, o.id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
もし 一度も注文していない顧客がいれば、 その人も結果に残り、 o.id が NULL になります。
(INNER JOIN だと 注文のない顧客は 消えてしまいます。)
「注文が 0 件の顧客も 含めて 一覧したい」ようなときに LEFT JOIN が効きます。
JOIN の 本領は、 GROUP BY と 組み合わせたときに 発揮されます。
「顧客ごとの注文件数」を 出してみましょう。
SELECT c.name, COUNT(o.id) AS cnt
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.id;
- LEFT JOIN なので 注文 0 件の顧客も 残る
- COUNT(o.id) は NULL を数えない ので、 注文 0 件なら 0 になる
COUNT(*) ではなく COUNT(o.id) にするのがポイントです。 COUNT(*) は
NULL の行も 1 と数えてしまい、 注文 0 件が 1 件に見えてしまいます。
同じ考え方で、 商品側から 集計もできます。
SELECT p.name, SUM(o.quantity) AS total
FROM products p
JOIN orders o ON o.product_id = p.id
GROUP BY p.id;
次のレッスン: サブクエリ — クエリの中のクエリ