← ブログ一覧に戻る
GROUP BYとHAVINGの使い分け完全ガイド
更新:

GROUP BYとHAVINGの使い分け完全ガイド

GROUP BYとは

GROUP BYは、指定したカラムの値が同じ行をひとまとめにして集計する命令です。「部署ごとの人数」「月ごとの売上」など、グループ別の集計をするときに使います。

-- 部署ごとの社員数を集計
SELECT department, COUNT(*) AS cnt
FROM employees
GROUP BY department;

実際にGROUP BYを書いて動かしてみよう

SQLLearnでは集計・GROUP BYの練習問題をブラウザ上で今すぐ実行できます。

無料で今すぐ練習する →

よく使う集計関数

  • COUNT(*):行数を数える
  • SUM(カラム):合計値
  • AVG(カラム):平均値
  • MAX(カラム):最大値
  • MIN(カラム):最小値
SELECT department, AVG(salary) AS avg_salary, MAX(salary) AS max_salary
FROM employees
GROUP BY department;

HAVINGとは

HAVINGは、GROUP BYで集計した結果に対して条件を絞り込む命令です。

-- 社員数が3人以上の部署だけを取得
SELECT department, COUNT(*) AS cnt
FROM employees
GROUP BY department
HAVING COUNT(*) >= 3;

WHEREとHAVINGの違い(最重要)

  • WHERE:グループ化するに絞り込む(元データのフィルタリング)
  • HAVING:グループ化したに絞り込む(集計結果のフィルタリング)
-- 「営業部」を除いた上で、3人以上の部署を取得
SELECT department, COUNT(*) AS cnt
FROM employees
WHERE department != '営業部'
GROUP BY department
HAVING COUNT(*) >= 3;

SQLの実行順序

  1. FROM(テーブルを参照)
  2. WHERE(グループ化前に絞り込み)
  3. GROUP BY(グループ化)
  4. HAVING(グループ化後に絞り込み)
  5. SELECT
  6. ORDER BY

WHEREはGROUP BYより先に実行されるため、集計関数(COUNT等)はWHEREの中では使えません。

-- ❌ エラーになる
WHERE COUNT(*) >= 3

-- ✅ 正しい書き方
HAVING COUNT(*) >= 3

GROUP BYのルール

SELECTに書くカラムは、GROUP BYに含めるか集計関数で包む必要があります。

-- ❌ エラー
SELECT department, name, COUNT(*)
FROM employees
GROUP BY department;

-- ✅ 正しい
SELECT department, COUNT(*)
FROM employees
GROUP BY department;

GROUP BY・HAVINGの練習問題に挑戦しよう

SQLLearnのGROUP BYレッスンでは、実際のデータを集計しながら段階的に学べます。ブラウザだけで今すぐ無料でスタートできます。

無料で今すぐ練習する →