LEFT JOIN と集計 — 結合してから数える

中級122

LEFT JOIN の考え方と、JOIN した結果を GROUP BY で集計して「顧客ごと」「商品ごと」の数を出す方法を練習します。

INNER JOIN と LEFT JOIN の違い

前回の 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;

次のレッスン: サブクエリ — クエリの中のクエリ

データベースを初期化中...
SQL エディタCtrl+Enter で実行
SQL を入力して実行してください
練習問題 — 0/2 完了 (0/50pt)
customers を LEFT JOIN orders で結合し、顧客ごとの注文件数 (COUNT) を「顧客名・件数」で取得してください。
25pt
orders と products を JOIN して、商品ごとの注文合計数量 (SUM(quantity)) を「商品名・合計」で取得してください。
25pt