【SQL – Oracle】HAVING句による取り出すグループの制限

【SQL – Oracle】HAVING句による取り出すグループの制限

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グループとして処理される

コメントを残す