今回の課題・得点と最高完了得点をこのブラウザに保存します。SQL入力・実行結果・教材DBへの変更は再読み込みで戻ります。誤答やヒントによる減点はありません。

最高完了得点: 0 / 50pt

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

中級約12分2問

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;

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

教材DBを初期化中...
SQL エディタCtrl / ⌘ + Enter で実行 · Esc → Tab で移動

結果は1000行まで・実行は30秒まで。中止・リセットは教材への変更だけを破棄し、入力SQLと進捗は残します。

教材DBを初期化しています。

SQL を入力して実行してください
練習問題 — 0/2 完了 (0/50pt)
▶
customers を LEFT JOIN orders で結合し、顧客ごとの注文件数 (COUNT) を「顧客名・件数」で取得してください。
列の順序: name → 別名自由。行の順序は自由です。
25pt
○
orders と products を JOIN して、商品ごとの注文合計数量 (SUM(quantity)) を「商品名・合計」で取得してください。
25pt