データベースに格納されたデータを、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句を使いこなせるようにチャレンジしてみてください。