カテゴリ: MySQL 更新日: 2026/01/16

MySQL GROUP BY完全マスター!集計関数でデータ分析を初心者から始める方法

MySQLのGROUP BYとは?初心者向けに解説
MySQLのGROUP BYとは?初心者向けに解説

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

生徒

「SQLってよく聞くんですけど、そもそも何をするものなんですか?」

先生

「SQLは、データベースに保存されているデータを、取り出したり、追加したり、変更したりするための言葉です。名簿や表を操作するための命令だと思ってください。」

生徒

「パソコンが苦手でも理解できますか?」

先生

「大丈夫です。表を見るところから順番に説明するので、紙の名簿を扱う感覚で理解できます。」

生徒

「データベース操作で、同じ項目ごとにまとめて計算したいときはどうすればいいですか?例えば、商品のカテゴリー別に売上合計を知りたい時です。」

先生

「それはまさに、今日解説するGROUP BYと集約関数を使う場面です。データをグループ分けして、それぞれのグループで合計や平均を計算するための重要な機能です。」

1. GROUP BYとは?データベースのグループ化を理解しよう

1. GROUP BYとは?データベースのグループ化を理解しよう
1. GROUP BYとは?データベースのグループ化を理解しよう

MySQLのGROUP BYは、データベースの中にある大量のデータを、同じ種類ごとにグループ分けするための命令です。初心者の方でも、エクセルでフィルターをかけてデータを見るようなイメージを持つと理解しやすいでしょう。

例えば、学校のクラスの名簿があったとします。クラスには「男子」「女子」がいますよね。この「性別」という項目でグループ分けしたいときに使うのがGROUP BYです。グループ分けした後、各グループについて「人数は何人?」「平均身長は?」といった計算をするために、集約関数(後で説明します)と一緒に使います。

グループ化という言葉が初めての方は、「データを種類別にまとめる作業」と覚えてください。SQLを学ぶ上で、データ分析や集計を行うための基本的な操作の一つです。

2. GROUP BYを使う前に知っておきたい基本のテーブル構造

2. GROUP BYを使う前に知っておきたい基本のテーブル構造
2. GROUP BYを使う前に知っておきたい基本のテーブル構造

まずは、実際のデータを見てみましょう。ここでは「sales(売上)」というテーブル(表)を例にします。データベースのテーブルは、エクセルのシートのようなものだと考えてください。

下の表は、あるお店の売上記録です。各レコード(行)が1回の売上を表しています。


id | product_name | category  | price | quantity | sale_date
---+--------------+-----------+-------+----------+------------
1  | Tシャツ      | アパレル  | 3000  | 2        | 2024-01-10
2  | ノートパソコン| 家電     | 120000| 1        | 2024-01-10
3  | ジーンズ     | アパレル  | 5000  | 1        | 2024-01-11
4  | スマートフォン| 家電    | 80000 | 1        | 2024-01-11
5  | シャツ       | アパレル  | 4000  | 3        | 2024-01-12
6  | イヤホン     | 家電     | 5000  | 2        | 2024-01-12
7  | 帽子         | アパレル  | 2500  | 1        | 2024-01-12
8  | タブレット   | 家電     | 60000 | 1        | 2024-01-13

この表を見て、「カテゴリー別に売上金額の合計が知りたい」と思ったことはありませんか?そんな時に活躍するのがGROUP BYです。MySQLのクエリ(質問文)を使って、データベースに指示を出します。

3. 集約関数の基本:COUNT, SUM, AVG, MAX, MIN

3. 集約関数の基本:COUNT, SUM, AVG, MAX, MIN
3. 集約関数の基本:COUNT, SUM, AVG, MAX, MIN

集約関数とは、複数のデータを1つにまとめて計算する関数のことです。関数という言葉が難しい方は、「計算機の特別なボタン」と思ってください。MySQLでよく使う集約関数は次の5つです。

  • COUNT() - データの数を数える(人数や件数)
  • SUM() - 合計を計算する(売上合計など)
  • AVG() - 平均を計算する(平均点など)
  • MAX() - 最大値を求める(最高得点など)
  • MIN() - 最小値を求める(最低価格など)

これらの集約関数は、通常、SELECT文の中でGROUP BYと一緒に使われます。SQL初心者の方が最初に覚えるべき重要な関数群です。

4. GROUP BYの基本構文と使い方

4. GROUP BYの基本構文と使い方
4. GROUP BYの基本構文と使い方

GROUP BYの基本的な書き方は以下の通りです。


SELECT グループ化する列名, 集約関数(計算する列名)
FROM テーブル名
GROUP BY グループ化する列名;

