目录
having子句
having和where的区别
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
现在要求查询出每个职位的名称,职位的平均工资,但是要求显示平均工资高于 200 的职位
按照职位先进行分组,同时统计出每个职位的平均工资,随后要求只显示那些平均工资高于 200的职位信息
既然现在要对显示的数据进行筛选,自然就会想到使用 WHERE 子句
SQL> select job,avg(sal)
2 from emp
3 where avg(sal)>2000
4 group by job;
where avg(sal)>2000
*
第 3 行出现错误:
ORA-00934: 此处不允许使用分组函数
此时直接告诉用户,where子句上不允许出现统计函数(分组函数)
因为 group by 子句是在 where子句之后运行的,运行 where子句时还没有进行分组,自然就无法进行统计
所以在这样的 情况下,就必须使用另外一个子句完成: having子句
而此时的 SQL 语法结构变为如下形式
【确定要显示的数据列】select [distinct] * | 分组列 [ 别名 ] , 分组列 [ 别名 ] ...
【确定数据来源(行与列的集合)】from 表名称 [ 别名 ], 表名称 [ 别名 ],...
【针对数据行进行筛选】[where 限定条件 (s)]
【针对筛选的行分组】[group by 分组字段 , 分组字段 , 分组字段 ,...]
【针对筛选的行分组】[having 分组过滤 ]
【对选定数据的行与列排序】[order by 排序字段 [asc | desc], 排序字段 [asc | desc],...]
语法结构在前面的语法基础上增加 having子句,实现筛选的行分组
having子句
SQL> select job,avg(sal)
2 from emp
3 group by job
4 having avg(sal)>2000;
JOB AVG(SAL)
------------------ ----------
ANALYST 3000
MANAGER 2758.33333
PRESIDENT 5000
having
子句是select语句的可选子句
它用于过滤由group by 子句返回的行分组
这就是为什么having
子句通常与group by
子句一起使用的原因
having和where的区别
where 不能放在group by 后面
having是跟group by 连在一起用的,放在group by 后面,此时的作用相当于where
hwere后面的条件中不能有聚集函数,比如sum(),avg()等,而having可以