一人前エンジニア道場

データベース設計 / 約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);

スキルセルフチェック

このレッスンの内容をどの程度理解できましたか?