GROUP BYとHAVINGの考え方:SQLで集計する基本

入門 | 10分 で読める | 2026.06.17

公式ドキュメント

SQLでは、行をそのまま読むだけでなく、件数、合計、平均などを集計できます。その中心になるのが GROUP BY です。

一言でいうと

GROUP BYは、行をグループに分けて、グループごとにCOUNTやSUMを計算するための仕組みです。

集計関数

まず、代表的な集計関数を整理します。

関数意味
COUNT(*)行数を数える
SUM(col)合計する
AVG(col)平均する
MIN(col)最小値
MAX(col)最大値

たとえば、注文の件数を数えるSQLです。

SELECT COUNT(*) AS order_count
FROM orders;

GROUP BYとは

GROUP BY は、同じ値を持つ行をまとめます。

SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id;

これは、ユーザーごとの注文数を数えるSQLです。

user_idorder_count
12
21
35

GROUP BYを使うと、結果は「元の行」ではなく「グループごとの行」になります。

WHEREとHAVINGの違い

WHEREHAVING はどちらも絞り込みですが、タイミングが違います。

いつ絞るか
WHERE集計する前2026年の注文だけにする
HAVING集計した後注文数が3件以上のユーザーだけにする
SELECT user_id, COUNT(*) AS order_count
FROM orders
WHERE ordered_at >= '2026-01-01'
GROUP BY user_id
HAVING COUNT(*) >= 3;

このSQLは、2026年以降の注文だけを対象にし、その中で注文数が3件以上のユーザーを取得します。

SELECTに書ける列

GROUP BY を使うときは、SELECT に書ける列に注意が必要です。

SELECT user_id, COUNT(*)
FROM orders
GROUP BY user_id;

これは自然です。user_id ごとにまとめているため、user_id と集計結果を表示できます。

一方、グループ化していない列をそのまま出すと、どの行の値を表示すればよいか曖昧になります。

SELECT user_id, status, COUNT(*)
FROM orders
GROUP BY user_id;

このようなSQLは、多くのデータベースでエラーになります。status も表示したいなら、GROUP BY user_id, status のようにグループに含めます。

集計SQLの読む順番

集計SQLは、次の順番で読むと整理しやすいです。

  1. FROM で対象テーブルを見る
  2. WHERE で集計前に不要な行を除く
  3. GROUP BY でグループを作る
  4. SELECT でグループごとの値を出す
  5. HAVING で集計後に絞る
  6. ORDER BY で並べる

よくある誤解

誤解実際
WHERE COUNT(*) >= 3 と書ける集計結果の条件は HAVING に書きます
GROUP BY は並び替えグループ化であり、並び替えは ORDER BY です
COUNT(col)COUNT(*) は常に同じCOUNT(col) はNULLを数えません
SELECTに何でも列を書けるグループ化していない列は扱えません

まとめ

GROUP BY は、行をグループに分けて集計するために使います。WHERE は集計前の絞り込み、HAVING は集計後の絞り込みです。集計SQLは、元の行を見るのではなく、グループごとの結果を見るものとして考えると理解しやすくなります。

参考リソース

← 一覧に戻る
PR
PR
PR
PR