【2026年7月】SQL「HAVING句」とWHEREの違いを図解!GROUP BY・集計関数との組み合わせ方まで徹底解説

【2026年7月】SQL「HAVING句」とWHEREの違いを図解!GROUP BY・集計関数との組み合わせ方まで徹底解説

「SQLのHAVING句とWHEREはどう違うの?」「GROUP BYと組み合わせる順番がわからない」——SQLを学習中の方がよくつまずくポイントです。結論から言うと、WHEREは「行のフィルタリング(集計前)」に使い、HAVINGは「グループ化した結果のフィルタリング(集計後)」に使うのが基本の違いです。

この記事では、HAVING句の基本・GROUP BYとの組み合わせ・WHEREとの3つの違い・実践的な使い分けパターン・よくあるエラーの解決法・Claude Codeを使ったSQL業務の効率化まで図解と実例で徹底解説します。

代表菅澤 代表菅澤
HAVING句はWHEREと似ていますが、「いつフィルタリングするか」のタイミングが決定的に違います。GROUP BYで集計した後のデータに条件をつけたいときがHAVINGの出番です。
AI鬼管理山崎 AI鬼管理山崎
SQLを初めて学ぶ方が「WHERE句でCOUNT()を使おうとしてエラーになった」という失敗がよくあります。集計関数(COUNT・SUM・AVG等)を条件に使いたいときは必ずHAVING句を使ってください。
✔️HAVING句の基本構文と役割
✔️GROUP BY句との組み合わせ方と実行順序
✔️WHERE句との3つの違い(タイミング・集計関数・パフォーマンス)
✔️実践的なSQL使い分けパターン10例
✔️よくあるエラー(無効な使用)の原因と解決法
✔️Claude CodeでSQLクエリを自動生成・学習する方法
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理
📌 この記事の結論
【2026年7月】SQL「HAVING句」とWHEREの違いを図解!GROUP BY・集計関数との組み合わせ方まで徹底解説
SQL HAVING句とWHEREの違いをわかりやすく図解。GROUP BYとの組み合わせ方、実行タイミングの違い、よくあるエラー対処法、Claude Codeを使ったSQL学習・自動化まで実例つきで解説します。

01 SQL「HAVING句」とは?基本と役割 GROUP BYで集計した結果に条件をかけるためのSQL構文

📚 用語解説

HAVING句(HAVING Clause):SQLにおいて、GROUP BY句でグループ化・集計した結果に対して絞り込み条件を指定する構文。集計関数(COUNT・SUM・AVG・MAX・MIN等)を条件に使えるのが特徴。WHERE句が「行単位のフィルタリング」なのに対し、HAVING句は「グループ単位のフィルタリング」を担当します。GROUP BY なしでも使えますが、実用上はほぼ必ずGROUP BYとセットで登場します。

HAVINGの基本構文はこのようになります:

HAVING句の基本構文
SELECT 列名, 集計関数(列名)
FROM テーブル名
[WHERE 行フィルタ条件]  -- 省略可
GROUP BY グループ化する列名
HAVING グループ集計後の条件;

具体例を見てみましょう。「各部署の社員数が5人以上の部署だけを取得する」クエリです:

部署別社員数が5人以上の部署を取得
-- employeesテーブル(社員テーブル)から
-- 部署(department)ごとに社員数(COUNT)を集計して
-- 5人以上の部署だけ抽出する
SELECT department, COUNT(*) AS emp_count
FROM employees
GROUP BY department
HAVING COUNT(*) >= 5;

上記のクエリの実行結果例:

department(部署)emp_count(社員数)
営業部12
システム部8
人事部6

社員数が4人以下の部署(例:法務部3人・総務部2人)は結果に表示されません。

AI鬼管理山崎 AI鬼管理山崎
HAVING句の後に書く条件は「グループ化後のデータに対する条件」なので、COUNT(*)・SUM(売上)・AVG(点数)など、集計した結果の値に条件をつけられます。これがWHEREとの最大の違いです。

02 GROUP BY と HAVING の組み合わせ SQLの実行順序を理解すればHAVINGの使い方が自然にわかる

📚 用語解説

GROUP BY句(GROUP BY Clause):SQLで指定した列の値が同じ行をひとまとめ(グループ)にする構文。グループ化することで、グループごとの合計・平均・件数などを集計関数で計算できるようになります。例えば「departmentでGROUP BY」すると、同じ部署の社員が1つのグループにまとまり、各グループの平均給与・最大給与・人数などを計算できます。

