本記事では、HAVINGの使い方について解説します。
前回はGROUP BYでのグループ化について解説しました
今回では、GROUP BYとHAVINGを使って、グループ化した後にデータを絞り込むやり方についてみていきましょう。
SQLのHAVINGとは?
HAVINGとは、SQLにおいてデータを絞り込むもののことです。
HAVINGを使うことで、グループ化した後にデータを絞り込むことができるようになります。
たとえば、年齢別にテストの点数の平均を求め、平均点が50点以上の場合のみ表示することが可能です。
このように、グループ化した後にデータを絞り込む際に必要なのが、HAVINGですね。
HAVINGとWHEREの違い
HAVINGとWHEREの違いについて解説します。
HAVINGもWHEREも、データを絞り込むという点は共通しています。
しかし、HAVINGはグループ化した後にデータを絞り込むのに対し、WHEREはグループ化する前にデータを絞り込む点が異なります。
つまり、
WHERE⇒GROUP BY⇒HAVING
という順番で動くということです。
HAVINGとWHEREは、実行される順番が異なる点に関しては注意しましょう。
SQLのHAVINGの使い方
HAVINGの具体的な使い方についてみていきましょう。
次の項目に従って解説していきます。
- データを絞り込む
- グループ化した後にデータを絞り込む
- グループ化した後にデータを絞り込み、その後並び替える
なお、今回は第1回目の記事で作成したテーブルを使って解説します。第1回目の記事で演習用のテーブルを作っていない方は、【SQL入門編1】初心者必見!SQLのクエリの書き方を学ぼうを読んで予め作成してくださいね。
データを絞り込む
HAVINGを使って、データを絞り込む方法をみていきましょう。
○コード例
SELECT name, TestScore FROM TEST.Student HAVING TestScore>=50;
○実行結果
上記のコードは、HAVINGを使ってTestScoreが50以上のデータのみ抽出しています。
これがHAVINGの基本的な使い方となります。
ただ、普通HAVINGは今回の場合のようなときは、使いません。
なぜなら、WHEREを使っても全く同じ結果が得られるため、HAVINGを使う必要性がないからです。
次の項目で、HAVINGの実用的な使い方をみていきましょう。
グループ化した後にデータを絞り込む
HAVINGは、グループ化した後のデータを対象に、データを絞り込むことができるのが特徴です。
○コード例
SELECT age, SUM(TestScore) AS 年齢別スコア計 FROM TEST.Student GROUP BY age;
○実行結果
上記のコードは、GROUP BYとSUM関数を使って、年齢別スコア計を算出していますね。
HAVINGを使って「年齢別スコア計が100以上の場合」のみを抽出しましょう。
○コード例
SELECT age, SUM(TestScore) AS 年齢別スコア計 FROM TEST.Student GROUP BY age HAVING SUM(TestScore) >= 100;
○実行結果
HAVINGはGROUP BYの後に書きます。
HAVINGによって、SUM(TestScore)が100以上の場合のみ、抽出しています。
このように、HAVINGを使うことでグループ化した後のデータを参照し、絞り込むことが可能です。
なお、「HAVING TestScore >= 100」と書くのは誤りです。
「HAVING SUM(TestScore) >= 100」としないと、TestScoreの合計値を対象とすることができません。
ちなみに、以下のように、ASで付けた別名を利用して記述することも可能です。
○コード例
SELECT age, SUM(TestScore) AS 年齢別スコア計 FROM TEST.Student GROUP BY age HAVING 年齢別スコア計 >= 100;
○実行結果
これでも全く同じ実行結果が得られます。
グループ化した後にデータを絞り込み、その後並び替える
最後にグループ化した後にデータを絞り込み、その後並び替える方法をみていきましょう。
○コード例
SELECT age, SUM(TestScore) AS 年齢別スコア計 FROM TEST.Student GROUP BY age HAVING 年齢別スコア計 >= 100 ORDER BY 年齢別スコア計;
○実行結果
上記のコードでは、GROUP BYとSUM関数で年齢別スコア合計を算出しています。
その後、HAVINGによって、年齢別スコア合計が100以上の場合のみ抽出していますね。
そして、ORDER BYによって、抽出したデータを並び替えています。
このように、GROUP BY⇒HAVING⇒ORDER BYという順番で動作がします。
SQLのコマンドが実行される順番まとめ
ここまで、様々なSQLのコマンドを紹介してきました。
SQLのコマンドは、動く順番がルール化されており、必ず決められた順番通りに動きます。
SQLのコマンドは以下の順番で動作します。
1 | WHERE | 特定条件のみ抽出する |
2 | GROUP BY | 同じデータでグループ化する |
3 | SUM、AVG、COUNT、MAX、MIN | 集計関数 |
4 | HAVING | 特定条件のみ抽出する |
5 | ORDER BY | データを並び替える |
6 | LIMIT | データ数を制限する |
この順番を暗記しておくと、実際にコマンドを書く際「どっちからだっけ?」と思うことがなくなりますよ。
まとめ
本記事では、GROUP BYとHAVINGの使い方について解説しました。
HAVINGを使って、グループ化した後にデータを絞り込む方法がお分かり頂けたかと思います。
HAVINGはWHEREとは異なり、グループ化した後に絞り込むので、そこだけ注意して下さい。
今回でSQLの入門編は全て完了しました、お疲れさまでした!