MySQL GROUP BY完全マスター!集計関数でデータ分析を初心者から始める方法
生徒
「SQLってよく聞くんですけど、そもそも何をするものなんですか?」
先生
「SQLは、データベースに保存されているデータを、取り出したり、追加したり、変更したりするための言葉です。名簿や表を操作するための命令だと思ってください。」
生徒
「パソコンが苦手でも理解できますか?」
先生
「大丈夫です。表を見るところから順番に説明するので、紙の名簿を扱う感覚で理解できます。」
生徒
「データベース操作で、同じ項目ごとにまとめて計算したいときはどうすればいいですか?例えば、商品のカテゴリー別に売上合計を知りたい時です。」
先生
「それはまさに、今日解説するGROUP BYと集約関数を使う場面です。データをグループ分けして、それぞれのグループで合計や平均を計算するための重要な機能です。」
1. GROUP BYとは?データベースのグループ化を理解しよう
MySQLのGROUP BYは、データベースの中にある大量のデータを、同じ種類ごとにグループ分けするための命令です。初心者の方でも、エクセルでフィルターをかけてデータを見るようなイメージを持つと理解しやすいでしょう。
例えば、学校のクラスの名簿があったとします。クラスには「男子」「女子」がいますよね。この「性別」という項目でグループ分けしたいときに使うのがGROUP BYです。グループ分けした後、各グループについて「人数は何人?」「平均身長は?」といった計算をするために、集約関数(後で説明します)と一緒に使います。
グループ化という言葉が初めての方は、「データを種類別にまとめる作業」と覚えてください。SQLを学ぶ上で、データ分析や集計を行うための基本的な操作の一つです。
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
集約関数とは、複数のデータを1つにまとめて計算する関数のことです。関数という言葉が難しい方は、「計算機の特別なボタン」と思ってください。MySQLでよく使う集約関数は次の5つです。
- COUNT() - データの数を数える(人数や件数)
- SUM() - 合計を計算する(売上合計など)
- AVG() - 平均を計算する(平均点など)
- MAX() - 最大値を求める(最高得点など)
- MIN() - 最小値を求める(最低価格など)
これらの集約関数は、通常、SELECT文の中でGROUP BYと一緒に使われます。SQL初心者の方が最初に覚えるべき重要な関数群です。
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と集約関数の組み合わせ
例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を使うときの注意点とよくある間違い
MySQLのGROUP BYを使い始めた初心者の方がよく陥る間違いを紹介します。
注意点1:SELECTで指定できる列の制限
GROUP BYを使った場合、SELECT句で指定できる列は以下の2種類だけです:
- GROUP BYで指定した列(グループ化の基準となった列)
- 集約関数を使った計算結果
注意点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句でグループ化した結果をフィルターする
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. 実践的な応用例:ビジネスでのデータ分析
最後に、実際のビジネスシーンで役立つ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つの列でグループ化しています
- 売上合計を計算しています
- 月ごと、売上高い順に並べ替えています
9. 初心者向け練習問題
学んだことを定着させるために、簡単な練習問題に挑戦してみましょう。
問題1: 売上テーブルから、各商品カテゴリーについて「販売された商品の合計数量」を求めてください。
問題2: 売上テーブルから、各販売日について「その日の総売上金額」を求め、売上金額の高い順に並べてください。
問題3: 売上テーブルから、平均単価が5000円以上のカテゴリーだけを表示してください。
これらの問題を解くことで、MySQLのGROUP BYと集約関数の基本的な使い方を実践的に学ぶことができます。SQLの学習は、実際に手を動かしてクエリを書くことが上達の近道です。データベースプログラミングに興味がある方は、ぜひ実際のMySQL環境で試してみてください。
データベースの操作は最初は難しく感じるかもしれませんが、GROUP BYと集約関数の基本を理解すれば、データから有益な情報を引き出す第一歩を踏み出せます。日常業務でのデータ分析や、Webアプリケーション開発にも応用できる重要なスキルですので、焦らず一歩ずつ学習を進めていきましょう。