実際に先ほどの売上テーブルを使って、カテゴリー別の売上件数を調べてみましょう。


SELECT category, COUNT(*) as sales_count
FROM sales
GROUP BY category;

このSQLクエリを実行すると、次のような結果が得られます。


category | sales_count
---------+------------
アパレル | 4
家電     | 4

「COUNT(*)」はレコードの数を数えるという意味で、「as sales_count」は結果の列に「sales_count」という名前を付けています。GROUP BY categoryによって、category列の値が同じもの(アパレル同士、家電同士)がそれぞれ1つのグループにまとめられ、各グループの件数が計算されました。

このように、MySQLのGROUP BYを使うと、大量のデータから意味のある情報を簡単に抽出できます。データベース管理やWebアプリケーション開発でも頻繁に使用される重要な技術です。

5. 実際の例で学ぶGROUP BYと集約関数の組み合わせ

5. 実際の例で学ぶGROUP BYと集約関数の組み合わせ
5. 実際の例で学ぶGROUP BYと集約関数の組み合わせ

例1:カテゴリー別の売上金額合計を求める

次に、カテゴリー別に売上金額の合計を計算してみましょう。売上金額は「price(単価)× quantity(数量)」で計算できます。


SELECT category, SUM(price * quantity) as total_sales
FROM sales
GROUP BY category;

実行結果は以下のようになります。


category | total_sales
---------+------------
アパレル | 21500
家電     | 265000

SUM関数を使って、各カテゴリーの売上合計を計算しました。このように、MySQLでデータ分析を行う際、GROUP BYとSUMを組み合わせることは非常に一般的です。

例2:カテゴリー別の平均単価を求める

今度は、カテゴリー別の商品の平均単価を計算してみましょう。


SELECT category, AVG(price) as average_price
FROM sales
GROUP BY category;

実行結果:


category | average_price
---------+--------------
アパレル | 3625
家電     | 66250

AVG関数は平均値を計算する集約関数です。データベース操作を学ぶ初心者の方は、まずCOUNT、SUM、AVGの3つの関数から使い方を覚えることをおすすめします。

例3:日付別の売上件数を調べる

販売日(sale_date)ごとに、何件の売上があったかを調べてみましょう。


SELECT sale_date, COUNT(*) as daily_sales_count
FROM sales
GROUP BY sale_date
ORDER BY sale_date;

実行結果:


sale_date   | daily_sales_count
------------+------------------
2024-01-10  | 2
2024-01-11  | 2
2024-01-12  | 3
2024-01-13  | 1

ここでは、ORDER BYを追加して日付順に並び替えています。GROUP BYとORDER BYを組み合わせることで、より見やすい結果を得ることができます。SQL入門として、このような実践的なクエリを書けるようになると、データベースから必要な情報を自由に取り出せるようになります。

6. GROUP BYを使うときの注意点とよくある間違い

6. GROUP BYを使うときの注意点とよくある間違い
6. GROUP BYを使うときの注意点とよくある間違い

MySQLのGROUP BYを使い始めた初心者の方がよく陥る間違いを紹介します。

注意点1:SELECTで指定できる列の制限
GROUP BYを使った場合、SELECT句で指定できる列は以下の2種類だけです:

  1. GROUP BYで指定した列(グループ化の基準となった列)
  2. 集約関数を使った計算結果
他の列をSELECT句に書くと、エラーになったり意図しない結果になったりします。

注意点2:NULL値の扱い
GROUP BYでグループ化する列にNULL(空の値)が含まれている場合、NULL同士は1つのグループとしてまとめられます。データベース設計を考える際には、NULL値の扱いについても考慮する必要があります。

注意点3:グループ化の順序
複数の列でグループ化する場合は、カンマで区切って指定します。その場合、最初に指定した列で大グループを作り、次に指定した列でさらに細かいグループに分けられます。


-- カテゴリーと日付の両方でグループ化する例
SELECT category, sale_date, COUNT(*) as count
FROM sales
GROUP BY category, sale_date;

7. HAVING句でグループ化した結果をフィルターする

7. HAVING句でグループ化した結果をフィルターする
7. HAVING句でグループ化した結果をフィルターする

GROUP BYでグループ化した後、その結果に対して条件を指定したい場合はHAVING句を使います。WHERE句がグループ化前の個々の行に条件を指定するのに対し、HAVING句はグループ化後の結果に条件を指定します。

例えば、「売上件数が2件以上のカテゴリーだけを表示したい」場合は次のように書きます。


