对分组之后的信息进行过滤
输出部门平均工资大于2000的部门编号、部门平均工资
select deptno,avg(sal) as "平均工资"
from emp
group by deptno
having avg(sal) > 2000
把姓名不包含 A 的所有员工按照部门编号分组;
输出部门平均工资大于2000的部门编号、部门平均工资。
select deptno,avg(sal) as "平均工资"
from emp
where ename not like "%A%" -- 对原始记录过滤
group by deptno
having avg(sal) > 2000 -- 对分组之后的数据过滤
错误写法:
select deptno,avg(sal) as "平均工资"
from emp
group by deptno
having avg(sal) > 2000
where ename not like "%A%"
- where 和 having 参数的顺序不能变。
having 和 where 异同
相同: 都是对数据进行过滤,只保留有效数据。
不同:
1、where 是对原始数据过滤,having 是对分组之后的数据进行过滤;
2、where 必须写在 hvaing 前面,顺序不可颠倒,否则运行出错;
错误代码:
select deptno,avg(sal)
from emp
where avg(sal) > 2000
group by deptno
where 应该对源数据进行操作,不能使用分组函数实例。先执行 where 后执行 group by,所以执行 where 时还没有对 emp 表进行分组,因此编译时会报错。
网友评论