英語607877 views
高校生物549842 views
中学社会667106 views
MathPython491378 views
ヒストリア284143 views
いろは2986023 views
教育148875 views
雑学1472593 views
中学英語808712 views
中学数学621382 views
Help
Tools

English

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 との使い分けを覚えておきましょう。