SQLで集計処理を行う際に必ず出てくるのが WHERE句 と HAVING句 の違いです。
どちらも「条件を絞り込む」ための構文ですが、役割が明確に異なります。
この記事では、 HAVING句を使うべきケース と WHEREとの使い分け をわかりやすく解説します。
■ WHERE句とHAVING句の決定的な違い
結論からいうと、両者の違いは次の通りです。
| 句 | 処理されるタイミング | 主に利用する条件 |
|---|---|---|
| WHERE | グループ化(GROUP BY)する「前」 | 行レベルの条件(行そのものを除外したいとき) |
| HAVING | グループ化(GROUP BY)した「後」 | 集計結果に対する条件(SUMやCOUNTなどの結果を絞りたいとき) |
つまり、
-
行を絞りたい → WHERE
-
集計結果を絞りたい → HAVING
という使い分けになります。
■ WHERE句が使われる場面
WHERE句は、テーブルの各行に対して条件を適用したいときに使用します。
たとえば「売上が1,000円以上の商品だけを対象に集計したい」など、
集計前に除外するレコードを決めたい場合に使います。
● 使用例(WHERE句)
このSQLは、
-
売上明細の各行をチェック
-
売上金額が1000円未満ならその行は集計対象外
-
残った行だけカテゴリ別に合計
という流れになります。
■ HAVING句が使われる場面
HAVING句は GROUP BYで集計した後に、集計結果に対して条件をつけたい場合 に使います。
例えば、
-
“カテゴリ別売上合計が 10,000円を超えるカテゴリだけ” 表示したい
-
COUNTした件数が一定数以上のグループだけ欲しい
というような条件は、行そのものではなく「集計結果」に対する条件なので WHERE では書けません。
● 使用例(HAVING句)
このSQLでは、
-
まずカテゴリごとに集計(SUM)
-
その集計結果が 10,000円を超えるカテゴリだけを抽出
という処理になります。
■ WHERE で書けない条件は HAVING で書く
次のような条件は WHERE ではエラーになります。
❌ WHERE句ではエラーとなる例
SUMは集計後にしか存在しないため、WHEREでは参照できません。
このような場合に HAVING を使います。
■ WHERE と HAVING を併用するケース
WHERE と HAVING はどちらか一方しか使えないわけではなく、
必要に応じて両方使うことも一般的です。
● 実用例
このSQLでは、
-
WHEREで売上金額100円未満の明細を除外
-
残った行をカテゴリ別に集計
-
集計結果が5,000円以上のカテゴリのみ抽出
という、2段階のフィルタリングを行っています。
■ 実務でよくある HAVING句の利用シーン
以下のような場面では HAVING を使うことが多いです。
● 件数ベースの条件
→ 10件以上購入したユーザーだけ抽出する時など。
● 売上や数量の閾値チェック
→ 部署別の年間売上が一定額を超える部署だけを取得。
● 最大・最小の条件付け
→ テストで満点を取った学生のグループだけ取得。
■ まとめ:HAVING句は「集計結果に対する条件」
最後に要点をまとめます。
-
WHERE:行レベルの条件(集計前)
-
HAVING:集計後の条件(集計結果を絞り込む)
-
集計関数(SUM、COUNT、AVGなど)を条件に使う場合は HAVING一択
-
WHEREとHAVINGを併用すると効率の良い絞り込みが可能
SQLを扱う上でこの違いは非常に重要ですので、
ぜひ実務で使い分けを意識してみてください。
