カテゴリ: MySQL 更新日: 2026/03/20

MySQLのGROUP BYと複数カラム指定を完全解説!SQL初心者でもわかるデータのグループ化と集約関数の使い方

MySQLのGROUP BYと複数カラムの指定方法
MySQLのGROUP BYと複数カラムの指定方法

先生と生徒の会話形式で理解しよう

生徒

「SQLを勉強していると、GROUP BYってよく出てきますが、何をする命令なんですか?」

先生

「GROUP BYは、データをグループにまとめるためのSQL命令です。例えば、クラスのテスト結果を科目ごとにまとめたり、会社の売上を部署ごとに集計するときに使います。」

生徒

「グループにまとめるというのは、同じデータを集めるという意味ですか?」

先生

「その通りです。例えば、同じ部署の人をまとめたり、同じ年齢の人をまとめたりできます。GROUP BYを使うと、データを分類して集計できるようになります。」

生徒

「複数カラムのGROUP BYというのも見たんですが、それはどういう意味ですか?」

先生

「それは、2つ以上の列を組み合わせてグループを作る方法です。例えば、部署ごと、さらにその部署の役職ごとにまとめることができます。この記事で順番に説明していきます。」

1. MySQLのGROUP BYとは?データをグループ化するSQL命令

1. MySQLのGROUP BYとは?データをグループ化するSQL命令
1. MySQLのGROUP BYとは?データをグループ化するSQL命令

MySQLのGROUP BYは、データベースの中にあるデータを「同じ値ごとにまとめる」ためのSQL構文です。

データベースには、多くのレコードが保存されています。レコードとは、表の1行のデータのことです。例えば、会員情報や商品情報などが並んでいます。

しかし、データをそのまま表示するだけではなく、「同じ部署の人数」「同じ年齢の人数」などを知りたいことがあります。

このようなときに使うのがGROUP BYです。

GROUP BYは、特定のカラム(列)を基準にしてデータをグループにまとめます。そして、そのグループごとに集計を行うことができます。

このときによく一緒に使われるのが「集約関数」です。集約関数とは、複数のデータをまとめて計算する関数のことです。

例えば次のような関数があります。

  • COUNT:件数を数える
  • SUM:合計を計算する
  • AVG:平均を計算する
  • MAX:最大値を取得する
  • MIN:最小値を取得する

2. GROUP BYを使った基本的なSQLの書き方

2. GROUP BYを使った基本的なSQLの書き方
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を使うときの重要ルール

3. GROUP BYを使うときの重要ルール
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

4. 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を使った合計の集計

5. GROUP BYとSUMを使った合計の集計
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を使った平均値の計算

6. GROUP BYとAVGを使った平均値の計算
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でのデータ集計やデータ分析がとても効率よく行えるようになりますよ。」

カテゴリの一覧へ
新着記事
New1
MySQL
MySQLのGROUP BYと複数カラム指定を完全解説!SQL初心者でもわかるデータのグループ化と集約関数の使い方
New2
PostgreSQL
PostgreSQL入門:NATURAL JOINの仕組みと注意点を初心者向けに徹底解説!
New3
MySQL
MySQLのMAX・MIN関数の使い方を初心者向けに解説!GROUP BYと集約関数で最大値・最小値を取得するSQL入門
New4
PostgreSQL
PostgreSQLのCROSS JOIN完全解説|初心者でもわかる全組み合わせ取得SQL入門
人気記事
No.1
Java&Spring記事人気No1
PostgreSQL
PostgreSQLのUPDATE文の使い方(部分更新・条件更新)
No.2
Java&Spring記事人気No2
PostgreSQL
PostgreSQLユーザーとロール作成完全ガイド!初心者でもわかるデータベース権限管理
No.3
Java&Spring記事人気No3
PostgreSQL
PostgreSQLのORDER BYの基本(昇順・降順)
No.4
Java&Spring記事人気No4
PostgreSQL
PostgreSQLでスキーマを分割するメリット
No.5
Java&Spring記事人気No5
PostgreSQL
PostgreSQLでよく使うデータ型一覧(文字列・数値・日付)
No.6
Java&Spring記事人気No6
PostgreSQL
PostgreSQLのLIMITで件数を制限する方法
No.7
Java&Spring記事人気No7
PostgreSQL
PostgreSQLのLIKE検索(部分一致・前方一致)
No.8
Java&Spring記事人気No8
PostgreSQL
PostgreSQLスキーマ作成・削除完全ガイド!初心者でもわかるデータベース設計の基礎