「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。

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では、

  1. WHEREで売上金額100円未満の明細を除外

  2. 残った行をカテゴリ別に集計

  3. 集計結果が5,000円以上のカテゴリのみ抽出

という、2段階のフィルタリングを行っています。


■ 実務でよくある HAVING句の利用シーン

以下のような場面では HAVING を使うことが多いです。

● 件数ベースの条件

→ 10件以上購入したユーザーだけ抽出する時など。

● 売上や数量の閾値チェック


→ 部署別の年間売上が一定額を超える部署だけを取得。

● 最大・最小の条件付け


→ テストで満点を取った学生のグループだけ取得。


■ まとめ:HAVING句は「集計結果に対する条件」

最後に要点をまとめます。

  • WHERE:行レベルの条件(集計前)

  • HAVING:集計後の条件(集計結果を絞り込む)

  • 集計関数(SUM、COUNT、AVGなど)を条件に使う場合は HAVING一択

  • WHEREとHAVINGを併用すると効率の良い絞り込みが可能

SQLを扱う上でこの違いは非常に重要ですので、
ぜひ実務で使い分けを意識してみてください。

Ads by Google