WHEREとHAVINGの違いとは?SQL初心者が混同しやすい使い分けを実務例でわかりやすく解説

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がどの順番で処理されるかを知ることが重要です。

  1. FROM(テーブルを取得)
  2. WHERE(条件で絞り込む)
  3. GROUP BY(グループ化する)
  4. HAVING(集計結果を絞り込む)
  5. SELECT(表示する項目を決定する)
  6. 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で条件指定すると処理時間が長くなることがあります。

原因の切り分け方法

  1. WHEREとHAVINGを使い分けているか確認する。
  2. GROUP BYが正しく指定されているか確認する。
  3. 集計関数の使用箇所を確認する。
  4. 集計前と集計後の件数を比較する。
  5. 実行結果が仕様通りか確認する。

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を修正する。

現場で評価される確認手順

  1. まずWHEREだけで取得件数を確認する。
  2. GROUP BYを追加して集計結果を確認する。
  3. 最後にHAVINGで条件を追加する。
  4. 期待件数と一致するか確認する。
  5. 実行計画も確認し、性能に問題がないか確認する。

業務で上司へ報告するポイント

  • 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の処理順序を理解することは、検索精度の向上だけでなく、性能改善や障害対応にも役立つ重要な知識です。

コメント

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