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

MySQL GROUP BYの使い方ガイド|データ集計で売上分析や顧客管理を効率化

MySQLのGROUP BYで何ができるのかを理解する
MySQLのGROUP BYで何ができるのかを理解する

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

生徒

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

先生

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

生徒

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

先生

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

1. SQLとは何か?データベース操作の基本を理解しよう

1. SQLとは何か?データベース操作の基本を理解しよう
1. SQLとは何か?データベース操作の基本を理解しよう

SQL(エスキューエル)は、データベースという「大量の情報を整理して保管するシステム」と会話するための言語です。例えば、あなたがEメールの受信トレイを「送信者別」にまとめたり、「日付順」に並べ替えたりするのと同じように、SQLを使うとデータベースの中にある情報を自由に集計・整理できます。データベース初心者でも、SQLを覚えれば大量のデータを簡単に分析することができるようになります。MySQLは、そのSQLを使えるデータベースシステムの一つで、世界中のウェブサイトやアプリで使われています。

2. GROUP BYで何ができるのか?基本の「グループ化」を解説

2. GROUP BYで何ができるのか?基本の「グループ化」を解説
2. GROUP BYで何ができるのか?基本の「グループ化」を解説

GROUP BY(グループバイ)は、データを「グループ分け」してまとめるための、SQLのとても便利な機能です。データベース操作で必須の技と言えるでしょう。例えば、学校のクラスの名簿があったとして、「クラスごとの人数」を知りたいと思いませんか? そんな時にGROUP BYが活躍します。GROUP BYを使うと、バラバラに存在するデータを、同じ特徴を持つグループごとにひとまとめにできます。これはデータ分析、例えば「商品カテゴリー別の売上合計」や「都道府県別の顧客数」などを調べる時に非常に役立ちます。

3. 集約関数と組み合わせてこそ真価を発揮!SUMやCOUNTとは

3. 集約関数と組み合わせてこそ真価を発揮!SUMやCOUNTとは
3. 集約関数と組み合わせてこそ真価を発揮!SUMやCOUNTとは

GROUP BYだけでは、グループ分けはできても「集計」はできません。ここで必要になるのが集約関数(しゅうごうかんすう)です。これは、データを集めて何らかの計算結果(合計や平均など)を出すための特別な関数です。主な集約関数は以下の5つです。この5つを覚えるだけで、データベースを使った分析の幅が大きく広がります。

  • COUNT(カウント): データの行数を数えます。
  • SUM(サム): 数値データの合計を計算します。
  • AVG(アベレージ): 数値データの平均値を計算します。
  • MAX(マックス): データの中から最大値を探します。
  • MIN(ミニマム): データの中から最小値を探します。

この集約関数をGROUP BYと一緒に使うことで、「各グループの合計は?」「各グループの平均は?」といった分析が可能になるのです。MySQLでのデータ集計は、この組み合わせが基本です。

4. 実践!商品売上テーブルでGROUP BYを体験してみよう

4. 実践!商品売上テーブルでGROUP BYを体験してみよう
4. 実践!商品売上テーブルでGROUP BYを体験してみよう

それでは、具体的な例を見ながら理解を深めましょう。ここでは、あるオンラインショップの「売上履歴」を記録したテーブルがあると想定します。まずはテーブルの中身を確認します。

【売上履歴テーブル (sales_history)】


id | product_category | product_name | sales_amount | sale_date
---+------------------+--------------+--------------+------------
1  | 野菜             | トマト       | 300          | 2023-10-01
2  | 野菜             | キャベツ     | 200          | 2023-10-01
3  | 果物             | りんご       | 150          | 2023-10-01
4  | 野菜             | トマト       | 300          | 2023-10-02
5  | 果物             | バナナ       | 100          | 2023-10-02
6  | 飲料             | 緑茶         | 150          | 2023-10-02
7  | 果物             | りんご       | 150          | 2023-10-03
8  | 飲料             | コーヒー     | 200          | 2023-10-03

例1: 商品カテゴリー別の売上金額の合計を知りたい
「野菜」「果物」「飲料」というグループ(カテゴリー)ごとに、sales_amount(売上金額)を合計したい場合です。


SELECT product_category, SUM(sales_amount) AS total_sales
FROM sales_history
GROUP BY product_category;

このSQL文では、GROUP BY product_categoryで商品カテゴリーごとにグループ化し、SUM(sales_amount)で各グループの売上金額を合計しています。AS total_salesは、計算結果の列に「total_sales」というわかりやすい名前を付けるためのものです。結果は以下のようになります。


