oracle 12c HAVING 句
集合函数不可以使用在where 语句。但是我们需要给group 函数指定一些选出的条件,此时可以使用HAVING 语句
基本的使用方法
select 列名,group函数(列名)
from 表名
[where 条件]
[group by group化使用的列列表]
[having group相对应的条件]
[order by 排列顺序用的列]
HAVING 语句可以指定那些行别选出来进行集合操作,不指定的情况下为全部选出。
使用的例子
select 列名,group函数(列名)
select deptno,job,count(*),avg(sal)
from employees
group by deptno,job
having count(*)>2 and avg(sal)>= 20000;
having 语句查询顺序
- 有where 的情况下首先使用where 语句,选出集合化的语句。
- 使用group by 语句将行几何化
- 使用集合函数
- 使用having 句筛选出满足的结果,但结果为【true】 时筛选出来
特别注意的点
- 必须使用在where 语句之后,order by 语句之前
- group by 句 和having 谁在前的使用的顺序都是一样的
- group 句没有指定having句时,选择全体
验证分析实验
第一步:准备工作(为了验证数据)
select deptno,job from employees where job != '部長';
/* 显示结果*/
DEPTNO JOB
------ --------
20 事務
30 事務
20 事務
30 営業
20 主任
30 営業
10 社長
30 営業
30 営業
20 主任
10 事務
select deptno,job,count(*),avg(sal)
2 from employees
3 group by deptno,job;
/* 显示结果*/
DEPTNO JOB COUNT(*) AVG(SAL)
------ -------- ---------- ----------
10 社長 1 500000
10 事務 1 230000
30 営業 4 275000
10 部長 1 245000
20 事務 2 155000
20 部長 1 280000
30 事務 1 295000
20 主任 2 290000
30 部長 1 285000
第二步:where 和group by 一起,分析结果可知,group by 是在where 语句之后。
SQL> select deptno,job,count(*),avg(sal)
2 from employees
3 where job != '部長'
4 group by deptno,job;
DEPTNO JOB COUNT(*) AVG(SAL)
------ -------- ---------- ----------
10 社長 1 500000
10 事務 1 230000
30 営業 4 275000
20 事務 2 155000
30 事務 1 295000
20 主任 2 290000
第三步:where 和group by句,最后是having 句。 分析结果可以知道。having语句实在group by 语句之后。
SQL> select deptno,job,count(*),avg(sal)
2 from employees
3 where job != '部長'
4 group by deptno,job
5 having count(*)>=2 and avg(sal)>200000;
DEPTNO JOB COUNT(*) AVG(SAL)
------ -------- ---------- ----------
30 営業 4 275000
20 主任 2 290000
第四步:group by 语句 和 having语句的顺序问题 ,检验结果一致,having 与 order by 写的顺序不影响执行顺序。
/* group 在前 */
SQL> select deptno,job,count(*),avg(sal)
2 from employees
3 where job != '部長'
4 having job != '営業'
5 group by deptno,job;
/*搜索结果*/
DEPTNO JOB COUNT(*) AVG(SAL)
------ -------- ---------- ----------
10 社長 1 500000
10 事務 1 230000
20 事務 2 155000
30 事務 1 295000
20 主任 2 290000
/* 2 .group 在前 */
SQL> select deptno,job,count(*),avg(sal)
2 from employees
3 where job != '部長'
4 group by deptno,job
5 having job != '営業';
/*搜索结果*/
DEPTNO JOB COUNT(*) AVG(SAL)
------ -------- ---------- ----------
10 社長 1 500000
10 事務 1 230000
20 事務 2 155000
30 事務 1 295000
20 主任 2 290000