Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

データベースに格納されたデータを、1つのカテゴリとして集計したい場面は実務上多いものです。

本記事では、SQLのGROUP BY句を利用したデータ集計の方法について、サンプルコードを交えながらご紹介していきます。

SQLのGROUP BY句


SQLで利用可能な「GROUP BY」句は、指定したキー項目単位でグループ化することが出来る命令文です。

基本構文

SQLでGROUP BY句を利用する際の基本構文は下記の通りです。

SELECT カラム名[, カラム名, ...]
FROM テーブル名
[WHERE 条件式]
GROUP BY カラム名[, カラム名, ...];

注意点

GROUP BY句を利用してデータを取得する場合、SELECT句に指定出来るカラムは、GROPU BY句に指定した項目か集計関数のみです。

テーブルにカラムが存在するとしても、グループ化の条件に指定していないデータを取得することは出来ません。

集計関数とは

集計関数という新たな用語が出てきましたが、下記のような関数を指します。

集計関数一覧
  • SUM: 合計を計算
  • AVG: 平均を計算
  • COUNT: レコード数を計算
  • MAX: 項目の最大値を取得
  • MIN: 項目の最小値を取得

GROUP BY句とセットで利用することで、グループ化した項目の様々な集計処理が可能となります。

SQLのGROUP BY句をサンプルで理解しよう


ではここからはサンプルデータを使って、実際の使い方についてご紹介していきます。

サンプルデータ

今回は「animal」という名前でテーブルを作成し、下記のデータを用意しました。

+------+--------+------+------+
| id   | name   | age  | type |
+------+--------+------+------+
|    1 | ハチ   |    5  | dog  |
|    2 | たま   |    2  | cat  |
|    3 | ポチ   |    4  | dog  |
|    4 | しろ   |    7  | cat  |
|    5 | もこ   |    3  | bird |
|    6 | まる   |    5  | dog  |
+------+--------+------+------+

グループ化してデータを取得する

GROUP BY句を使ったSELECT文でデータを取得しましょう。

「type」項目をグループ化のキー項目としてデータを取得すると下記のような表示となります。

mysql> select type from animal group by type;
+------+
| type |
+------+
| dog  |
| cat  |
| bird |
+------+
3 rows in set (0.01 sec)

重複が取り除かれ、グループ化出来た名称が表示されています。

集計関数を利用する

続いて、集計関数を用いてグループ化したデータの件数を取得してみましょう。

mysql> select type, count(type) from animal group by type;
+------+-------------+
| type | count(type) |
+------+-------------+
| dog  |           3 |
| cat  |           2 |
| bird |           1 |
+------+-------------+
3 rows in set (0.00 sec)

グループ化された各項目の件数を計算し、表示しています。

複数キーのグループ化

グループ化する条件は2つ以上の項目を設定することも可能です。

今回は「type」と「age」項目をグループ化の条件に設定してみましょう。

mysql> select type, age, count(type) from animal group by type, age;
+------+------+-------------+
| type | age  | count(type) |
+------+------+-------------+
| dog  |    5 |           2 |
| cat  |    2 |           1 |
| dog  |    4 |           1 |
| cat  |    7 |           1 |
| bird |    3 |           1 |
+------+------+-------------+
5 rows in set (0.00 sec)

「type」項目が「dog」、「age」が「5」のデータのみが複数件存在することをご確認頂けます。

GROUP BY句で条件を指定する


グループ化するデータを条件によって絞りこむことも可能です。

通常SQLでは「WHERE」句を利用しますが、GROUP BY句では「HAVING」句による条件指定も利用可能です。

WHERE句によるグループ化の条件指定

まずはWHERE句を利用してグループ化するデータを絞り込んでみましょう。

「type」列が「dog」のデータのみを抽出条件に指定しています。

mysql> select type, count(type) from animal where type="dog" group by type;
+------+-------------+
| type | count(type) |
+------+-------------+
| dog  |           3 |
+------+-------------+
1 row in set (0.00 sec)

HAVING句によるグループ化の条件指定

では同様の条件指定をHAVING句を利用して記述してみましょう。

「HAVING 条件式」の形式で、GROUP BY句の後ろに記述します。

mysql> select type, count(type) from animal group by type having type="dog";
+------+-------------+
| type | count(type) |
+------+-------------+
| dog  |           3 |
+------+-------------+
1 row in set (0.00 sec)

同じ結果が取得出来ていますね。

WHERE句とHAVING句で何が違う?

結果が同じであれば、WHERE句とHAVING句で何が違うのか気になるところですよね。

両者の違いは、実行される順番が異なる点です。

「WHERE」句はグループ化の前に実行され、「HAVING」句はグループ化の後に実行されます。

例えば、2件以上のデータが存在するグループのみを抽出したい場合、WHERE句に記述すると下記のようなエラーとなり

mysql> select type, count(type) as type_count from animal where type_count > 2  group by type;
ERROR 1054 (42S22): Unknown column 'type_count' in 'where clause'

HAVING句に記述すると

mysql> select type, count(type) as type_count from animal group by type having type_count > 2;
+------+------------+
| type | type_count |
+------+------------+
| dog  |          3 |
+------+------------+
1 row in set (0.00 sec)

HAVING句では条件式として機能します。

さいごに: SQLのGROUP BY句を利用した集計処理は実務に必須の知識


本記事では、SQLでGROUP BY句を利用したデータ集計の方法についてご紹介してきました。

データの集計処理は業務系のシステム開発を中心に頻出処理の1つです。

初心者の方には、WHERE句とHAVING句の違いなどを含めて、少しややこしく感じる部分もあるかと思いますが、1つ1つ確実に理解しGROUP BY句を使いこなせるようにチャレンジしてみてください。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。