【SQL】GROUP BY句の書き方と使い方の基本

SQLのGROUP BY句について、基本的な書き方と使い方を解説します。特定の項目でデータをグループに分け、COUNTやSUMなどの集計関数と組み合わせて、グループごとの件数や合計値を求める方法を学びます。具体的なサンプルコードを交えて分かりやすく説明します。

作成日: 更新日:

開発環境

  • OS: Windows10
  • DatabaseGUI: TablePlus
  • MySQL: 8.0.42

GROUP BY句とは

GROUP BY句は、SELECT文で取得したたくさんのデータの中から、特定の項目が同じもの同士をグループにまとめ、そのグループごとの情報を計算したいときに使うSQLの命令です。

例えば、全社員のデータが入ったテーブルがあるとします。このテーブルには「氏名」「部署」「年齢」といった列(カラム)があるとします。

このとき、「各部署に何人の社員がいるか知りたい」という場面でGROUP BY句が役立ちます。GROUP BY 部署 のように指定すると、「営業部」グループ、「開発部」グループのように、部署ごとにデータをまとめることができます。

そして、COUNT() のような「集計関数」と組み合わせることで、それぞれのグループに何人の社員がいるのか(データの行数)を数えることができます。

このように、GROUP BY句は単にデータをグループ分けするだけでなく、そのグループごとに合計値(SUM)、平均値(AVG)、個数(COUNT)などを求める集計関数と一緒に使われることが一般的です。

GROUP BY句の基本構文

GROUP BY句は、テーブル内のデータを特定のカラムの値が同じもの同士でグループに分け、そのグループごとに集計を行うための機能です。例えば、商品カテゴリごとの売上合計や、部署ごとの従業員数などを算出する際に使用します。

以下に基本的な構文を示します。

1SELECT
2    グルーピングをするカラム,
3    集計関数( 集計対象カラム )
4FROM
5    テーブル名
6WHERE
7    グループ化「前」の条件式
8GROUP BY
9    グルーピングをするカラム
10ORDER BY
11    カラム名 [ASC|DESC];

各句の役割

  • SELECT句

    • グルーピングをするカラム: GROUP BY句で指定したカラムを記述します。これにより、どのグループの集計結果なのかを明確に表示できます。
    • 集計関数: グループ化したデータに対して計算を行う関数です。代表的なものに、合計を求めるSUM()、平均を求めるAVG()、件数を数えるCOUNT()などがあります。( 集計対象カラム )には、計算の対象となるカラムを指定します。
  • FROM句

    • データを取得する対象のテーブル名を指定します。
  • WHERE句

    • GROUP BYでデータをグループ化する「前」に、処理対象となる行を絞り込むための条件を指定します。ここで指定した条件に一致する行だけが、グループ化の対象となります。
  • GROUP BY句

    • どのカラムの値に基づいてデータをグループに分けるかを指定します。ここに指定したカラムの値が同じ行同士が、一つのグループとしてまとめられます。
  • ORDER BY句

    • GROUP BYで集計した後の結果を、指定したカラムを基準に並べ替えるために使用します。ASCは昇順(小さい順)、DESCは降順(大きい順)を意味し、省略した場合はASCが適用されます。

集計関数は、データベースのテーブルに格納された複数の行のデータをまとめて、1つの結果を返すための便利な関数です。集約関数とも呼ばれます。 例えば、全商品の平均価格や、社員の総数などを簡単に求めることができます。データベースから特定の情報を要約して取り出す際に頻繁に使用されます。

主な集計関数(集約関数)の一覧

関数説明
COUNT(*)行数(件数)を数える
AVG()平均値を求める
SUM()合計値を求める
MAX()最大値を求める
MIN()最小値を求める

これらの関数は、SELECT文の中で、どの列のデータを集計したいかを指定して使用します。

  • COUNT(*) は、テーブルにデータが何行あるか、つまり総件数を数えます。
  • AVG() は、指定した列に含まれる数値の平均値を計算します。例えば、テストの点数や商品の価格の平均を求める際に使用します。
  • SUM() は、指定した列に含まれる数値の合計値を計算します。売上の合計金額などを算出する際に便利です。
  • MAX() は、指定した列に含まれる値の中から最も大きい値(最大値)を探し出します。
  • MIN() は、指定した列に含まれる値の中から最も小さい値(最小値)を探し出します。

これらの関数は、GROUP BY句と組み合わせることで、特定のグループごと(例:部署ごと、商品カテゴリごと)に集計を行うこともでき、より詳細なデータ分析が可能になります。

サンプルコード

データベースからデータを取得する際、特定のグループごとに件数や合計値などを計算したい場面がよくあります。このような計算処理を「集計」と呼び、そのために使われる関数を「集計関数」と言います。ここでは、代表的な集計関数の使い方をサンプルコードと共に解説します。

