SQL GROUP BYとHAVING句

SQL GROUP BYでデータをグループ化して集約し、HAVINGでグループ化結果をフィルタリングする方法を学びます。COUNT、SUM、AVGとグルーピングを解説します。

Query

詳細な説明

SQL GROUP BYとHAVING句

GROUP BY は指定したカラムの値が同じ行をサマリー行に集約し、集約計算を可能にします。HAVING は集約後にグループをフィルタリングする句で、WHERE が個々の行をフィルタリングするのと同様の役割を持ちます。

基本構文

SELECT department, COUNT(*) AS employee_count, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING COUNT(*) >= 5;

GROUP BYの動作原理

  1. データベースがGROUP BYカラムで同じ値を持つ行をグループ化する
  2. 集約関数(COUNTSUMAVGMINMAX)がグループごとに1つの値を計算する
  3. SELECTの非集約カラムはGROUP BYに含まれている必要がある(標準SQLの要件)

WHEREとHAVINGの違い

  • WHERE はグルーピングのに個々の行をフィルタリングする
  • HAVING は集約のにグループをフィルタリングする
SELECT category, SUM(revenue) AS total_revenue
FROM sales
WHERE sale_date >= '2025-01-01'
GROUP BY category
HAVING SUM(revenue) > 10000;

複数カラムによるグルーピング

SELECT year, quarter, region, SUM(sales) AS total
FROM revenue
GROUP BY year, quarter, region
ORDER BY year, quarter;

year、quarter、regionの一意な組み合わせごとに個別のグループが形成されます。

式によるグルーピング

SELECT
  EXTRACT(YEAR FROM order_date) AS order_year,
  EXTRACT(MONTH FROM order_date) AS order_month,
  COUNT(*) AS order_count
FROM orders
GROUP BY EXTRACT(YEAR FROM order_date), EXTRACT(MONTH FROM order_date);

よくある落とし穴

  • SELECTにGROUP BYや集約関数に含まれないカラムを指定すると、厳密なSQLモードではエラーになる
  • GROUP BY なしで HAVING を使用すると、結果全体が1つのグループとして扱われる
  • 集約でない条件をWHEREではなくHAVINGに記述すると、フィルタリング前にすべての行が処理されるためパフォーマンスが低下する

GROUP BYとHAVINGは、レポート、分析、カテゴリ別にデータを集計するあらゆるクエリの基盤です。

ユースケース

売上分析ダッシュボードが商品カテゴリと地域ごとの売上合計を表示し、四半期の売上閾値を超えたカテゴリのみをハイライトする場面。

Try It — SQL Formatter

フルツールを開く