今回の課題・得点と最高完了得点をこのブラウザに保存します。SQL入力・実行結果・教材DBへの変更は再読み込みで戻ります。誤答やヒントによる減点はありません。
最高完了得点: 0 / 50pt
LEFT JOIN と集計 — 結合してから数える
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;
次のレッスン: サブクエリ — クエリの中のクエリ
結果は1000行まで・実行は30秒まで。中止・リセットは教材への変更だけを破棄し、入力SQLと進捗は残します。
教材DBを初期化しています。