SQLが実行されるときの順序はSELECT文に書く順序とは異なります。実際の実行順序を理解することがHAVING句の理解につながります:

① FROM
テーブルを特定
② WHERE
行フィルタ(集計前)
③ GROUP BY
グループ化・集計
④ HAVING
グループフィルタ(集計後)
⑤ SELECT
表示列を選択
⑥ ORDER BY
並び替え
💡実行順序がわかると「なぜWHEREに集計関数を書けないか」がわかる

WHEREはGROUP BYより先に実行されるため、この時点ではまだ集計が終わっていません。したがって「WHERE COUNT(*) >= 5」と書いてもCOUNT(*)の結果がまだ存在しないのでエラーになります。集計後の条件はHAVINGに書く——これが基本ルールです。

GROUP BY + HAVING の実践的なパターンをいくつか見てみましょう:

GROUP BY + HAVING の実践パターン
-- パターン1: 売上合計が100万円以上のカテゴリを取得
SELECT category, SUM(sales) AS total_sales
FROM orders
GROUP BY category
HAVING SUM(sales) >= 1000000;

-- パターン2: 平均スコアが80以上の生徒クラスを取得
SELECT class_id, AVG(score) AS avg_score
FROM exam_results
GROUP BY class_id
HAVING AVG(score) >= 80;

-- パターン3: 2回以上購入した顧客を抽出(リピーター分析)
SELECT customer_id, COUNT(*) AS purchase_count
FROM orders
GROUP BY customer_id
HAVING COUNT(*) >= 2;
代表菅澤 代表菅澤
パターン3の「2回以上購入した顧客を取得する」クエリはマーケティング分析でよく使います。リピーター顧客の割合・リピート購入の傾向分析に活用できます。これはHAVINGがなければ実現できません。

03 SQL「WHERE句」とは?基本と役割 テーブルの行を絞り込む最も基本的なフィルタリング構文

📚 用語解説

WHERE句(WHERE Clause):SQLで指定した条件に合う行だけを取得するフィルタリング構文。= / != / > / < / >= / <= / BETWEEN / IN / LIKE / IS NULL などの条件演算子が使えます。GROUP BY・HAVING・ORDER BYより前に実行されるため、テーブル全体のデータを集計する前に絞り込む「事前フィルタ」の役割を担います。集計関数(COUNT・SUM等)はWHEREには使えません。

WHERE句の基本構文と使用例:

WHERE句の基本構文と使用例
-- 基本構文
SELECT 列名
FROM テーブル名
WHERE 条件式;

-- 例1: 2024年以降の注文のみ取得
SELECT * FROM orders
WHERE order_date >= '2024-01-01';

-- 例2: 特定の部署かつ給与が50万円以上の社員
SELECT name, department, salary
FROM employees
WHERE department = '営業部' AND salary >= 500000;

-- 例3: 商品名に「限定」が含まれるものを検索
SELECT * FROM products
WHERE product_name LIKE '%限定%';
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

04 WHERE と HAVING の3つの違い タイミング・集計関数の使用可否・パフォーマンスの3点で明確に区別される

比較項目WHERE句HAVING句
フィルタのタイミングGROUP BY の前(集計前)GROUP BY の後(集計後)
集計関数の使用使えない(エラーになる)使える(COUNT・SUM・AVG等)
GROUP BY との関係関係なく使える(必須でない)通常GROUP BYとセットで使う
対象個々の行(1行ごと)グループ全体(まとまり)
実行順序②番目④番目
パフォーマンス絞り込みが早い(集計前に行数を減らす)集計後に絞るので処理量多め

最も重要な違いをもう一度整理します:

WHERE
全行が対象
集計前にフィルタ
GROUP BY
グループ化
集計関数実行
HAVING
グループが対象
集計後にフィルタ
⚠️WHEREにCOUNT()やSUM()は書けない

「WHERE COUNT(*) > 5」のように書くとエラー("Invalid use of group function")になります。集計関数を条件に使いたいときは必ずHAVINGに書いてください。反対に「HAVING 列名 = 値」のように集計関数なしでもHAVINGに書くことは文法上可能ですが、パフォーマンスを考えるとWHEREに書くべきです。

WHERE と HAVING を同時に使う場合

WHEREとHAVINGは同じSELECT文に両方書けます。用途を分けて使い分けることが重要です:

WHERE と HAVING を同時に使う例
-- 「2024年の注文」に絞ったうえで(WHERE)
-- 「購入回数が3回以上の顧客」を抽出する(HAVING)
SELECT customer_id, COUNT(*) AS purchase_count
FROM orders
WHERE order_date >= '2024-01-01'   -- 集計前フィルタ(行の絞り込み)
GROUP BY customer_id
HAVING COUNT(*) >= 3;              -- 集計後フィルタ(グループの絞り込み)
AI鬼管理山崎 AI鬼管理山崎
このパターンが実務では一番多いです。「期間を絞る(WHERE)→グループ化して集計(GROUP BY)→集計結果でさらに絞る(HAVING)」の三段構えを覚えておくと、分析クエリの大半がカバーできます。

05 実践!WHERE・HAVING の使い分けと応用パターン ビジネス分析でよく使うSQLパターンを実例で習得する

📚 用語解説

集計関数(Aggregate Functions):SQLでグループ内の複数行のデータをまとめて1つの値に変換する関数の総称。主な集計関数:COUNT(*)=行数・SUM(列名)=合計値・AVG(列名)=平均値・MAX(列名)=最大値・MIN(列名)=最小値。WHERE句には使えず、SELECT句かHAVING句に書く必要があります。NULLを含む行は COUNT(列名) では無視されますが COUNT(*) では数えられます(違いに注意)。

パターン集:実務でよく使う10パターン

実務でよく使うHAVING句パターン10例(前半)
-- [1] リピーター分析: 3回以上購入した顧客
SELECT customer_id, COUNT(*) AS orders
FROM orders GROUP BY customer_id HAVING COUNT(*) >= 3;

-- [2] 売上ランキング: 月次売上上位カテゴリ
SELECT category, SUM(amount) AS monthly_sales
FROM sales WHERE month = '2024-06'
GROUP BY category HAVING SUM(amount) > 500000
ORDER BY monthly_sales DESC;

-- [3] 在庫アラート: 残数が10個以下の商品
SELECT product_id, SUM(stock) AS total_stock
FROM inventory GROUP BY product_id HAVING SUM(stock) <= 10;

-- [4] アクティブユーザー: 今月3回以上ログインしたユーザー
SELECT user_id, COUNT(*) AS login_count
FROM access_logs
WHERE login_date >= '2024-06-01'
GROUP BY user_id HAVING COUNT(*) >= 3;

-- [5] 重複レコード検出: 同じメールが2件以上あるもの
SELECT email, COUNT(*) AS dup_count
FROM users GROUP BY email HAVING COUNT(*) >= 2;
実務でよく使うHAVING句パターン10例(後半)
-- [6] 平均単価の高いカテゴリ(平均1万円超)
SELECT category, AVG(price) AS avg_price
FROM products GROUP BY category HAVING AVG(price) > 10000;

-- [7] 返品率の高い商品(返品数が総注文数の10%超)
SELECT product_id,
       SUM(CASE WHEN status='returned' THEN 1 ELSE 0 END) AS returns,
       COUNT(*) AS total_orders
FROM orders GROUP BY product_id
HAVING SUM(CASE WHEN status='returned' THEN 1 ELSE 0 END) > COUNT(*) * 0.1;

-- [8] 部署の最高給与が100万円超
SELECT department, MAX(salary) AS max_salary
FROM employees GROUP BY department HAVING MAX(salary) > 1000000;

-- [9] 1ヶ月あたりの平均注文件数が50件以上の顧客
SELECT customer_id, COUNT(*)/12 AS monthly_avg
FROM orders WHERE YEAR(order_date)=2023
GROUP BY customer_id HAVING COUNT(*)/12 >= 50;

-- [10] 評価が4.0以上のショップのみ(レビュー数10件以上の条件付き)
SELECT shop_id, AVG(rating) AS avg_rating, COUNT(*) AS review_count
FROM reviews GROUP BY shop_id
HAVING COUNT(*) >= 10 AND AVG(rating) >= 4.0;

06 よくあるエラーと解決法 HAVING・GROUP BY・集計関数に関するよくあるエラーパターンと対処法

📚 用語解説

Invalid use of group function(グループ関数の無効な使用):WHEREにCOUNT()やSUM()などの集計関数を使ったときに発生するMySQLのエラー。例:WHERE COUNT(*) > 5 → エラー。原因は「WHEREはGROUP BYより前に実行されるため、この時点では集計関数の結果が存在しない」ため。解決方法は集計関数を使った条件をHAVINGに移すこと。

