SQLでデータを集計するとき、WHERE句とGROUP BY、HAVING句の役割を混同してしまうことがあります。特に「GROUP BYでグループ化した後の集計結果を絞り込みたい場合、WHERE句を使うのか」という点は、SQL初心者がつまずきやすいポイントです。この記事では、WHERE句が処理するタイミングや、集計後の条件指定に使うHAVING句との違いについて、具体例を交えて解説します。
SQLのWHERE句はGROUP BY後の集計結果を絞り込むものではない
WHERE句は、GROUP BYによってグループ化される前の元データに対して条件を指定するために使用されます。つまり、集計処理が行われる前に不要な行を除外する役割があります。
SQLの基本的な処理順序では、FROMで対象テーブルを取得した後、WHEREで条件に合う行だけを残し、その後GROUP BYによってグループ化を行います。
例えば、売上テーブルから2025年以降のデータだけを対象にして、商品ごとの売上合計を求めたい場合は以下のようになります。
SELECT 商品名, SUM(金額) FROM 売上 WHERE 売上日 >= '2025-01-01' GROUP BY 商品名;
この場合、WHERE句によって2025年以前の売上データを除外してから、商品ごとの集計が行われます。
GROUP BYで作成された集計結果を絞り込む場合はHAVING句を使う
GROUP BY後の集計結果に対して条件を指定したい場合は、WHERE句ではなくHAVING句を使用します。HAVING句は、SUMやCOUNTなどの集計関数によって計算された値を条件にできます。
例えば、「商品ごとの売上合計が10万円以上の商品だけ表示したい」という場合、売上合計はGROUP BY後に計算されるためWHERE句では指定できません。
このような場合は、以下のようにHAVING句を利用します。
SELECT 商品名, SUM(金額) AS 合計売上 FROM 売上 GROUP BY 商品名 HAVING SUM(金額) >= 100000;
このSQLでは、まず商品ごとに売上をまとめ、その結果として計算された合計売上に対して条件を適用しています。
WHERE句とHAVING句の違いを具体例で比較
WHERE句とHAVING句はどちらも条件指定に使われますが、対象となるデータの段階が異なります。
| 項目 | WHERE句 | HAVING句 |
|---|---|---|
| 対象 | グループ化前の行データ | GROUP BY後の集計結果 |
| 使用できる条件 | 通常の列データ | 集計関数の結果 |
| 処理タイミング | GROUP BYの前 | GROUP BYの後 |
例えば、社員テーブルで「営業部の社員だけを対象に部署ごとの平均給与を計算する」場合はWHERE句を使います。
一方で、「部署ごとの平均給与が50万円以上の部署だけ表示する」という場合は、平均給与という集計結果を条件にするためHAVING句を使います。
SQLの実行順序を理解するとWHEREとHAVINGを判断しやすい
SQLを書くときは、記述する順番だけでなく、内部的な処理順序を理解するとWHERE句とHAVING句の使い分けが分かりやすくなります。
一般的なSQLの処理順序は以下のようになります。
- FROM:対象となるテーブルを取得
- WHERE:条件に合わない行を除外
- GROUP BY:データをグループ化
- HAVING:グループ化後の結果を条件で絞り込み
- SELECT:表示する列を決定
- ORDER BY:並び替え
この流れを覚えておくと、「まだ集計されていないデータを条件にするならWHERE」「集計後の値を条件にするならHAVING」という判断ができます。
WHERE句とHAVING句を適切に使うメリット
WHERE句で先に不要なデータを削除すると、GROUP BYで処理するデータ量が減るため、SQLの処理速度向上につながる場合があります。
例えば数百万件の売上データから特定年度だけを集計する場合、最初にWHERE句で対象期間を限定することで、データベースが処理する負荷を減らせます。
一方、HAVING句は集計結果に対する条件指定に必要です。無理にWHERE句で代用しようとすると、SQLエラーになったり、意図した結果が取得できなかったりするため注意が必要です。
まとめ
SQLのWHERE句はGROUP BYによるグループ化後の集計結果を絞り込むために使用するものではありません。WHERE句は集計前の元データを絞り込むための条件指定です。
GROUP BYで作成された集計結果に対して条件を指定したい場合は、HAVING句を使用します。SUMやCOUNT、AVGなどの集計関数の結果を条件にしたい場合はHAVING句が適しています。
SQLでは、処理される順番を理解することが重要です。「行を減らす条件はWHERE」「グループ化した結果を確認する条件はHAVING」と覚えることで、正しいSQLを組み立てられるようになります。


コメント