📌 結論から理解する
HAVING句=「グループ化後の集計結果を絞り込む」
HAVINGはGROUP BYでグループ化した後の集計結果に対して条件を適用します。
WHEREとの違い:WHERE=行の絞り込み(GROUP BY前)、HAVING=グループの絞り込み(GROUP BY後)
WHEREとHAVINGの違いを図解
① FROM: ordersテーブル全行(100行)
↓ WHERE order_date >= '2024-01-01' で絞り込み
② WHERE後: 2024年以降の行(60行)
↓ GROUP BY category でグループ化
③ GROUP BY後: カテゴリ別グループ(5グループ)
↓ HAVING SUM(amount) >= 100000 でグループを絞り込み
④ HAVING後: 合計10万以上のカテゴリのみ(3グループ)
HAVING使用例
-- 注文件数が3件以上のカテゴリのみ
SELECT category, COUNT(*) AS cnt
FROM orders
GROUP BY category
HAVING COUNT(*) >= 3;
-- 合計売上が100万以上の営業担当
SELECT sales_person, SUM(amount) AS total
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY sales_person
HAVING SUM(amount) >= 1000000
ORDER BY total DESC;
SELECT category, COUNT(*) AS cnt
FROM orders
GROUP BY category
HAVING COUNT(*) >= 3;
-- 合計売上が100万以上の営業担当
SELECT sales_person, SUM(amount) AS total
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY sales_person
HAVING SUM(amount) >= 1000000
ORDER BY total DESC;
よくある誤り
HAVING に集計関数なしで書く例:
HAVING category = 'PC' は動くDBもあるが、これは本来 WHERE に書くべき。GROUP BY前の条件はWHEREに書くのが正しいSQL。
試験ではWHERE/HAVINGの使い分けが穴埋め問題で出る。
集計前の絞り込み → WHERE
集計後の絞り込み → HAVING
集計前の絞り込み → WHERE
集計後の絞り込み → HAVING
🧠 確認クイズ
Q1. 部署ごとの平均給与が50万以上の部署だけを取得するSQL(空欄)として正しいのはどれか? SELECT dept, AVG(salary) FROM emp GROUP BY dept [空欄] AVG(salary) >= 500000
Q2. WHEREとHAVINGの違いとして正しいのはどれか?
Q3. SELECT category, COUNT(*) FROM orders GROUP BY category HAVING COUNT(*) >= 3; の意味は?