MySQLのGROUP BYと複数カラム指定を完全解説!SQL初心者でもわかるデータのグループ化と集約関数の使い方
生徒
「SQLを勉強していると、GROUP BYってよく出てきますが、何をする命令なんですか?」
先生
「GROUP BYは、データをグループにまとめるためのSQL命令です。例えば、クラスのテスト結果を科目ごとにまとめたり、会社の売上を部署ごとに集計するときに使います。」
生徒
「グループにまとめるというのは、同じデータを集めるという意味ですか?」
先生
「その通りです。例えば、同じ部署の人をまとめたり、同じ年齢の人をまとめたりできます。GROUP BYを使うと、データを分類して集計できるようになります。」
生徒
「複数カラムのGROUP BYというのも見たんですが、それはどういう意味ですか?」
先生
「それは、2つ以上の列を組み合わせてグループを作る方法です。例えば、部署ごと、さらにその部署の役職ごとにまとめることができます。この記事で順番に説明していきます。」
1. MySQLのGROUP BYとは?データをグループ化するSQL命令
MySQLのGROUP BYは、データベースの中にあるデータを「同じ値ごとにまとめる」ためのSQL構文です。
データベースには、多くのレコードが保存されています。レコードとは、表の1行のデータのことです。例えば、会員情報や商品情報などが並んでいます。
しかし、データをそのまま表示するだけではなく、「同じ部署の人数」「同じ年齢の人数」などを知りたいことがあります。
このようなときに使うのがGROUP BYです。
GROUP BYは、特定のカラム(列)を基準にしてデータをグループにまとめます。そして、そのグループごとに集計を行うことができます。
このときによく一緒に使われるのが「集約関数」です。集約関数とは、複数のデータをまとめて計算する関数のことです。
例えば次のような関数があります。
- COUNT:件数を数える
- SUM:合計を計算する
- AVG:平均を計算する
- MAX:最大値を取得する
- MIN:最小値を取得する
2. GROUP BYを使った基本的なSQLの書き方
まずはGROUP BYの基本的な書き方を確認しましょう。
SELECT カラム名, 集約関数
FROM テーブル名
GROUP BY カラム名;
それでは、部署ごとの人数を調べる例を見てみましょう。
SQL実行前のテーブル
id | name | department
---+------------+-----------
1 | 山田太郎 | 営業
2 | 佐藤花子 | 営業
3 | 鈴木一郎 | 開発
4 | 高橋健 | 開発
5 | 田中美咲 | 開発
6 | 伊藤誠 | 人事
SELECT department, COUNT(*) AS 人数
FROM employees
GROUP BY department;
SQL実行結果
department | 人数
-----------+-----
営業 | 2
開発 | 3
人事 | 1
このSQLでは、department(部署)ごとにデータをまとめてCOUNTで人数を数えています。
3. GROUP BYを使うときの重要ルール
GROUP BYを使うときには、大切なルールがあります。
SELECTに書いたカラムのうち、集約関数を使っていないカラムは、必ずGROUP BYに指定する必要があります。
例えば次のSQLは正しい書き方です。
SELECT department, COUNT(*)
FROM employees
GROUP BY department;
departmentはGROUP BYで指定されているので問題ありません。
しかし、次のようなSQLはエラーになることがあります。
SELECT department, name
FROM employees
GROUP BY department;
この場合、nameはグループ化されていないため、どの名前を表示すればよいかMySQLが判断できなくなります。
そのため、GROUP BYを使うときは「グループ化する列」を正しく指定することが重要です。
4. MySQLで複数カラムを指定するGROUP BY
GROUP BYは、1つのカラムだけでなく、複数のカラムを指定することもできます。
複数カラムのGROUP BYとは、2つ以上の列の組み合わせでグループを作る方法です。
例えば、「部署」と「役職」の組み合わせごとに人数を調べることができます。
SQL実行前のテーブル
id | name | department | position
---+------------+------------+---------
1 | 山田太郎 | 営業 | 主任
2 | 佐藤花子 | 営業 | 一般
3 | 鈴木一郎 | 開発 | 主任
4 | 高橋健 | 開発 | 一般
5 | 田中美咲 | 開発 | 一般
6 | 伊藤誠 | 営業 | 一般
SELECT department, position, COUNT(*) AS 人数
FROM employees
GROUP BY department, position;
SQL実行結果
department | position | 人数
-----------+----------+-----
営業 | 主任 | 1
営業 | 一般 | 2
開発 | 主任 | 1
開発 | 一般 | 2
このように複数カラムのGROUP BYを使うと、より細かくデータを分類することができます。
5. GROUP BYとSUMを使った合計の集計
GROUP BYは、合計金額などの集計にもよく使われます。
SUMは「合計」を計算する集約関数です。
SQL実行前のテーブル
id | product | category | price
---+-----------+----------+------
1 | ノートPC | 電子機器 | 80000
2 | マウス | 電子機器 | 3000
3 | 机 | 家具 | 20000
4 | 椅子 | 家具 | 10000
5 | キーボード| 電子機器 | 5000
SELECT category, SUM(price) AS 合計金額
FROM products
GROUP BY category;
SQL実行結果
category | 合計金額
---------+---------
電子機器 | 88000
家具 | 30000
このように、カテゴリごとの売上などを簡単に集計できます。
6. GROUP BYとAVGを使った平均値の計算
平均値を計算したい場合はAVG関数を使います。
AVGはAverageの略で、平均を意味する集約関数です。
SQL実行前のテーブル
id | name | department | salary
---+------------+------------+-------
1 | 山田太郎 | 営業 | 300000
2 | 佐藤花子 | 営業 | 320000
3 | 鈴木一郎 | 開発 | 400000
4 | 高橋健 | 開発 | 420000
5 | 田中美咲 | 開発 | 380000
SELECT department, AVG(salary) AS 平均給与
FROM employees
GROUP BY department;
SQL実行結果
department | 平均給与
-----------+---------
営業 | 310000
開発 | 400000
このように、部署ごとの平均給与なども簡単に求めることができます。
まとめ
ここまで、MySQLのGROUP BYの基本から、複数カラムのGROUP BY、そして集約関数との組み合わせまで詳しく学習してきました。GROUP BYは、SQLの中でも非常に重要な機能であり、データベースに保存されている大量のデータを整理し、意味のある形で分析するために欠かせない構文です。データベースを扱う多くのシステムでは、単にデータを取得するだけではなく、売上の集計、人数のカウント、平均値の計算などを行う必要があります。そのような場面で活躍するのがGROUP BYです。
GROUP BYを理解するためには、まず「グループ化」という考え方を理解することが大切です。データベースのテーブルには、多くのレコードが保存されています。しかし、それらを一つ一つ確認するだけでは、全体の傾向や特徴を把握することは難しい場合があります。そこで、同じ値を持つデータをまとめてグループを作り、そのグループごとにデータを集計することで、情報を分かりやすく整理できます。
例えば、社員テーブルがあるとします。このテーブルには社員の名前や部署、給与などの情報が保存されています。もし会社の部署ごとの人数を知りたい場合、GROUP BYを使うことで簡単に集計できます。GROUP BYはSQLのSELECT文と組み合わせて使用し、特定のカラムを基準としてデータをグループ化します。
GROUP BYの基本構文
SELECT カラム名, 集約関数
FROM テーブル名
GROUP BY カラム名;
この構文では、GROUP BYの後ろに指定したカラムを基準としてデータがまとめられます。そして、COUNTやSUM、AVGなどの集約関数を使うことで、グループごとの集計結果を取得できます。例えば、部署ごとの人数を調べたい場合はCOUNT関数を使います。
GROUP BYとCOUNTの基本例
SQL実行前のテーブル
id | name | department
---+------------+-----------
1 | 山田太郎 | 営業
2 | 佐藤花子 | 営業
3 | 鈴木一郎 | 開発
4 | 高橋健 | 開発
5 | 田中美咲 | 開発
6 | 伊藤誠 | 人事
SELECT department, COUNT(*) AS 人数
FROM employees
GROUP BY department;
SQL実行結果
department | 人数
-----------+-----
営業 | 2
開発 | 3
人事 | 1
このSQLでは、department列の値ごとにグループを作り、そのグループごとにCOUNT関数を使って人数を数えています。このようにGROUP BYを使うと、データをグループごとに分類しながら統計情報を取得することができます。
複数カラムのGROUP BY
GROUP BYは1つのカラムだけでなく、複数カラムを組み合わせてグループを作ることもできます。複数カラムのGROUP BYを使うと、より細かい分類でデータを整理することが可能になります。例えば、部署と役職の組み合わせで人数を集計することができます。
SQL実行前のテーブル
id | name | department | position
---+------------+------------+---------
1 | 山田太郎 | 営業 | 主任
2 | 佐藤花子 | 営業 | 一般
3 | 鈴木一郎 | 開発 | 主任
4 | 高橋健 | 開発 | 一般
5 | 田中美咲 | 開発 | 一般
6 | 伊藤誠 | 営業 | 一般
7 | 小林直樹 | 人事 | 一般
SELECT department, position, COUNT(*) AS 人数
FROM employees
GROUP BY department, position;
SQL実行結果
department | position | 人数
-----------+----------+-----
営業 | 主任 | 1
営業 | 一般 | 2
開発 | 主任 | 1
開発 | 一般 | 2
人事 | 一般 | 1
このように複数カラムのGROUP BYを使うと、部署ごとだけでなく役職ごとの人数も同時に確認できるようになります。データ分析や業務システムでは、このような複合条件での集計がよく使われます。
GROUP BYとSUMを使った売上集計
GROUP BYは、売上データや商品データの集計でも頻繁に利用されます。SUM関数を使うことで、カテゴリごとの売上合計などを簡単に求めることができます。
SQL実行前のテーブル
id | product | category | price
---+-------------+----------+------
1 | ノートPC | 電子機器 | 80000
2 | マウス | 電子機器 | 3000
3 | キーボード | 電子機器 | 5000
4 | 机 | 家具 | 20000
5 | 椅子 | 家具 | 10000
6 | 本棚 | 家具 | 15000
SELECT category, SUM(price) AS 合計金額
FROM products
GROUP BY category;
SQL実行結果
category | 合計金額
---------+---------
電子機器 | 88000
家具 | 45000
このようにGROUP BYとSUMを組み合わせることで、カテゴリごとの売上合計などを簡単に算出できます。データベースのレポート作成やビジネス分析では、このような集計処理が日常的に行われています。
また、GROUP BYはAVG、MAX、MINなどの集約関数とも組み合わせることができます。平均値、最大値、最小値などをグループ単位で計算することで、データの特徴を把握しやすくなります。例えば部署ごとの平均給与、商品カテゴリごとの最高価格などを簡単に求めることができます。
SQLを学習していくと、データを取得するSELECT文だけではなく、データを分析するためのSQLも必要になってきます。GROUP BYは、そのようなデータ分析SQLの基本となる構文です。MySQLを使ったデータベース開発では、業務システム、販売管理システム、在庫管理システムなどさまざまな場面でGROUP BYが活躍します。
最初は少し難しく感じるかもしれませんが、実際にSQLを書きながら練習していくと、GROUP BYの使い方が自然に理解できるようになります。特に、COUNT、SUM、AVGなどの集約関数と組み合わせたSQLを何度も書いてみることで、データの集計処理を効率よく行えるようになります。
MySQLのGROUP BYと複数カラム指定の使い方をしっかり理解しておくことで、SQLによるデータ分析やデータ集計のスキルが大きく向上します。データベースを扱うエンジニアやプログラマーにとって、GROUP BYは必ず身につけておきたい重要なSQL構文の一つです。
生徒
「GROUP BYって、最初は難しそうに感じましたが、データを同じ値ごとにまとめるためのSQLなんですね。」
先生
「その通りです。MySQLのGROUP BYは、データベースのレコードを分類して集計するための基本的なSQL構文です。特にCOUNT、SUM、AVGなどの集約関数と組み合わせて使うことが多いですね。」
生徒
「部署ごとの人数を数えるSQLでは、COUNTを使っていましたね。GROUP BY departmentと書くことで、部署ごとにグループ化されるんですね。」
先生
「はい。その仕組みを理解すると、データ分析がとても簡単になります。例えば売上データならカテゴリごとの売上合計、社員データなら部署ごとの平均給与などを簡単に求めることができます。」
生徒
「複数カラムのGROUP BYも便利ですね。部署と役職の組み合わせで人数を数えるSQLは、とても実務で使われそうだと思いました。」
先生
「その通りです。複数カラムのGROUP BYを使うと、より細かい分類でデータを集計できます。MySQLのデータベース設計やSQL分析ではとても重要なテクニックです。」
生徒
「これからSQLを書くときは、GROUP BYと集約関数を意識して練習してみます。」
先生
「ぜひ実際にSQLを書いて試してみてください。GROUP BYを使いこなせるようになると、MySQLでのデータ集計やデータ分析がとても効率よく行えるようになりますよ。」