エラー・問題原因解決法
WHERE COUNT(*) > 5 がエラーWHERE句に集計関数は使えないHAVING COUNT(*) > 5 に変更
GROUP BY後の列が一致しないSELECT句の非集計列がGROUP BYに含まれていないGROUP BYにすべての非集計列を追加
HAVINGだけでWHEREを使っていない(遅い)集計前に絞り込めるのにしていない日付等の条件はWHEREに移動(パフォーマンス改善)
COUNT(列名) が想定より少ないNULLを含む行がCOUNT(列名)でカウントされないCOUNT(*) を使う、またはNULLを別途確認
HAVING ORDER BY で順番が変わらないORDER BYをHAVINGの後に書いていないORDER BYはHAVINGより後に書く(実行順通り)
よくある間違いと正しい書き方
-- よくある間違い(エラー)
SELECT department, COUNT(*)
FROM employees
WHERE COUNT(*) >= 5   -- エラー!WHEREに集計関数は使えない
GROUP BY department;

-- 正しい書き方
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING COUNT(*) >= 5;  -- 集計後の条件はHAVINGに書く
代表菅澤 代表菅澤
SQL学習でつまずくポイントの8割は「WHEREとHAVINGの使い分け」と「GROUP BYに入れる列の選択」です。この2つを徹底的に理解すれば、実務で使うSQLの大半が書けるようになります。
Claude Code 完全解説セミナー|経営者・会社役員専用 1on1 60分 無料Claude Codeを経営に活かしたい方へ — AI鬼管理

07 【独自】Claude CodeでSQL業務を効率化する方法 SQLを学習するにも・実務で使うにも、Claude Codeを活用すれば圧倒的に速くなる

SQLはマーケター・営業担当・経営企画など、非エンジニア職でもデータ分析のために必要になるスキルです。しかし「GROUP BY・HAVING・JOIN・サブクエリ」と学ぶことが多く、独学で習得するには時間がかかります。Claude Codeを使えば、SQLの学習速度と実務での生産性を大幅に上げられます。

✔️SQLクエリを自動生成:「売上が上位10%の顧客を月別に集計するSQL」と日本語で頼むだけでHAVINGを含む完璧なクエリを生成
✔️エラーの原因を即座に解説:「このSQLを実行したらエラーが出た」と貼り付けると、原因と修正方法をわかりやすく説明
✔️SQL学習のサポート:「WHERE と HAVING の違いを例題付きで教えて」と聞けば、この記事のような体系的な解説を得られる
✔️実務データに合わせたSQL作成:「うちの顧客テーブルはこういう構造。リピーター分析のSQLを作って」と依頼できる
✔️SQLのパフォーマンス改善:「このSQLを高速化したい」と貼り付けると、インデックス提案・WHERE最適化・HAVING→WHERE変換など改善案を提示
Claude Codeへの日本語依頼 → SQLが自動生成される
# Claude Codeへの依頼例(こんな感じで日本語で頼める)
"""
以下の条件でSQLを書いてください:
- テーブル: orders(customer_id, product_id, amount, order_date, status)
- 2024年の注文に限定
- ステータスが'completed'の注文のみ
- 顧客ごとに合計購入金額を集計
- 合計購入金額が50,000円以上の顧客だけ取得
- 購入金額の多い順に並べる
"""

# Claude Codeが生成するSQL(例)
SELECT 
    customer_id,
    SUM(amount) AS total_amount,
    COUNT(*) AS order_count
FROM orders
WHERE 
    order_date >= '2024-01-01'
    AND order_date < '2025-01-01'
    AND status = 'completed'
GROUP BY customer_id
HAVING SUM(amount) >= 50000
ORDER BY total_amount DESC;
🏆
VERDICT
Claude Code に軍配
SQLを0から学ぶなら参考書+演習が必要ですが、「仕事で使いたい」なら Claude Code に日本語で依頼するのが最速。作ってもらったSQLを読みながら学ぶ方が、座学より圧倒的に早く実務レベルに到達できます。

Claude CodeでSQLを使う場合のおすすめフロー

やりたいことを
日本語で書く
Claude Codeが
SQLを生成
テスト環境で
実行確認
結果を確認して
修正依頼(あれば)
本番DBで
実行
AI鬼管理山崎 AI鬼管理山崎
特に「集計関数(COUNT・SUM等)を含む複雑なSQL」は、自分で書くとHAVINGの位置を間違えてエラーが出ることが多いです。Claude Codeに作ってもらうと文法的に正しいSQLが出てくるので、デバッグの時間が大幅に短縮できます。

