HAVINGとWHEREの違い
グループを絞り込むHAVINGと、行を絞り込むWHEREを区別し、同じクエリで両方を正しく使います。
「HAVINGとWHEREの違い」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
2段階のフィルタリング
WHEREはグループ化する前に個々の行を絞り込みます。HAVINGは集約した後にグループを絞り込みます。見た目は似ていますが、処理される段階が異なります。
WHEREの例
WHEREは元の行を絞り込みます。集約結果は参照できません:
-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;HAVINGの例
HAVINGはグループを絞り込みます。集約結果を参照できます:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- only users with ≥ 5 ordersWHEREとHAVINGの併用
同じクエリ内で両方を使用できます:
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;WHEREに集約関数を記述しない
プランナーはグループ化より前にWHEREを実行するため、集約結果はまだ利用できません:
-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5 -- ERROR
GROUP BY user_id;
-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;可能な場合は条件をWHEREに移す
WHEREはグループ化より前に絞り込むため、集約対象になる行を減らせます。WHEREで表現できない条件に限ってHAVINGを使用してください。
-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);
-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;論理的な実行順序
概念上の順序:
FROM— テーブルを選択して結合するWHERE— 行を絞り込むGROUP BY— グループを作るHAVING— グループを絞り込むSELECT— 列を射影するORDER BY— 並べ替えるLIMIT— 上位N件に制限する
GROUP BYなしのHAVING
GROUP BYなしでHAVINGを使用できます。この場合、テーブル全体が1つのグループになります:
SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000; -- prints only if total over 1MHAVINGでのエイリアス
HAVINGからSELECTのエイリアスを参照できるデータベースもあります。PostgreSQLとMySQLでは可能ですが、標準SQLではできません。最も移植性が高いのは、集約関数を繰り返し記述する方法です:
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5; -- portable
-- HAVING order_count >= 5 -- works in PG / MySQL複数の集約関数を使うHAVING
複合的な集約条件にはHAVINGを使用します:
SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;パフォーマンスに関する注意
HAVINGの集約結果に対するフィルタは、列に対するWHEREのようにインデックスを利用できません。可能な条件はWHEREに移してください。
まとめ
WHERE = 行を絞り込む。HAVING = グループを絞り込む。
- 集約関数はHAVINGでのみ使用し、WHEREでは使用しません
- 高速化のため、条件をWHEREに移します
- 必要に応じて両方を使用します
確認問題
注文数が10件を超えるユーザーを取得したい場合、どの句で絞り込みますか?
よくある質問
「HAVINGとWHEREの違い」レッスンは無料ですか?
はい。「HAVINGとWHEREの違い」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「HAVINGとWHEREの違い」で何を学びますか?
グループを絞り込むHAVINGと、行を絞り込むWHEREを区別し、同じクエリで両方を正しく使います。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「HAVINGとWHEREの違い」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- COUNT、SUM、AVG、MIN、MAX
- 単一列・複数列のGROUP BY
- HAVINGとWHEREの違い
- よくある落とし穴:集約におけるNULL