プログラミングやWEB制作の勉強ならCANIT (キャニット)

【SQL入門編10】GROUP BYとHAVINGを組み合わせて集計しよう

SQL入門

本記事では、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のコマンドは以下の順番で動作します

1WHERE特定条件のみ抽出する
2GROUP BY同じデータでグループ化する
3SUM、AVG、COUNT、MAX、MIN集計関数
4HAVING特定条件のみ抽出する
5ORDER BYデータを並び替える
6LIMITデータ数を制限する

この順番を暗記しておくと、実際にコマンドを書く際「どっちからだっけ?」と思うことがなくなりますよ。

まとめ

本記事では、GROUP BYとHAVINGの使い方について解説しました。

HAVINGを使って、グループ化した後にデータを絞り込む方法がお分かり頂けたかと思います。

HAVINGはWHEREとは異なり、グループ化した後に絞り込むので、そこだけ注意して下さい。

今回でSQLの入門編は全て完了しました、お疲れさまでした!

❤内容は役に立ちましたか?皆さまのご意見が励みになります☺
YesNo
手に職をつけてプログラマー転職

そろそろ本気で将来のことを考えなくちゃ……手に職をつけてプログラマーやエンジニアに転職したいなぁ。でも、プログラミングスクールってものすごくたくさんあるし、なんか敷居が高いのよね

これからプログラマーやエンジニアへの転身を目指すあなたに、どのスクールがもっとも適しているのかを紹介します。

SQL入門
【この記事を書いた人】
谷津弘樹

某自社開発のIT企業に勤めていた元webプログラマーです。主にサーバーサイド側を担当し、phpを使った開発経験があります。現在は退職しフリーランスライターとして活動中。IT系の記事を主に執筆し生計を立てています。

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