product_category | total_sales
-----------------+-------------
野菜             | 800
果物             | 400
飲料             | 350

これで、「野菜カテゴリーが800円」「果物カテゴリーが400円」というように、商品カテゴリー別の売上合計が一目瞭然になりました。データ分析の第一歩です。

例2: 商品カテゴリー別に、販売された商品の種類数を数えたい
次に、各カテゴリーで「何種類の商品」が売れたのかを知りたい場合です。この場合はCOUNT関数を使います。


SELECT product_category, COUNT(*) AS number_of_products
FROM sales_history
GROUP BY product_category;

COUNT(*)は、各行を数える(レコード数を数える)という意味です。実行結果は以下の通りです。


product_category | number_of_products
-----------------+--------------------
野菜             | 3
果物             | 3
飲料             | 2

野菜カテゴリーのレコードが3行(トマト×2、キャベツ×1)、果物カテゴリーが3行(りんご×2、バナナ×1)、飲料カテゴリーが2行(緑茶×1、コーヒー×1)あることがわかります。これで商品ラインナップの傾向が分析できます。

5. さらに応用!日付別の売上を集計してみる

5. さらに応用!日付別の売上を集計してみる
5. さらに応用!日付別の売上を集計してみる

GROUP BYは、カテゴリーだけでなく、日付ごとにまとめることも得意です。今度は「日付別の総売上」を調べてみましょう。


SELECT sale_date, SUM(sales_amount) AS daily_sales
FROM sales_history
GROUP BY sale_date;

このクエリでは、sale_date(販売日)でグループ化しています。結果は以下のようになります。


sale_date  | daily_sales
-----------+-------------
2023-10-01 | 650
2023-10-02 | 550
2023-10-03 | 350

これで、10月1日は650円、2日は550円、3日は350円の売上だったことがわかり、日々の売上推移が把握できます。このように、GROUP BYと集約関数を使いこなせば、売上管理や在庫管理がデータベース上でとても効率的に行えます。

6. よくある間違いと注意点 HAVING句の役割

6. よくある間違いと注意点 HAVING句の役割
6. よくある間違いと注意点 HAVING句の役割

GROUP BYを使い始めると、こんな疑問が出てくるかもしれません。「集計した後の結果に対して条件を付けたいときはどうするの?」。例えば、「売上合計が500円以上のカテゴリーだけを表示したい」場合です。
ここで間違えやすいのが、WHERE句を使うことです。WHERE句はグループ化される前の元のデータに対して条件を指定します。グループ化後の結果に条件を付けたいときは、HAVING(ヘビング)句を使います。

例: 売上合計が500円以上の商品カテゴリーを抽出


-- WHEREではできない(エラーになるか、意図しない結果に)
-- SELECT product_category, SUM(sales_amount) AS total_sales
-- FROM sales_history
-- WHERE SUM(sales_amount) >= 500 -- ここが間違い!
-- GROUP BY product_category;

-- 正しくはHAVINGを使う
SELECT product_category, SUM(sales_amount) AS total_sales
FROM sales_history
GROUP BY product_category
HAVING total_sales >= 500;

実行結果:


product_category | total_sales
-----------------+-------------
野菜             | 800

このように、HAVING句を使うことで、集計結果(ここではtotal_sales)に対して「500以上」という条件をかけることができ、野菜カテゴリーのみが抽出されました。WHEREとHAVINGの使い分けは、MySQLを活用する上で重要なポイントです。

カテゴリの一覧へ
新着記事
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とは?初心者向けに特徴をわかりやすく解説
No.4
Java&Spring記事人気No4
PostgreSQL
PostgreSQLのLEFT JOIN完全入門!不足データを補いながらテーブル結合する仕組みをやさしく解説
No.5
Java&Spring記事人気No5
PostgreSQL
PostgreSQLのUPDATE文の使い方(部分更新・条件更新)
No.6
Java&Spring記事人気No6
PostgreSQL
PostgreSQLスキーマ設計のベストプラクティス完全ガイド|初心者でもわかるデータベース整理術
No.7
Java&Spring記事人気No7
PostgreSQL
PostgreSQLの権限管理を完全解説|スキーマ単位で理解するデータベースセキュリティの基礎
No.8
Java&Spring記事人気No8
PostgreSQL
PostgreSQLのpublicスキーマの役割と扱い方