sql/chapter06/01.sql

COUNT関数は、条件に合致するレコード(行)の件数を数えるための関数です。COUNT(*)のようにアスタリスクを指定すると、全ての行を数えます。

このサンプルコードは、studentsテーブルを対象にしています。まずWHERE句でclass_idがNULL(空)ではないレコードに絞り込み、次にGROUP BY句でclass_idごとにデータをグループ化します。その上で、各クラスに所属する生徒の人数(レコード数)をCOUNT(*)で計算し、クラスIDと一緒に表示します。最後にORDER BY句で、結果をクラスIDの昇順に並び替えています。

1-- COUNT(件数を数える)
2SELECT
3	class_id,
4	COUNT(*)
5FROM
6	students
7WHERE
8	class_id IS NOT NULL
9GROUP BY
10	class_id
11ORDER BY
12	class_id;

sql/chapter06/02.sql

SUM関数は、指定した列に含まれる数値の合計値を計算します。

このサンプルコードでは、class_idごとにグループ化したデータに対して、各クラスに所属する生徒のidの合計値をSUM(id)で計算しています。これにより、クラスごとのIDの合計値が分かります。その他のFROMWHEREGROUP BYORDER BYの働きはCOUNT関数のサンプルと同様です。

1-- SUM(合計を求める)
2SELECT
3	class_id,
4	SUM(id)
5FROM
6	students
7WHERE
8	class_id IS NOT NULL
9GROUP BY
10	class_id
11ORDER BY
12	class_id;

sql/chapter06/03.sql

AVG関数は、指定した列に含まれる数値の平均値を計算します。

このサンプルコードでは、class_idごとにグループ化したデータに対して、各クラスに所属する生徒のidの平均値をAVG(id)で計算しています。これにより、クラスごとのIDの平均値が分かります。

1-- AVG(平均値を求める)
2SELECT
3	class_id,
4	AVG(id)
5FROM
6	students
7WHERE
8	class_id IS NOT NULL
9GROUP BY
10	class_id
11ORDER BY
12	class_id;

sql/chapter06/04.sql

こちらもAVG関数を使い、指定した列の平均値を求めるサンプルです。

上記のサンプルと同様に、class_idごとにグループ化し、各クラスにおける生徒のidの平均値を計算しています。

1-- AVG(平均値を求める)
2SELECT
3	class_id,
4	AVG(id)
5FROM
6	students
7WHERE
8	class_id IS NOT NULL
9GROUP BY
10	class_id
11ORDER BY
12	class_id;

sql/chapter06/05.sql

MIN関数は、指定した列に含まれる数値の中から最小値を求めます。

このサンプルコードでは、class_idごとにグループ化したデータに対して、各クラスに所属する生徒のidの中で最も小さい値をMIN(id)で探しています。

1-- MIN(最小値を求める)
2SELECT
3	class_id,
4	MIN(id)
5FROM
6	students
7WHERE
8	class_id IS NOT NULL
9GROUP BY
10	class_id
11ORDER BY
12	class_id;

sql/chapter06/06.sql

これまで紹介した集計関数は、1つのSQLクエリの中で同時に使用することができます。このサンプルでは、COUNT, SUM, AVG, MAX, MINの5つの集計関数を一度に使っています。

MAX関数はMIN関数とは逆で、指定した列の数値の中から最大値を求める関数です。

また、COUNT(*) AS 件数のようにASキーワードを使うことで、結果として表示される列名に別名(この場合は「件数」)を付けることができます。これにより、結果の表がより分かりやすくなります。

このクエリは、class_idごとに、生徒の人数、IDの合計値、平均値、最大値、最小値をまとめて計算し、表示します。

1-- COUNT / SUM / AVG / MIN / MAX の全部入り
2SELECT
3	class_id,
4	COUNT(*) AS 件数,
5	SUM(id) AS 合計,
6	AVG(id) AS 平均,
7	MAX(id) AS 最大値,
8	MIN(id) AS 最小値
9FROM
10	students
11WHERE
12	class_id IS NOT NULL
13GROUP BY
14	class_id
15ORDER BY
16	class_id;

おわりに

今回は、GROUP BY句を使って特定の列の値が同じデータをグループにまとめる方法を学習しました。COUNTSUMといった集計関数と組み合わせることで、クラスごとの生徒数のように、グループ単位での件数や合計値を簡単に算出できます。WHERE句でデータを絞り込んでからGROUP BY句でまとめるという、SQLの基本的な構文の順序を意識することが大切です。この機能はデータ集計の基本となる強力な武器ですので、ぜひ何度も練習して身につけてください。

【SQL】GROUP BY句の書き方と使い方の基本 | いっしー@Webエンジニア