グループに対する検索条件の設定

グループ化を行う場合にも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」カラムの値の平均を計算しその結果を取得します。

サンプル

では実際に試してみます。

次のようなデータが格納されたテーブルを対象にします。

p15-1

それでは「category」カラムの値でグループ化を行い、グループに含まれるデータ数を取得してみます。

select category, count(*) from pricelist group by category;

p15-2

ではグループに含まれるデータ数が2以上のグループだけを対象として「price」カラムの値を平均した結果を取得します。

select category, avg(price) 
from pricelist 
group by category 
having count(*) >= 2;

p15-3

このようにHAVING句を使う事でグループ化が行われた後でグループに対する検索条件の設定をすることが可能です。