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で自分が取得したい行を柔軟に検索できるようになってきました。
今日はここまで。お疲れ様でした。