WHEREとHAVINGの違いとは?SQL初心者が混同しやすい使い分けを実務例でわかりやすく解説
結論から言うと、WHEREは「データを集計する前に絞り込む」、HAVINGは「集計した後の結果を絞り込む」ために使用します。
SQLを学び始めると、「WHEREとHAVINGは何が違うの?」「どちらも条件を指定するなら同じでは?」と疑問に感じる方が多くいます。しかし、この2つはSQLが処理されるタイミングが異なるため、使い方を間違えるとエラーになったり、期待した検索結果が得られなかったりします。
この記事では、IT業務に従事する初心者向けに、WHEREとHAVINGの違い、実務での使い分け、よくあるトラブルや確認方法まで詳しく解説します。
WHEREとは
集計する前のデータを絞り込む
WHEREは、テーブルから取得したデータを集計する前に条件を指定するための句です。
例えば、「営業部の社員だけ取得する」「価格が1,000円以上の商品だけ表示する」といった検索で使用します。
イメージ
全社員100人の中から営業部30人だけを抽出し、その30人を集計すると考えるとわかりやすいでしょう。
HAVINGとは
集計後の結果を絞り込む
HAVINGは、GROUP BYで集計した結果に対して条件を指定するための句です。
例えば、「社員数が10人以上の部署だけ表示する」「売上合計が100万円以上の店舗だけ表示する」といった集計結果の絞り込みに使用します。
イメージ
まず部署ごとの社員数を集計し、その後で「社員数が10人以上」という条件で絞り込みます。
WHEREとHAVINGの違い
| 項目 | WHERE | HAVING |
|---|---|---|
| 処理タイミング | 集計前 | 集計後 |
| 対象 | 各レコード | 集計結果 |
| GROUP BY | 不要 | 通常は一緒に使用する |
| 集計関数 | 基本的に使用できない | 使用できる |
| 用途 | データの抽出 | 集計結果の抽出 |
SQLの処理順序を理解しよう
WHEREとHAVINGの違いを理解するには、SQLがどの順番で処理されるかを知ることが重要です。
- FROM(テーブルを取得)
- WHERE(条件で絞り込む)
- GROUP BY(グループ化する)
- HAVING(集計結果を絞り込む)
- SELECT(表示する項目を決定する)
- ORDER BY(並び替える)
この順番を覚えておくと、WHEREで集計関数が使えない理由も理解しやすくなります。
実際のIT現場でよくある利用例
WHEREを使う場面
- 退職していない社員だけ取得する。
- 営業部の社員だけ表示する。
- 価格が1万円以上の商品を検索する。
- 今日のログだけ取得する。
HAVINGを使う場面
- 社員数が10人以上の部署を表示する。
- 売上合計が100万円以上の店舗を抽出する。
- 注文数が50件以上の商品を表示する。
- アクセス数が多いページだけ表示する。
実行結果の違い
社員テーブル
| 社員名 | 部署 |
|---|---|
| 田中 | 営業 |
| 佐藤 | 営業 |
| 鈴木 | 総務 |
| 高橋 | 営業 |
WHEREの例
営業部だけを抽出してから集計するため、営業部以外のデータは最初から対象外になります。
HAVINGの例
まず部署ごとの人数を集計し、その後で「人数が3人以上の部署だけ表示する」といった条件を指定できます。
初心者が混乱しやすいポイント
| よくある勘違い | 実際 |
|---|---|
| WHEREでもCOUNTを使える | 基本的に使用できない |
| HAVINGはWHEREの代わりになる | 役割が異なる |
| GROUP BYがなくてもHAVINGだけ使えばよい | 集計用途で使うのが一般的 |
| 結果はどちらでも同じ | 処理タイミングが異なるため変わることがある |
なぜWHEREで集計関数は使えないのか
WHEREが実行される時点では、まだGROUP BYによる集計が終わっていないためです。
例えばCOUNTやSUM、AVGなどの集計結果はまだ存在しないため、WHEREでは参照できません。
集計結果を条件にしたい場合はHAVINGを使用します。
実務でよくあるトラブル
集計関数をWHEREで使用してエラーになる
初心者が最も多く経験するミスです。COUNTやSUMを条件にしたい場合はHAVINGへ変更しましょう。
取得件数が想定と違う
WHEREで絞り込んでから集計するのか、集計後にHAVINGで絞り込むのかによって結果が変わります。
パフォーマンスが低下する
必要なデータをWHEREで先に絞り込まず、大量データを集計してからHAVINGで条件指定すると処理時間が長くなることがあります。
原因の切り分け方法
- WHEREとHAVINGを使い分けているか確認する。
- GROUP BYが正しく指定されているか確認する。
- 集計関数の使用箇所を確認する。
- 集計前と集計後の件数を比較する。
- 実行結果が仕様通りか確認する。
GUIでの確認方法
- SQL Server Management Studio(SSMS)
- MySQL Workbench
- Oracle SQL Developer
- pgAdmin
- DBeaver
まずWHEREまで実行し、その後GROUP BY、HAVINGを追加して結果を比較すると処理の流れを理解しやすくなります。
CUIでの確認方法
SQLクライアントから各段階のSQLを実行し、件数の変化を確認します。
WHEREあり・なし、HAVINGあり・なしで結果を比較すると、条件の違いが把握しやすくなります。
ログの確認方法
SQLエラーが発生した場合は、アプリケーションログやデータベースログを確認します。
「集計関数はWHEREでは使用できない」といったエラーメッセージが記録されている場合があります。
初心者がやりがちなミス
- COUNTやSUMをWHEREで使用する。
- HAVINGだけでデータを絞り込もうとする。
- GROUP BYを書き忘れる。
- SQLの処理順序を理解していない。
- 実行結果を確認せずにSQLを修正する。
現場で評価される確認手順
- まずWHEREだけで取得件数を確認する。
- GROUP BYを追加して集計結果を確認する。
- 最後にHAVINGで条件を追加する。
- 期待件数と一致するか確認する。
- 実行計画も確認し、性能に問題がないか確認する。
業務で上司へ報告するポイント
- WHEREとHAVINGのどちらを使用したか。
- GROUP BYの内容。
- 取得件数。
- 期待結果との差異。
- 集計条件。
- 影響範囲。
エスカレーションするタイミング
- SQLの結果が仕様と一致しない。
- 集計ロジックが不明である。
- 性能改善が必要。
- 大量データの集計で処理時間が長い。
- 本番環境のSQLを変更する必要がある。
影響範囲を確認するポイント
| 確認対象 | 確認内容 |
|---|---|
| 画面表示 | 件数や集計結果が正しいか |
| 帳票 | 集計結果に誤りがないか |
| バッチ処理 | 集計ロジックへの影響 |
| BIツール | 分析結果が変わらないか |
筆者が現場で経験した事例
売上集計のSQLを確認した際、店舗ごとの売上件数を抽出したいにもかかわらず、COUNTの条件がWHERE句に記述されていました。そのためSQLはエラーとなり、帳票が出力できない状態でした。
COUNTの条件をHAVINGへ変更し、不要なデータはWHEREで事前に絞り込むよう修正したところ、正常に集計できるようになりました。
この経験から、WHEREは「集計前」、HAVINGは「集計後」という処理順序を理解しておくことが、SQL作成だけでなく障害対応にも役立つと実感しました。
応用知識
実務では、WHEREとHAVINGを組み合わせて使用するケースが非常に多くあります。
例えば、まずWHEREで「今年の売上データ」だけに絞り込み、その後GROUP BYで店舗ごとに集計し、最後にHAVINGで「売上合計が500万円以上の店舗」だけ表示するといった使い方です。
不要なデータをWHEREで除外してから集計することで、処理時間の短縮につながる場合もあります。
関連するIT用語
- SQL(Structured Query Language)
- SELECT
- FROM
- WHERE
- GROUP BY
- HAVING
- ORDER BY
- COUNT
- SUM
- AVG
- MAX
- MIN
- データベース(Database)
よくある質問(FAQ)
HAVINGだけ使うことはできますか?
使用できるデータベースもありますが、HAVINGは集計結果を対象とするため、GROUP BYと組み合わせて使用するのが一般的です。
WHEREでもSUMは使えますか?
基本的に使用できません。SUMなどの集計関数を条件にする場合はHAVINGを使用します。
WHEREとHAVINGを同時に使えますか?
はい。同時に使用できます。実務ではWHEREで事前にデータを絞り込み、HAVINGで集計結果をさらに絞り込む使い方がよくあります。
どちらを使うことが多いですか?
WHEREはほとんどの検索SQLで使用されます。HAVINGは部署別集計や売上分析など、GROUP BYを利用する集計処理で使用されることが多いです。
まとめ
WHEREとHAVINGはどちらも条件を指定する句ですが、処理されるタイミングが異なります。
- WHEREは集計前のデータを絞り込む。
- HAVINGは集計後の結果を絞り込む。
- 集計関数を条件にする場合はHAVINGを使用する。
- SQLの処理順序を理解すると使い分けしやすくなる。
- 実務ではWHEREとHAVINGを組み合わせて使用することが多い。
SQLを作成するときは、「この条件は集計前に必要なのか、それとも集計後の結果に対する条件なのか」を意識すると、WHEREとHAVINGを正しく使い分けられるようになります。SQLの処理順序を理解することは、検索精度の向上だけでなく、性能改善や障害対応にも役立つ重要な知識です。

コメント