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の動作原理
- データベースがGROUP BYカラムで同じ値を持つ行をグループ化する
- 集約関数(
COUNT、SUM、AVG、MIN、MAX)がグループごとに1つの値を計算する - 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は、レポート、分析、カテゴリ別にデータを集計するあらゆるクエリの基盤です。
ユースケース
売上分析ダッシュボードが商品カテゴリと地域ごとの売上合計を表示し、四半期の売上閾値を超えたカテゴリのみをハイライトする場面。