【SQL脱初心者】WHEREとHAVING、どっちを使う?「集計前」と「集計後」の違いを完璧に理解する
公開日: 2025年12月1日
SQLでデータの集計をしているとき、こんなエラーに出会ったことはありませんか?
「えっ?『売上の合計(SUM)が1万円以上の人』を出したいだけなのに、なんでWHERE句でエラーになるの?」
これは、SQLにおける「WHERE」と「HAVING」の役割の違いを理解していないと、必ずぶつかる壁です。 どちらも「条件でデータを絞り込む」という機能は同じですが、そのタイミングが決定的に違います。
今日は、この2つの使い分けを、SQLの「実行順序」という裏側の仕組みから紐解いて、二度と迷わないように解説します。
⏳ SQLが実行される「順番」を知ろう
私たちが書くSQL(SELECT ... FROM ...)の順番と、データベースが実際に処理する順番は異なります。 ここが最大のポイントです。データベースは、以下の順序で処理を行います。
- FROM(どのテーブルから?)
- WHERE(集計前のデータを絞り込む)
- GROUP BY(グループにまとめる・集計する)
- HAVING(集計後の結果を絞り込む)
- SELECT(表示する列を選ぶ)
見ての通り、WHERE は GROUP BY(集計)よりも先に実行されます。 つまり、WHEREの時点では、まだ「合計」や「平均」は計算されていないのです。だから、WHERE SUM(price) > 10000 と書くとエラーになるわけです。
1. WHERE句:元のデータを絞り込む
WHEREは、テーブルにある「生のデータ(個々の行)」に対して条件を指定します。
-- 例:2024年の注文データだけを集計対象にしたい
SELECT user_id, COUNT(*)
FROM orders
WHERE order_date >= '2024-01-01' -- 集計する「前」に、古いデータを除外する
GROUP BY user_id;
これは、「集計作業に入る前に、余計なデータを取り除いておく」という処理です。無駄な計算が減るため、パフォーマンス的にも重要です。
2. HAVING句:集計結果を絞り込む
HAVINGは、GROUP BYで計算が終わった後の「グループごとの結果」に対して条件を指定します。
-- 例:合計注文額が10万円「以上」のユーザーだけを表示したい
SELECT user_id, SUM(amount)
FROM orders
GROUP BY user_id -- まずユーザーごとに合計を計算する
HAVING SUM(amount) >= 100000; -- 計算結果に対して条件をかける
これがHAVINGの出番です。WHEREでは扱えない「合計(SUM)」や「件数(COUNT)」などの集計関数の結果を条件にしたい場合は、必ずHAVINGを使います。
🤔 よくある間違いと修正例
間違い:WHEREで集計関数を使ってしまう
-- ❌ エラー! WHEREの時点では COUNT(*) はまだ分からない
SELECT category, COUNT(*)
FROM products
WHERE COUNT(*) >= 10 -- ここが間違い
GROUP BY category;
正解:HAVINGに移動させる
-- ⭕ 正解
SELECT category, COUNT(*)
FROM products
GROUP BY category
HAVING COUNT(*) >= 10; -- 集計した後で絞り込む
🤖 AIにクエリを直してもらう
「あれ?どっちだっけ?」と迷ったり、複雑な条件でエラーが出たりした場合は、AI SQLチェッカーの出番です。
エラーが出るクエリをそのまま貼り付けてみてください。 AIは瞬時に「集計関数はWHERE句では使えません。HAVING句に移動してください」といった的確なアドバイスと、修正後のクエリを提示してくれます。 構文エラーで悩む時間をゼロにして、ロジックの構築に集中しましょう。
まとめ:タイミングの違いを意識しよう
- WHERE: 集計する 「前」 の、個々のデータの絞り込み。
- HAVING: 集計した 「後」 の、グループデータの絞り込み。
- 実行順序は FROM → WHERE → GROUP BY → HAVING。
この「実行順序」さえ頭に入っていれば、もう二度とこのエラーに悩まされることはありません。 さあ、SQL道場の中級編・上級編の問題で、HAVING句を使った集計クエリに挑戦してみましょう!
SQLのエラー、AIが解説します
「Invalid use of group function」などのエラーが出たら、AI SQLチェッカーに貼り付けてみてください。WHEREとHAVINGの使い分けなど、修正ポイントを即座に教えてくれます。
AI SQLチェッカーを使ってみる →