HAVING句による取り出すグループの制限
前の記事で解説したとおり、グループ関数はWHERE句の条件に指定できません。グループ関数を条件に指定したい場合は、HAVING句を使用します。
▶ HAVING句を使用したSELECT文
SELECT 列名, グループ関数(列名)
FROM 表名
[WHERE 条件] [GROUP BY グループ化で使用する列のリスト] [HAVING グループに対する条件] [ORDER BY 並び替えで使用する列のリスト]
HAVING句に指定した条件の評価が「TRUE]になるグループだけが取り出されます。
HAVING句を使用すると、以下の手順で取り出すグループが制限されます。
1.WHERE句がある場合、WHERE句の条件によってグループ化する対象の行が制限される
2.GROUP BY句によって行がグループ化される
3.グループ関数が適用される
4.HAVING句によって指定された条件を満たすグループが取り出される
なお、GROUP BY句を指定せずに、HAVING句のみ指定した場合は、選択された行全体が1つのグループとして処理されます。
以下の例では、DEPTNO列とJOB列の値をもとにデータをグループ化し、データの件数とSAL列の値の平均値を求めていますが、ここではHAVING句を指定することで表示するデータを「件数が2件以上」で、かつ「平均給与が200000以上」に制限しています。
▶ GROUP BY句の基本的な使用例
SQL> SELECT deptno, job, COUNT(*), AVG(sal) 2 FROM employees 3 GROUP BY deptno, job; 4 HAVING COUNT(*) >= 2 AND AVG(sal) >= 200000; DEPTNO JOB COUNT(*) AVG(SAL)
------- --- ------------ -------------
20 主任 2 290000 30 営業 4 276250
まとめ
▶ GROUP関数を条件に指定する場合はHAVING句を指定する
▶ HAVING句を指定すると、取り出すグループを制限することができる
▶ HAVING句は、必ずWHERE句の後ろ、かつORDER BY句の前に指定する
▶ GROUP BY句とHAVING句はどちらを先に記述しても同様に動作する
▶ GROUP BY句を指定せずにHAVING句を指定した場合、選択された行全体が1グループとして処理される