SQLのHAVING句はGROUP BY句の前に書く?正しい記述順序とWHERE句との違いを解説

Oracle

SQLを学習していると、GROUP BY句やHAVING句の記述順序について迷うことがあります。特に「HAVING句は必ずGROUP BY句より前に書かなければならないのか」「SQL文の中でどの位置に置くべきなのか」という疑問は、初心者がつまずきやすいポイントです。

この記事では、SQLのHAVING句とGROUP BY句の正しい関係、実際の記述順序、WHERE句との違いについて、具体的な例を交えながら分かりやすく解説します。

SQLにおけるHAVING句とGROUP BY句の基本的な役割

GROUP BY句は、複数のデータを指定した項目ごとにまとめて集計するために使用します。例えば、売上データを商品別や担当者別に集計するときに利用されます。

一方、HAVING句はGROUP BYによって作成されたグループに対して条件を指定するための句です。集計結果に対して「合計金額が100万円以上のグループだけ表示する」といった処理を行う場合に使用します。

つまり、GROUP BYがデータをグループ化する役割、HAVINGがグループ化後の結果を絞り込む役割を持っています。

HAVING句はGROUP BY句の前に記述する必要はない

SQL文の記述ルールとして、HAVING句をGROUP BY句より前に書く必要はありません。一般的なSQLの記述順序では、HAVING句はGROUP BY句の後に配置します。

基本的なSELECT文の構造は以下のようになります。

SELECT 列名
FROM テーブル名
WHERE 条件
GROUP BY グループ化する列
HAVING グループ条件
ORDER BY 並び順;

この順番はSQLの文法上のルールであり、HAVING句で集計結果を判定するためには、先にGROUP BYでグループを作成する必要があります。

HAVING句を使った具体的な例

例えば、以下のような売上テーブルがあるとします。

商品Aが10件、商品Bが5件、商品Cが20件販売されており、商品ごとの売上数を確認したい場合、GROUP BYを使って商品単位で集計できます。

SELECT 商品名, COUNT(*) AS 販売数
FROM 売上テーブル
GROUP BY 商品名
HAVING COUNT(*) >= 10;

このSQLでは、まず商品名ごとにデータをまとめ、その後HAVING句によって販売数が10件以上の商品だけを表示します。

もしHAVING句をGROUP BYより前に置くと、まだグループ化されていない状態なので、集計結果に対する条件指定ができません。

WHERE句とHAVING句の違い

HAVING句とよく混同されるものにWHERE句があります。どちらも条件指定に使いますが、適用されるタイミングが異なります。

WHERE句はGROUP BYで集計する前の個々の行データに対して条件を指定します。一方、HAVING句はGROUP BYで集計した後のグループに対して条件を指定します。

例えば、「2025年の売上だけを集計したい」という場合はWHERE句を使用します。

SELECT 商品名, SUM(金額)
FROM 売上テーブル
WHERE 年 = 2025
GROUP BY 商品名;

反対に、「合計売上が100万円以上の商品だけ表示したい」という場合はHAVING句を使用します。

SELECT 商品名, SUM(金額)
FROM 売上テーブル
GROUP BY 商品名
HAVING SUM(金額) >= 1000000;

SQLの実行順序ではHAVINGはGROUP BYの後に処理される

SQLの記述順序と、データベース内部で処理される順序は少し異なります。SQLは一般的に以下のような流れで処理されます。

  1. FROMで対象テーブルを取得
  2. WHEREで行を絞り込む
  3. GROUP BYでグループ化する
  4. HAVINGでグループを絞り込む
  5. SELECTで表示する列を決定
  6. ORDER BYで並び替える

この処理順序を見ると、HAVINGがGROUP BYの後に配置される理由が理解できます。HAVINGは集計後の結果を扱うため、グループ化が完了した後でなければ正しく動作しません。

まとめ

SQLでは、HAVING句をGROUP BY句より前に記述する必要はありません。むしろ一般的なSQL文法では、GROUP BY句の後にHAVING句を書くのが正しい書き方です。

GROUP BYはデータをまとめるための処理、HAVINGはまとめた結果を条件で絞り込む処理という役割の違いを理解すると、記述位置で迷うことが少なくなります。

また、WHERE句は集計前のデータを絞り込み、HAVING句は集計後の結果を絞り込むという違いを覚えておくと、SQLの条件指定を正しく使い分けられるようになります。

コメント

タイトルとURLをコピーしました