トップ > SQL入門 > 17章
17章 グループ関数(HAVING)
前回はgroup by句を使用してグループ化を行う方法について学んできました。
今回はグループ関数を使用した制限について学んでいきましょう。

例えば、各部門ごとの平均年収が500万以上の部門だけを表示したい場合は条件式が必要です。
条件式はWHERE句で制限することで取得が可能でした。
条件式にグループ関数を使用する場合はWHERE句の代わりにHAVING句を使用します。

では構文を見ていきましょう。
[構文] HAVING構文
SELECT 列名, 列名…
FROM 表名
[WHERE 条件式]
GROUP BY 列名, 列名…
HAVING グループ関数を使用した条件式
[ORDER BY 列名, 列名…];

GROUP BY句とHAVING句の順番を入れ替えてもエラーにはなりません。
そして、ORDER BY句は必ず最後に指定します。

では平均年収が500万以上の部門だけを問合せるSQL文を見ていきましょう。

  SQL> SELECT dept_id,avg(salary)
    2  FROM employees
    3  GROUP BY dept_id
    4  HAVING avg(salary) >= 5000000;

     DEPT_ID AVG(SALARY)
  ---------- -----------
                10000000
          30  5333333.33
          40     5960000
          20     7000000
          10     5500000


上記例ではGROUP BY句にDEPT_ID列を指定しているので、
DEPT_IDごとでグループ化を行っています。
HAVING句ではグループ化したDEPT_IDごとの平均給与の中で、
500万以上のグループという条件となります。

また先ほど記載したようにGROUP BYとHAVINGの順番は入れ替えてもエラーになりません。

  SQL> SELECT dept_id,avg(salary)
    2  FROM employees
    3  HAVING avg(salary) >= 5000000
    4  GROUP BY dept_id;

     DEPT_ID AVG(SALARY)
  ---------- -----------
                10000000
          30  5333333.33
          40     5960000
          20     7000000
          10     5500000


HAVING句をGROUP BY句より前に指定してもエラーにはなりません。
また最初の例と同じ結果が表示されていることがわかります。

またHAVING句をWHERE句にした場合は以下のようにエラーになります。

  SQL> SELECT dept_id,avg(salary)
    2  FROM employees
    3  GROUP BY dept_id
    4  WHERE avg(salary) >= 5000000;
  WHERE avg(salary) >= 5000000
  *
  ERROR at line 4:
  ORA-00933: SQL command not properly ended


では次の実行例です。

  SQL> SELECT dept_id,avg(salary)
    2  FROM employees
    3  WHERE dept_id IS NOT NULL
    4  GROUP BY dept_id
    5  HAVING avg(salary) >= 5000000
    6  ORDER BY dept_id;

     DEPT_ID AVG(SALARY)
  ---------- -----------
          10     5500000
          20     7000000
          30  5333333.33
          40     5960000


今まで書いてきた構文すべて使ってみました。

WHERE句でdept_idがNULLでない行に絞り込みを行った後で、
GROUP BY句によりグループ化が行われ、
HAVING句で平均年収が500万以上という条件で検索を行います。
最後にORDER BY句により、dept_idで小さい順に表示します。

最後にグループ関数のネストも可能です。
単一行関数の場合ネストの制限はありませんでしたが、
グループ関数の場合は2つまでとなります。

いかがでしたでしょうか。グループ関数は以上となります。
構文も多くなり、SQLで自分が取得したい行を柔軟に検索できるようになってきました。

今日はここまで。お疲れ様でした。