📌 結論から理解する
GROUP BY=「集計の単位を決める」
GROUP BYは、指定した列の値が同じ行をグループにまとめて集計関数(SUM・COUNT・AVGなど)を適用するための命令です。
「カテゴリ別の売上合計」「部署別の人数」など、「〇〇別」の集計に使います。
GROUP BYの動作イメージ
元テーブル(orders)
| order_id | category | amount |
|---|---|---|
| 1 | PC | 89,800 |
| 2 | 周辺機器 | 3,200 |
| 3 | PC | 72,000 |
| 4 | 周辺機器 | 7,500 |
| 5 | PC | 15,000 |
→
GROUP BY category
| category | COUNT(*) | SUM(amount) |
|---|---|---|
| PC | 3 | 176,800 |
| 周辺機器 | 2 | 10,700 |
GROUP BYの重要ルール
-- 正しいSQL
SELECT category, COUNT(*), SUM(amount)
FROM orders
GROUP BY category;
-- ❌ エラーになるSQL
SELECT category, order_id, SUM(amount) -- order_idはGROUP BYにない!
FROM orders GROUP BY category;
SELECT category, COUNT(*), SUM(amount)
FROM orders
GROUP BY category;
-- ❌ エラーになるSQL
SELECT category, order_id, SUM(amount) -- order_idはGROUP BYにない!
FROM orders GROUP BY category;
重要ルール: SELECTリストに書ける列は
① GROUP BYに指定した列
② 集計関数でラップした列
以外はエラーになる!
① GROUP BYに指定した列
② 集計関数でラップした列
以外はエラーになる!
GROUP BYとWHEREの組み合わせ
-- WHERE → GROUP BY の順序
SELECT category, SUM(amount) AS total
FROM orders
WHERE order_date >= '2024-01-01' -- グループ化前に行を絞り込む
GROUP BY category;
SELECT category, SUM(amount) AS total
FROM orders
WHERE order_date >= '2024-01-01' -- グループ化前に行を絞り込む
GROUP BY category;
WHEREでグループ化前の行を絞り込み→GROUP BYで集計。グループ化後に絞り込むのはHAVINGを使います。
「GROUP BY後にSELECTできる列は?」→GROUP BY列と集計関数のみ。これが試験頻出ルール。
🧠 確認クイズ
Q1. GROUP BY使用時にSELECTリストに書けないのはどれか?
Q2. WHEREとGROUP BYの処理順序として正しいのはどれか?
Q3. 部署ごとの平均給与を求めるSQLとして正しいのはどれか?