1から始めるPythonデータ分析 - やりたいこと逆引きリスト ▶︎▶︎

【SQL】HAVING|グルーピングの結果に条件を付ける

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を記述する

SQLデータベース抽出の例
SELECT
    クラス, AVG(点数) AS 平均点

GROUP BY
    クラス
HAVING
    平均点 >= 80
SQLデータベース抽出の例

クラスごとにAVG関数で点数を出した後に、平均点というカラム名にします

HAVING句で平均点が80以上という条件を設定しました

HAVINGとWHEREの違い

「HAVING」と「WHERE」で「違いがよく分からない」という質問を多くいただきます

前述した通り「GROUP BYの前か後」で条件を付けるという違いです

つまり「集約する前のデータに条件を付けてまとめる」のが「WHERE

集約した後のデータに条件を付けて結果を出す」のが「HAVING」です

WHEREを使った場合
SELECT
    クラス, AVG(点数) AS 平均点

WHERE
    点数 >= 80
GROUP BY
    クラス

「GROUP BY」の前にWHEREで80点以上で条件を設定する

SQLデータベース抽出の例

(80点以上の人たちを)クラスごとにまとめる

SQLデータベース抽出の例

※GROUP BYの前に80点以上で条件を付けたので、平均点も当然高くなる

HAVINGを使った場合
SELECT
    クラス, AVG(点数) AS 平均点

GROUP BY
    クラス
HAVING
    平均点 >= 80

クラスごとに平均点をまとめる(まとめる前に条件は無し)

SQLデータベース抽出の例

(まとめた後に)平均点が80以上のみ抽出する

SQLデータベース抽出の例
集計順序が違う?

SQLはSELECT(最初)から実行されるわけではありません

この集計順序の違いを理解できていると、「WHERE」と「HAVING」の使い分けをさらに理解することができます

まとめ

今回は「HAVING」の使い方についてご紹介してきました

条件を設定するという点で、「WHERE」と混同してしまうことが多いので

集計順序という違いを理解しましょう

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です