【SQL入門編9】GROUP BYを使って複数の要素をグループ化しよう

SQL入門

本記事では、GRUOP BYについて解説します。

前回はMAXなどの集計関数について解説しました

今回では、GRUOP BYでのグループ化のやり方についてみていきましょう。

グループ化ができるようになると、グループごとに合計値の取得ができるようになります。

SQLのGROUP BYとは?

GROUP BYとは、SQLにおいてグループ化させるためのもののことです。

GROUP BYを使うことで、グループごとに合計値や平均値の取得ができるようになります。

たとえば、年齢や性別別にテストの平均点を集計することが可能です。

このように、グループごとにデータを集計する際に必要なのが、GROUP BYですね。

SQLのGROUP BYの使い方

GROUP BYの具体的な使い方についてみていきましょう。

次の項目に従って解説していきます。

  • グループごとの合計値を取得する
  • グループごとの平均値を取得する
  • グループごとの合計値を取得後にORDER BYで並び替える
  • WHEREで抽出後にグループごとの合計値を取得する

なお、今回は第1回目の記事で作成したテーブルを使って解説します。第1回目の記事で演習用のテーブルを作っていない方は、【SQL入門編1】初心者必見!SQLのクエリの書き方を学ぼうを読んで予め作成してくださいね。

グループごとの合計値を取得する

それではGROUP BYを使ってグループごとの合計値を取得してみましょう。

○コード例

SELECT gender, SUM(TestScore) AS 性別別スコア計 FROM TEST.Student GROUP BY gender;

○実行結果

上記のコードの一番後ろに「GROUP BY gender」と記述されていますね。

GROUP BYは指定したカラム名によってグループ化することが可能です。

genderカラムには「男」と「女」というデータが含まれていますので、2つのグループを作ります

GROUP BYでグループ分けした後、SUM関数によって、TestScoreをグループごとに合算します。

これがGROUP BYを使う基本的な方法です。

GROUP BYは基本的にSUMやCOUNTなどの集計関数と一緒に使います

もう一つ例をみておきましょう

○コード例

SELECT age, SUM(TestScore) AS 性別別スコア計 FROM TEST.Student GROUP BY age;

○実行結果

今回はageカラムによってグループ化しています。

各年齢ごとにグループ分けし、SUM関数によって、TestScoreをグループごとに合算します。

グループごとの平均値を取得する

続いて、グループごとの平均値を取得する方法をみていきましょう。

○コード例

SELECT gender, AVG(TestScore) AS 性別別スコア平均 FROM TEST.Student GROUP BY gender;

○実行結果

先程と同じく、GROUP BYでgenderのデータごとにグループ化します。

その後、AVG関数によって、各グループごとにTestScoreの平均値を取得します。

このようにGROUP BYは、AVG関数と組み合わせることも頻出です。

グループごとの合計値を取得後にORDER BYで並び替える

続いて、グループごとの合計値を、ORDER BYで並び替えてみましょう。

GROUP BYとORDER BYを一緒に使うやり方です。

○コード例

SELECT age, AVG(TestScore) AS 年齢別スコア平均 FROM TEST.Student GROUP BY age ORDER BY AVG(TestScore) ASC;

○実行結果

GROUP BYでグループ化した後に、ORDER BYで並び替えを行います。

動作する順番は、GROUP BY⇒ORDER BYという決まりになっているので、注意しましょう。

上記のコードは、GROUP BYによって年齢別にまずグループ化し、AVG関数によってTestScoreの平均値を出しています

その後、ORDER BYによって、年齢別スコア平均が低い順に並び替えています。

WHEREで抽出後にグループごとの合計値を取得する

最後に、WHEREとGROUP BYの組み合わせ方法をみていきましょう。

○コード例

SELECT gender, SUM(TestScore) AS 10歳以上性別別スコア計 FROM TEST.Student WHERE age>=10 GROUP BY gender;

○実行結果

上記のコードでは、WHEREによってageが10以上の場合のみを抽出しています。

その後、GROUP BYによってgenderごとにグループ化し、SUM関数でTestScoreを合計しています。

WHEREはGROUP BYよりも必ず先に動きます

そのため、まず特定条件のみをWHEREで抽出し、抽出したデータのみを対象にGROUP BYでグループ化します。

動作する順番としては、

  • 1.WHERE
  • 2.GROUP BY
  • 3.ORDER BY

ということになりますね。

この順番は頭に入れておきましょう。

WITH ROLLUPで全体の合計値も取得する

GROUP BYの後にWITH ROLLUPを使うと、グループ化したそれぞれの数値の合計数を取得できます。

○コード例

SELECT gender, SUM(TestScore) AS 性別別スコア計 FROM TEST.Student GROUP BY gender WITH ROLLUP;

○実行結果

上記のコードでは、GROUP BYとSUM関数によって、「男」のスコア合計と、「女」のスコア合計を算出しています。

その後、WITH ROLLUPによって、【「男」のスコア合計+「女」のスコア合計】、を取得しています。

WITH ROLLUPを使う場合、カラム名が「NULL」になります。

グループ別の合計結果の他に、全体の合計結果も欲しい場合に、WITH ROLLUPは便利です。

まとめ

本記事では、GROUP BYについて解説しました。

GROUP BYでのデータの並び替え方法が、お分かり頂けたかと思います。

GROUP BYを使うことで、各グループごとの合計値や平均値を求めることが可能です。

ORDER BYと名前が似ていてややこしいので、使い方を間違えないようにしましょう。

次回は、GROUP BYとHAVINGを組み合わせて集計する方法を解説していきます。

挫折率が高い??プログラミング学習のポイント
駆け出しエンジニアが一緒に学ぶ
CANITは、Progateやドットインストールで独学している人達同士をつなげます。駆け出しエンジニアのあなたのためのSNSです。
SQL入門
【この記事を書いた人】
谷津弘樹

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

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