【SQL】GROUP BY・集約関数の使い方合ってる?仕様と注意点を解説!

SQL

こんにちは!たいちゃんと申します。

今回は私が現在勉強中のSQLにて,気付いたこと・学んだことを皆さんに共有できればと考えています。

今回のブログでは以下の内容が分かります!

  • GROUP BYの構文
  • 集約関数の機能
  • GROUP BY使用時のSELECT文の条件

GROUP BYと集約関数の概要と,GROUP BY適用時の注意点について具体的な図を用いながら解説していきます!

GROUP BY 仕様

GROUP BY 構文

SELECT 列名 FROM テーブル名 GROUP BY 列名

GROUP BYにて指定された列の要素が同じ行を,1つのグループとして扱うものとなります。列名の部分には,単なる列名だけでなく要素を足し合わせる「集約関数」も合わせて利用することができます。

集約関数とは?

集約関数とは,指定された列にある複数の値を計算し,一つの値を出力する関数のことです。

以下のように項目に対して数値計算を行う関数が多くあり,GROUP BYが無ければ全ての値を計算した結果が出力されます。

集約関数機能
SUM(項目)項目の合計値を出力
MAX(項目)項目の最大値を出力
MIN(項目)項目の最小値を出力
AVE(項目)項目の平均値を出力
COUNT(項目)項目の出現回数を出力

GROUP BYと集約関数のイメージ

例として,1つのテーブルを定義して考えてみましょう。

以下は,とある学校の生徒,性別,あるテストの点数をまとめたテーブルと,GROUP BYを利用したSELECT構文です。

とある学校生徒とテスト点数(Test)

SELECT gender AVE(“score”) FROM Test GROUP BY “性別”

このSELECT文によって,何が起こるのか確認していきましょう。まず,”性別”でGROUP BYされると,以下のように性別が同じ行を1つのグループとしてまとめます。

性別には「男性」「女性」の2種類であり,GROUP BYにて性別によってグループが作られたため,できたグループは2つとなりました。

ここで集約関数AVE(“score”)の値は,それぞれのグループごとに計算されまる。そのため,SELECTによって出力される結果は以下の表のような出力となります。

上記のように男性・女性グループそれぞれのグループでの平均値が出力されていることがわかります!

GROUP BY使用時に表示できない項目

前テーマにて,genderとscoreの平均値を出力していました。では,ほかの項目はどうなのでしょう?

例えば,下記のようなSELECT文を試してみたとしましょう。

>SELECT studentID gender FROM Test GROUP BY gender

この構文は,先ほどと同じくgenderによってグループ化されております。先ほどscoreの平均値を指定した際の出力結果では,グループごとに1つの出力しかされていません。

しかし,今回の構文はグループごとにstudentIDの値を1つに決められません。つまり,この構文ではエラーを出力する結果となります。

この結果から分かることは…?

GROUP BYを用いた際に,SELECTで表示できる項目は

  • GROUP BYで指定した項目(今回はgender)
  • 集約関数
  • 定数値

グループ内で値が一つに定まらない項目は指定できませんので,SELECTに指定する項目の条件に注意しながら活用していきましょう!

コメント

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