データをグループ化
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));
テーブルには次のようなデータを追加してあります。
では「pref」カラムの値を使ってグループ化を行い、グループ毎に「salary」カラムの値の平均を取得します。
mysql> select pref, avg(salary) from salarylist group by pref;
またデフォルトではグループ化の対象となった「pref」カラムの値を昇順に並べ替えたものを取得しますが、降順に並べ替えてから取得することもできます。次のように入力して下さい。
mysql> select pref, avg(salary) from salarylist group by pref desc;
( Written by Tatsuo Ikura )