データをグループ化

広告

count関数などを使ってカラムの値を集計する場合、集計はグループ単位で行われます。グループとは特定のカラムに格納されている同じ値を持つデータをまとめたもので、どのカラムを対象にグループ化するのかを指定するにはGROUP BY句を使用します。書式は次の通りです。

SELECT col_name, ... FROM tbl_name GROUP BY col_name, ...;

GROUP BY句の後にカラム名を指定すると、そのカラム名に格納されている値が同じデータをグループとしてまとめます。複数のカラム名を指定した場合、複数のカラムの値の組み合わせが同じデータをグループとしてまとめます。

グループ化するとSELECT文で取得できるデータの数はグループの数だけとなります。そこでグループ化を行った場合には、グループ化に指定したカラムの値や、用意された関数を使ってカラムの値をグループ単位で集計した結果などを取得することができます。

例えば次のように記述します。

SELECT category FROM goodslist GROUP BY category;

「category」カラムの値でグループ化を行い、グループ毎に「category」カラムの値を取得します。

SELECT AVG(price) FROM goodslist GROUP BY category;

「category」カラムの値でグループ化を行い、グループ毎に「price」カラムの値の平均を計算しその結果を取得します。

昇順と降順の指定

GROUP BY句を使ってグループ化が行われると、グループ化の対象となったカラムの値で昇順に並べ替えを行った後でデータを取得します。並べ替えを降順で行いたい場合には次の書式を使います。

SELECT col_name, ... FROM tbl_name GROUP BY col_name [ASC | DESC], ...;

ASCを指定すると昇順、DESCを指定すると降順で並べ替えを行います。省略した場合はASCを指定したものと見なされます。

サンプル

実際に試してみます。まず次のようなテーブルを作成します。

mysql> create table salarylist(salary int, pref varchar(20));

p9-1

テーブルには次のようなデータを追加してあります。

p9-2

では「pref」カラムの値を使ってグループ化を行い、グループ毎に「salary」カラムの値の平均を取得します。

mysql> select pref, avg(salary) from salarylist group by pref;

p9-3

またデフォルトではグループ化の対象となった「pref」カラムの値を昇順に並べ替えたものを取得しますが、降順に並べ替えてから取得することもできます。次のように入力して下さい。

mysql> select pref, avg(salary) from salarylist group by pref desc;

p9-4

( Written by Tatsuo Ikura )