今回は 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;
【解説】
上記コードのようにHAVINGはGROUP BYの後に実行します。
WHEREと同時利用もできます!その時はFROMとGROUP BYの間にWHEREが来ます。
AVG() はかっこの中のデータの平均値を出す集計関数です
averageの略ですね!合計して個数で割るまでを自動でしてくれます。
【実行結果】
都道府県 | AVG (人口) |
---|---|
都道府県B | 850000 |
都道府県D | 1500000 |
※WHEREで同じことはできません!!
例えば下記のコードを実行した場合エラーになります
SELECT 都道府県, AVG(人口)
FROM cities
WHERE AVG(人口) >= 600000
GROUP BY 都道府県;
→ AVG(人口) は集計の結果なので、WHEREでは使用できません。
改めて、WHEREとHAVINGの違いまとめ
種類 | 使うタイミング | 条件に使える内容 |
---|---|---|
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 は「集計結果の絞り込み」に使います。
探し出したいデータに合わせてWHEREとHAVINGを使い分けましょう。
コメント