0Pricing
SQL Academy · レッスン

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 orders

WHEREと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;

論理的な実行順序

概念上の順序:

  1. FROM — テーブルを選択して結合する
  2. WHERE — 行を絞り込む
  3. GROUP BY — グループを作る
  4. HAVING — グループを絞り込む
  5. SELECT — 列を射影する
  6. ORDER BY — 並べ替える
  7. LIMIT — 上位N件に制限する

GROUP BYなしのHAVING

GROUP BYなしでHAVINGを使用できます。この場合、テーブル全体が1つのグループになります:

SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000;       -- prints only if total over 1M

HAVINGでのエイリアス

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. COUNT、SUM、AVG、MIN、MAX
  2. 単一列・複数列のGROUP BY
  3. HAVINGとWHEREの違い
  4. よくある落とし穴:集約におけるNULL
← SQL Academyに戻る