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

広告

WHERE句とGROUP BY句を両方記載した場合、まずWHERE句によって条件に合うデータを取得し、その結果に対しGROUP BY句によってグループ化が行われます。HAVING句はWHERE句と異なりGROUP BY句によってグループ化が行われたデータに対して条件を指定してデータを絞り込む場合に使用します。書式は次の通りです。

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

グループ化が行われた結果に対して条件式を適用しますので、HAVING句の条件式に記述できるのはグループ化に指定したカラム名や、関数などを使ってグループ単位で集計した結果だけが記述できます。

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

SELECT AVG(price) FROM goodslist GROUP BY category HAVING AVG(price) > 1000;

「category」カラムの値でグループ化を行い、グループ毎に「price」カラムの値の平均を計算しその結果を取得します。この時平均の値が1000以上のものだけを取得します。

サンプル

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

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

p10-1

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

p10-2

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

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

p10-3

続いてHAVING句を使って平均値が200000以上のものだけを取得します。

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

p10-4

なお別名を使って次のように記述することもできます。

mysql> select pref, avg(salary) as salaryavg from salarylist 
    -> group by pref having salaryavg > 200000;

p10-5

上記では「AVG(salary)」に対して別名「salaryavg」を割り当て、この別名をHAVING句の中でも使用しています。

( Written by Tatsuo Ikura )