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