問題 1
usersテーブルをcityでグループ化して、各都市名とユーザー数を取得してください
📖 解説参考資料
集計関数
複数の行をまとめて1つの値に集計する関数です。単体でも使えますが、GROUP BY と組み合わせることで真価を発揮します。
| 関数 | 意味 | 例 |
|---|---|---|
| COUNT(*) | 行数を数える | COUNT(*) → 15 |
| SUM(列) | 合計を求める | SUM(price) → 全商品の合計金額 |
| AVG(列) | 平均を求める | AVG(price) → 平均価格 |
| MAX(列) | 最大値を求める | MAX(price) → 最高価格 |
| MIN(列) | 最小値を求める | MIN(price) → 最安値 |
GROUP BY でグループ化
指定したカラムの値ごとにデータをグループ化して集計します。「都市ごとに何人いるか」「カテゴリごとの平均価格は?」といった集計が1クエリで書けます。
▼ GROUP BY city のイメージ
元のデータ(users)
田中 → 東京
鈴木 → 大阪
佐藤 → 東京
山田 → 名古屋
中村 → 東京
鈴木 → 大阪
佐藤 → 東京
山田 → 名古屋
中村 → 東京
→
GROUP BY city 後
東京 → COUNT=5
大阪 → COUNT=3
名古屋 → COUNT=2
大阪 → COUNT=3
名古屋 → COUNT=2
SELECT city, COUNT(*) AS 人数
FROM users
GROUP BY city;
⚠️ よくあるミス:SELECT に非集計カラムを混ぜる
GROUP BY city をしているのに SELECT name, city, COUNT(*) と書くのはエラーです。name はグループに複数あるため、どの値を返すか決まりません。SELECTに書けるのは「GROUP BYに指定したカラム」か「集計関数」だけです。
HAVING でグループに条件をつける
WHERE はグループ化前の絞り込み、HAVING はグループ化後の絞り込みです。「2人以上いる都市だけ表示したい」場合は HAVING を使います。
SELECT city, COUNT(*) AS 人数
FROM users
GROUP BY city
HAVING COUNT(*) >= 2;
JOIN + GROUP BY
SELECT u.city, COUNT(o.id) AS 注文数
FROM users u
JOIN orders o ON u.id = o.user_id
GROUP BY u.city
ORDER BY 注文数 DESC;
💼 実務での使いどころ
「月別の売上集計」「商品カテゴリ別の売上ランキング」「ユーザーごとの購入回数」など、ビジネスのダッシュボードやレポートはほぼすべてGROUP BYで作られています。データアナリストやマーケターが最もよく使うSQL構文です。
「月別の売上集計」「商品カテゴリ別の売上ランキング」「ユーザーごとの購入回数」など、ビジネスのダッシュボードやレポートはほぼすべてGROUP BYで作られています。データアナリストやマーケターが最もよく使うSQL構文です。