目次
HAVINGとは?
HAVING(ハヴィング)
Have + ing (物的所有・所持の意味で) 持っている、(…を)持っている、所有する、身につけている、もっている、与えられている
Weblio英和辞書
「HAVING」はHaveの現在進行形ですが、SQLではGROUP BYでまとめた後に条件を付ける場合に使います
「WHERE」も同様に条件を設定することができる構文ですが
「HAVING」とは全く異なります
違いは「GROUP BY」でまとめる「前」か「後」かです
HAVINGの使い方
SELECT 【列名】, 集計(【列名】)
FROM ***
WHERE ***
GROUP BY 【列名】
HAVING 【条件式】
「HAVING」は「GROUP BY」の後ろに記述し、
「WHERE」と同様に条件式を並べます
意味としては「GROUP BYでまとめた結果に条件を付ける」なので
「GROUP BY」とセットで利用します
実際に使っている例でご紹介します
「クラスごとに試験の平均点を算出し、80点以上のクラスを抽出する」SQLを記述する
SELECT
クラス, AVG(点数) AS 平均点
GROUP BY
クラス
HAVING
平均点 >= 80
クラスごとにAVG関数で点数を出した後に、平均点というカラム名にします
HAVING句で平均点が80以上という条件を設定しました
HAVINGとWHEREの違い
「HAVING」と「WHERE」で「違いがよく分からない」という質問を多くいただきます
前述した通り「GROUP BYの前か後」で条件を付けるという違いです
つまり「集約する前のデータに条件を付けてまとめる」のが「WHERE」
「集約した後のデータに条件を付けて結果を出す」のが「HAVING」です
SELECT
クラス, AVG(点数) AS 平均点
WHERE
点数 >= 80
GROUP BY
クラス
「GROUP BY」の前にWHEREで80点以上で条件を設定する
(80点以上の人たちを)クラスごとにまとめる
※GROUP BYの前に80点以上で条件を付けたので、平均点も当然高くなる
SELECT
クラス, AVG(点数) AS 平均点
GROUP BY
クラス
HAVING
平均点 >= 80
クラスごとに平均点をまとめる(まとめる前に条件は無し)
(まとめた後に)平均点が80以上のみ抽出する
SQLはSELECT(最初)から実行されるわけではありません
この集計順序の違いを理解できていると、「WHERE」と「HAVING」の使い分けをさらに理解することができます
まとめ
今回は「HAVING」の使い方についてご紹介してきました
条件を設定するという点で、「WHERE」と混同してしまうことが多いので
集計順序という違いを理解しましょう