【HAVINGについて】

今回は HAVINGについて解説します。

HAVINGは GROUP BYで集計した後に条件をかけるための関数です。
一方で WHEREは集計前にデータを絞るときに使います。

データ(cities )

id 都道府県 市名 人口
1 都道府県A 市a 300000
2 都道府県A 市b 700000
3 都道府県A 市c 600000
4 都道府県B 市d 800000
5 都道府県B 市e 900000
6 都道府県C 市f 400000
7 都道府県C 市g 300000
8 都道府県C 市h 350000
9 都道府県D 市i 1500000
10 都道府県E 市j 200000

都道府県ごとの市の平均人口が 600000 人以上の都道府県だけを表示しましょう

SELECT 都道府県, AVG(人口)
FROM cities
GROUP BY 都道府県
HAVING AVG(人口) >= 600000;

【解説】
上記コードのようにHAVINGGROUP BYの後に実行します。
WHEREと同時利用もできます!その時はFROMGROUP BYの間にWHEREが来ます。

AVG() はかっこの中のデータの平均値を出す集計関数です
averageの略ですね!合計して個数で割るまでを自動でしてくれます。

【実行結果】

都道府県 AVG (人口)
都道府県B 850000
都道府県D 1500000

WHEREで同じことはできません!!
例えば下記のコードを実行した場合エラーになります

SELECT 都道府県, AVG(人口)
FROM cities
WHERE AVG(人口) >= 600000
GROUP BY 都道府県;

→ AVG(人口) は集計の結果なので、WHEREでは使用できません。

改めて、WHEREHAVINGの違いまとめ

種類 使うタイミング 条件に使える内容
WHERE 集計前に行を絞る 通常の列(都道府県、人口など)
HAVING GROUP BY後に集計結果で絞る 集計関数(AVG, SUM, COUNTなど)

WHEREでエラーにせずに実行するコード

SELECT 都道府県, ROUND(AVG(人口)) AS 平均人口
FROM cities
WHERE 人口 >= 500000
GROUP BY 都道府県;

【実行結果】

都道府県 平均人口
都道府県A 650000
都道府県B 850000
都道府県D 1500000

人口全体に条件をつけて絞り込んでからグループごとにするので本来の欲しいデータとは異なります

【まとめ】
WHERE は「元データの絞り込み」に、HAVING は「集計結果の絞り込み」に使います。
探し出したいデータに合わせWHEREHAVINGを使い分けましょう。

コメント

タイトルとURLをコピーしました