グループに対する検索条件の設定
グループ化を行う場合にもWHERE句を使って対象となるデータの制限を行うことができます。
SELECT カラム名, ... FROM テーブル名 WHERE 条件式 GROUP BY カラム名, ...;
この場合、対象となるデータををまずWHERE句によって絞り込みます。そして絞り込まれたデータに対してグループを行います。
それに対してグループ化が行われた後で、グループに対して絞込みを行うにはHAVING句を使用します。書式は次の通りです。
SELECT カラム名, ... FROM テーブル名 GROUP BY カラム名, ... HAVING 条件式;
グループ化が行われた結果に対して条件式を適用しますので、条件式に記述できるのはグループ化に指定したカラム名や、関数などを使ってグループ単位で集計した結果だけが記述できます。
具体的には次のようになります。
select avg(price) from goodslist group by category having count(*) > 2;
このSELECT文ではgoodslistテーブルの「category」カラムの値でグループ化を行います。そしてグループに含まれるデータ数が2よりも大きいグループだけを対象にグループ毎に「price」カラムの値の平均を計算しその結果を取得します。
サンプル
では実際に試してみます。
次のようなデータが格納されたテーブルを対象にします。
それでは「category」カラムの値でグループ化を行い、グループに含まれるデータ数を取得してみます。
select category, count(*) from pricelist group by category;
ではグループに含まれるデータ数が2以上のグループだけを対象として「price」カラムの値を平均した結果を取得します。
select category, avg(price) from pricelist group by category having count(*) >= 2;
このようにHAVING句を使う事でグループ化が行われた後でグループに対する検索条件の設定をすることが可能です。