08 まとめ|HAVING句 vs WHERE句の使い分けを完全マスター 実行タイミングの違いを頭に入れれば、迷わず使い分けられる

✔️**WHERE**はGROUP BYの前(集計前)の行フィルタ。集計関数は使えない
✔️**HAVING**はGROUP BYの後(集計後)のグループフィルタ。集計関数が使える
✔️SQLの実行順序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
✔️日付・ステータス等のフィルタはWHERE、集計結果への条件はHAVINGに書く
✔️WHEREとHAVINGは同じSQL文に両方書ける(よく使う組み合わせ)
✔️Claude CodeはSQLの自動生成・エラー解説・学習サポートに活用できる

📚 用語解説

サブクエリ(Subquery):別のSELECT文の中に書くSELECT文のこと。FROM句・WHERE句・SELECT句の中に書ける。HAVINGで対応できない複雑な集計条件を書くときに使う場合がある。例:「平均売上が全体平均の2倍以上のカテゴリ」はHAVINGとサブクエリの組み合わせで実現できます。

SQL活用・データ分析のAI化を相談したい方へ

「社内のデータをSQLで分析したいがクエリが書けない」「GA4・Salesforce・MA等のデータをAIで自動集計・レポート化したい」——弊社GENAIでは、Claude Codeを活用したデータ分析自動化・SQL業務効率化の支援を提供しています。

代表菅澤 代表菅澤
SQLは覚えることが多く見えますが、実務で使うパターンは限られています。Claude Codeと組み合わせると、SQLを完全にマスターしていなくても実務レベルのデータ分析が今すぐできます。ぜひ無料相談でお気軽にご連絡ください。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

よくある質問

Q. HAVING句はWHERE句と同じ列名を使ってもいいですか?

A. はい、可能です。「WHERE status = 'active'」でactiveな行に絞りつつ、「HAVING COUNT(*) >= 5」でその中から5件以上のグループを取得するという組み合わせが典型的なパターンです。ただし同じ列への条件をHAVINGとWHEREの両方に書く場合は、集計関数なしの条件はWHERE(パフォーマンス上)、集計後の条件はHAVINGに書き分けてください。

Q. HAVINGをGROUP BYなしで使えますか?

A. 文法上は使えますが、実用的にはほぼGROUP BYとセットで使います。GROUP BYなしのHAVINGは、テーブル全体を1つのグループとして扱い、例えば「HAVING COUNT(*) > 100」はテーブル全体の行数が100より多いかどうかを確認するだけになります。

Q. MySQL・PostgreSQL・SQLiteでHAVINGの挙動は違いますか?

A. HAVINGの基本的な使い方はSQLの標準規格に従っているため、MySQL・PostgreSQL・SQLite・SQL Serverなどの主要DBMSで同様に動作します。ただし細かい集計関数の仕様やNULLの扱いに差があるため、移行時は確認が必要です。

Q. HAVING句で複数の条件を指定できますか?

A. はい。AND/OR演算子で複数の条件を組み合わせられます。例:「HAVING COUNT(*) >= 10 AND AVG(score) >= 80」で「10件以上かつ平均80点以上のグループ」を取得できます。

Q. HAVINGとサブクエリはどちらを使うべきですか?

A. 「集計した結果に直接条件をつける」場合はHAVINGの方がシンプルです。サブクエリは「他のテーブルの集計結果と比較する」「HAVINGではネストが深くなりすぎる」場合に使います。基本はHAVINGを試して、対応できない場合にサブクエリを検討してください。

Q. Claude CodeでSQLを学ぶのに最適な使い方は?

A. 「このSQLの各行が何をしているか説明して」と貼り付けると、一行ずつ解説してもらえます。「このSQLをもっとシンプルに書き直して」「実行が遅い、最適化して」などの依頼も有効です。また「こんな集計をしたい」と日本語で伝えて生成されたSQLを読み解くことで、実務に直結した学習ができます。

Q. HAVING句はORDER BY と一緒に使えますか?

A. はい、使えます。ORDER BYは必ずHAVINGの後に書きます。「HAVING COUNT(*) >= 5 ORDER BY COUNT(*) DESC」のように書くと、5件以上のグループを件数の多い順に並べて取得できます。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年7月11日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。