HAVING で集計結果を絞り込む
HAVING は、GROUP BY で集計した結果に対して条件をつけるときに使います。WHERE が集計前の絞り込みなのに対し、HAVING は集計後の絞り込みです。
基本構文
SELECT カラム名, 集計関数 FROM テーブル名
GROUP BY カラム名
HAVING 条件;具体例
「ユーザーが 10 人以上いる都市」だけを取得するには、こう書きます。
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city
HAVING COUNT(*) >= 10;COUNT(*) の結果が 10 以上のグループだけが返ります。
WHERE と HAVING の違い
WHERE
集計前のデータを絞り込む。個々の行に対する条件
HAVING
集計後の結果を絞り込む。グループに対する条件
-- WHERE:20歳以上のユーザーだけを対象に集計
SELECT city, COUNT(*) FROM users
WHERE age >= 20
GROUP BY city;
-- HAVING:集計結果が10以上のグループだけ表示
SELECT city, COUNT(*) FROM users
GROUP BY city
HAVING COUNT(*) >= 10;WHERE と HAVING を両方使う
WHERE と HAVING は同時に使えます。
SELECT city, COUNT(*) AS user_count
FROM users
WHERE age >= 20
GROUP BY city
HAVING COUNT(*) >= 5;この場合の処理順序は次のようになります。
WHERE で 20 歳以上を絞り込み
GROUP BY で都市ごとにグループ化
COUNT(*) で集計
HAVING で 5 人以上のグループだけ抽出
HAVING で使える条件
HAVING では集計関数を使った条件を書けます。
-- 平均年齢が 25 歳以上の都市
SELECT city, AVG(age) AS avg_age
FROM users
GROUP BY city
HAVING AVG(age) >= 25;
-- 合計売上が 100 万円以上の商品
SELECT product_id, SUM(amount) AS total
FROM sales
GROUP BY product_id
HAVING SUM(amount) >= 1000000;別名は使えない場合がある
SELECT で定義した別名(エイリアス)は、HAVING で使えないことがあります。MySQL では使えますが、他のデータベースでは使えないことが多いです。
-- MySQL ではOK
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city
HAVING user_count >= 10;
-- 移植性を考えるなら
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city
HAVING COUNT(*) >= 10;HAVING は「集計結果でさらに絞り込みたい」ときに使います。WHERE との使い分けを覚えておきましょう。












