sql having

2021-06-22  本文已影响0人  Vergil_wj

对分组之后的信息进行过滤

输出部门平均工资大于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%" 

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 表进行分组,因此编译时会报错。

上一篇下一篇

猜你喜欢

热点阅读