グループに対する検索条件の設定
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));
テーブルには次のようなデータを追加してあります。
では「pref」カラムの値を使ってグループ化を行い、グループ毎に「salary」カラムの値の平均を取得します。
mysql> select pref, avg(salary) from salarylist group by pref;
続いてHAVING句を使って平均値が200000以上のものだけを取得します。
mysql> select pref, avg(salary) from salarylist -> group by pref having avg(salary) > 200000;
なお別名を使って次のように記述することもできます。
mysql> select pref, avg(salary) as salaryavg from salarylist -> group by pref having salaryavg > 200000;
上記では「AVG(salary)」に対して別名「salaryavg」を割り当て、この別名をHAVING句の中でも使用しています。
( Written by Tatsuo Ikura )