SELECT category, COUNT(*) as sales_count
FROM sales
GROUP BY category
HAVING COUNT(*) >= 2;

この例では全てのカテゴリーが2件以上なので、すべてのカテゴリーが表示されます。HAVING句は、集計結果に対して「合計が10000円以上」「平均が5000円以上」などの条件を指定するときに便利です。MySQLのクエリを書く際、WHEREとHAVINGの使い分けは重要なポイントです。

8. 実践的な応用例:ビジネスでのデータ分析

8. 実践的な応用例:ビジネスでのデータ分析
8. 実践的な応用例:ビジネスでのデータ分析

最後に、実際のビジネスシーンで役立つGROUP BYの応用例を紹介します。

例:月別・カテゴリー別の売上ランキング
月ごと、カテゴリーごとの売上合計を計算し、売上の高い順に並べるクエリです。


SELECT 
    DATE_FORMAT(sale_date, '%Y-%m') as sale_month,
    category,
    SUM(price * quantity) as monthly_sales
FROM sales
GROUP BY sale_month, category
ORDER BY sale_month, monthly_sales DESC;

このクエリでは:

  • DATE_FORMAT関数で日付から「年-月」の部分だけを取り出しています
  • 月とカテゴリーの2つの列でグループ化しています
  • 売上合計を計算しています
  • 月ごと、売上高い順に並べ替えています
このような分析は、ECサイトの運営や小売店の在庫管理、マーケティング戦略の立案など、さまざまな場面で活用できます。MySQLを使ったデータベース操作をマスターすれば、ビッグデータから価値のある情報を抽出するスキルが身につきます。

9. 初心者向け練習問題

9. 初心者向け練習問題
9. 初心者向け練習問題

学んだことを定着させるために、簡単な練習問題に挑戦してみましょう。

問題1: 売上テーブルから、各商品カテゴリーについて「販売された商品の合計数量」を求めてください。

問題2: 売上テーブルから、各販売日について「その日の総売上金額」を求め、売上金額の高い順に並べてください。

問題3: 売上テーブルから、平均単価が5000円以上のカテゴリーだけを表示してください。

これらの問題を解くことで、MySQLのGROUP BYと集約関数の基本的な使い方を実践的に学ぶことができます。SQLの学習は、実際に手を動かしてクエリを書くことが上達の近道です。データベースプログラミングに興味がある方は、ぜひ実際のMySQL環境で試してみてください。

データベースの操作は最初は難しく感じるかもしれませんが、GROUP BYと集約関数の基本を理解すれば、データから有益な情報を引き出す第一歩を踏み出せます。日常業務でのデータ分析や、Webアプリケーション開発にも応用できる重要なスキルですので、焦らず一歩ずつ学習を進めていきましょう。

カテゴリの一覧へ
新着記事
New1
PostgreSQL
PostgreSQLのLIMIT・OFFSETとパフォーマンス問題を完全解説|初心者でもわかる安全な使い方
New2
MySQL
MySQLのUPDATE文でデータを更新する基本を徹底解説|SQL初心者でもわかるデータベース更新入門
New3
PostgreSQL
PostgreSQLのOFFSET完全入門|並び替えと組み合わせてデータをスキップする方法を初心者向けに解説
New4
MySQL
MySQLで複数行INSERTを行う方法と注意点を徹底解説|SQL基礎から学ぶデータベース入門
人気記事
No.1
Java&Spring記事人気No1
PostgreSQL
PostgreSQLのDISTINCT完全ガイド|SQLで重複データを除外する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
PostgreSQL
PostgreSQLの主キー・外部キーを完全解説!初心者でもわかる設定方法と考え方
No.3
Java&Spring記事人気No3
PostgreSQL
PostgreSQLのUPDATE文の使い方(部分更新・条件更新)
No.4
Java&Spring記事人気No4
PostgreSQL
PostgreSQLとは?初心者向けに特徴をわかりやすく解説
No.5
Java&Spring記事人気No5
PostgreSQL
PostgreSQLのLEFT JOIN完全入門!不足データを補いながらテーブル結合する仕組みをやさしく解説
No.6
Java&Spring記事人気No6
PostgreSQL
PostgreSQLスキーマ設計のベストプラクティス完全ガイド|初心者でもわかるデータベース整理術
No.7
Java&Spring記事人気No7
PostgreSQL
PostgreSQLのpublicスキーマの役割と扱い方
No.8
Java&Spring記事人気No8
PostgreSQL
PostgreSQLの権限管理を完全解説|スキーマ単位で理解するデータベースセキュリティの基礎