データベース設計 / 約20分
集計とGROUP BY: データを「まとめて」見る
なぜこれを学ぶか
「ステータスごとの注文数は?」「月ごとの売上は?」——ビジネスの問いの多くは「まとめて数える」処理です。GROUP BY と集計関数は、エンジニアがビジネス側と対話するための共通言語です。
集計関数: COUNT(*)(件数)、SUM(列)(合計)、AVG(列)(平均)、MAX/MIN(最大/最小)。SELECT COUNT(*) FROM orders で全件数が取れます。
GROUP BY は「グループごとに集計する」指示です: SELECT status, COUNT(*) FROM orders GROUP BY status で「ステータスごとの件数」になります。
SELECT に書けるのは「GROUP BY に指定した列」か「集計関数」だけです。グループ化していない列(例: 個々の amount)を混ぜると、意味が曖昧になりエラーになるDBがほとんどです。
WHERE と HAVING の違いが重要です: WHERE は「グループ化する前の行」を絞り、HAVING は「グループ化した後の結果」を絞ります。「注文数2件以上のステータスだけ」は HAVING の仕事です。
実行の論理順序を意識しましょう: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。WHERE に集計関数は書けない、と覚えると間違いが減ります。
重要ポイント
- COUNT / SUM / AVG / MAX / MIN が集計の基本5本
- GROUP BY でグループごとに集計
- 絞込は「前」ならWHERE、「集計後」ならHAVING
理解度チェック
選ぶと即座に解説が表示されます。
「注文数が2件以上のステータスだけ」を取得したい。条件はどこに書く?
ヒントを見る
「注文数(COUNT)」はグループ化した「後」に分かる値です。グループ化後の結果を絞る専用の句があります。
SQL演習ブラウザ内SQLite
orders テーブルから「ステータス(status)ごとの注文数」を、注文数の多い順に取得してください。ただし注文数が2件以上のステータスのみ対象とします(HAVING を使用)。列は status と注文数(count)です。
テーブル定義と初期データを見る
CREATE TABLE orders (id INTEGER PRIMARY KEY, status TEXT, amount INTEGER);INSERT INTO orders VALUES
(1, 'shipped', 3000), (2, 'pending', 1500), (3, 'shipped', 2000),
(4, 'cancelled', 4500), (5, 'shipped', 800), (6, 'pending', 2300),
(7, 'shipped', 1200), (8, 'pending', 900);スキルセルフチェック
このレッスンの内容をどの程度理解できましたか?