【SQL】GROUP BY句の使い方を3分でわかりやすく解説

Database

SQLにおけるGROUP BY句の使い方をデータベース初心者向けにわかりやすく解説します。

GROUP BY句はテーブルをいくつかのグループに分ける働きをします。指定したカラムの値ごとの合計値や平均値、最大値・最小値を取得したいような場合に利用します。

SQL GROUP BY
GROUP BY句のイメージ

このページではGROUP BY句の構文ルールや使い方、よくある間違いや注意点を網羅的にご説明します。

このページで学べる内容
  • GROUP BY句の使い方・構文ルール
  • GROUP BY句のサンプルコード
  • GROUP BY句の注意点/よくある間違い

プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。

スポンサーリンク

SQL:GROUP BY句の使い方・構文ルール

SELECT    (カラム名),(カラム名), ・・・・
  FROM    (テーブル名)
 GROUP BY (カラム名),(カラム名), ・・・・;

GROUP BY句はFROM句の後(WHERE句もあればWHERE句の後)に記述し、GROUP BY に続けてグループ化のキーとしたいカラム名を指定します。

以下のようなテーブルがあり、FM列(男 or 女)でグループ化してそれぞれの合計値を取得するパターンを考えます。

SQL GROUP BY
GROUP BY句のイメージ

上記の場合に記述すべきSQLは以下の通り。

SELECT FM, SUM(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | SUM       |
  +----------+-----------+
  | 男       | 180       |
  | 女       | 320       |
*/

FM列(男 or 女)でテーブルをグループ化したいので、GROUP BY句には "FM" 列を指定します。

このときGROUP BY句で指定したFM列は「集約キー」や「グループ化列」というように呼ばれます。

"Japanese" 列をSUM関数を用いて記述しているので結果は以下のようになります。

SELECT FM, SUM(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | SUM       |
  +----------+-----------+
  | 男       | 180       |
  | 女       | 320       |
*/

GROUP BY:集約キーにNULLが含まれる場合

集約キーにNULL値が含まれる場合は、NULLも1つのグループとして認識されます

GROUP BY:NULLが含まれる場合

この場合、先ほどと全く同様のSQLを流すと結果は以下のようになります。

SELECT FM, SUM(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | SUM       |
  +----------+-----------+
  | 男       | 180       |
  | 女       | 320       |
  | NULL     | 110       |  ←NULLも1つのグループとして集計される
*/

集約キーにNULLが含まれる場合はNULLも1つのグループとして認識されるという点を理解しておきましょう。

GROUP BY:サンプルコード

GROUP BY関数は一度理解してしまえば、決して難しい内容ではありません。

ここからは、いくつかのサンプルコードを見ていきながらGROUP BY句の動きをより詳しく学んでいきましょう。

ここでは以下5つの集約関数を例にGROUP BY句の動きを解説します。

このページで学べる内容

GROUP BY:COUNT関数

COUNT関数は指定したカラムのレコード数を取得する集約関数です。

SELECT FM, COUNT(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | COUNT     |
  +----------+-----------+
  | 男       | 3         |
  | 女       | 5         |
*/

指定したFM列の値ごとにレコード数を取得することができます。COUNT関数ではワイルドカードを用いずにカラムを指定した場合NULLがカウントされないため、上記の結果には反映されないという点に注意しましょう。

GROUP BY:SUM関数

SUM関数は指定したレコードの合計値を取得する集約関数です。

SELECT FM, SUM(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | SUM       |
  +----------+-----------+
  | 男       | 180       |
  | 女       | 320       |
  | NULL     | 110       |
*/

GROUP BY:AVG関数

AVG関数は指定したカラムのレコード数を平均値する集約関数です。

SELECT FM, AVG(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | AVG       |
  +----------+-----------+
  | 男       | 60        |
  | 女       | 64        |
  | NULL     | 55        |
*/

GROUP BY:MIN関数

MIN関数は指定したカラムのレコードの最小値を取得する集約関数です。  

SELECT FM, MIN(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | MIN       |
  +----------+-----------+
  | 男       | 35        |
  | 女       | 30        |
  | NULL     | 30        |
*/

GROUP BY:MAX関数

MAX関数は指定したカラムのレコードの最大値を取得する集約関数です。

SELECT FM, MAX(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | MAX       |
  +----------+-----------+
  | 男       | 75        |
  | 女       | 95        |
  | NULL     | 80        |
*/
GROUP BY句のまとめ
  • GROUP BY句はテーブルをいくつかのグループに分ける働きする
    ⇒指定したカラムの値ごとの合計値や平均値/最大値・最小値を取得したいような場合に利用する
  • GROUP BY句で指定したFM列は「集約キー」や「グループ化列」というように呼ばれる
  • 集約キーにNULLが含まれる場合はNULLも1つのグループとして認識される
SELECT FM, SUM(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | SUM       |
  +----------+-----------+
  | 男       | 180       |
  | 女       | 320       |
  | NULL     | 110       |  ←NULLも1つのグループとして集計される
*/

システムエンジニアを目指したい方は

システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。

正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。

システムエンジニア向けに「できるエンジニア」になる方法を1から解説しておりますので、是非ご覧ください。

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