having子句的语法
group by之后再加上having来过滤数据
where和having的区别
1.不能在where子句中使用组函数
2.可以在having子句中使用组函数
3.having 先分组再过滤;where先过滤再分组
----where使得分组记录数据大大降低,从而提高了sql的效率
查询10号部门的平均工资
select deptno,avg(sal)
from emp
group by deptno
having deptno=10;
select deptno,avg(sal)
from emp
where deptno=10
group by deptno;
*******************************************************
SQL> select deptno,avg(sal)
2 from emp
3 group by deptno
4 having avg(sal) > 2000;
DEPTNO AVG(SAL)
---------- ----------
20 2175
10 2916.66667
SQL> select deptno,avg(sal)
2 from emp
3 group by deptno
4 having deptno=10;
DEPTNO AVG(SAL)
---------- ----------
10 2916.66667
SQL> select deptno,avg(sal)
2 from emp
3 where deptno=10
4 group by deptno;
DEPTNO AVG(SAL)
---------- ----------
10 2916.66667
where与having的区别
where/having都是按条件筛选
where 后面不能使用组函数 having都可以
从优化角度 尽量用where
having 先分组,后过滤
where 先过滤,后分组
分组记录数举例
原来多用where是在底层有原因的呀
o where是先过滤再分组,而having是反过来
还有这种乾坤对调的表达方式呀
o where和having以group by为基点对调
这个区别倒是蛮意料之外想象之中的
过滤分组
1、having 子句的使用
·求平均工资大于2000的员工
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000
2、WHERE 与HAVING 的区别
·不能在where 子句中使用组函数
·可以在having 子句中使用组函数
3、where 和having 可以通用的情况
示例:查询10号部门的平均工资
select deptno,avg(sal) from emp group by deptno having deptno=10;
select deptno,avg(sal) from emp where deptno=10 group by deptno;
having先分组,后过滤
where 先过滤,后分组
1 having 作用是过滤分组,因此having排在group后面
格式:select column, group_function
from table
where..
group by..
having...
order by...;
2 where, having功能相似,但是区别在于where不能使用组函数而having能,没有组函数的情况下,where和having可以互换,尽量使用where
having中可以有组函数
where中不能用组函数。
注意:从SQL优化的角度上看,尽量使用where
having 先分组,后过滤。
where 先过滤后分组。
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
不能再where子句中使用组函数(注意)。
可以在having子句中使用组函数。
查询10号部门的工资;
select deptno,avg(sal) from emp group by deptno having deptno=10;
=select deptno,avg(sal) from emp where deptno=10 group by deptno;
where和having可以通用的情况:从SQL优化的角度上看,尽量使用where
having 先分组,后过滤
where 先过滤,后分组
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
不能再where子句中使用组函数(注意)。
可以在having子句中使用组函数。
select deptno,avg(sal) from emp group by deptno having deptno=10;
=select deptno,avg(sal) from emp where deptno=10 group by deptno;
where和having可以通用的情况:从SQL优化的角度上看,尽量使用where
having 先分组,后过滤
where 先过滤,后分组
多条件 select deptno,avg(sal) from emp group by deptno having
avg(sal) > 2000
where having 都是过滤结果,where 不能过滤组函数
/****************************************************
select deptno,avg(sal) from emp group by deptno having deptno=10;
select deptno,avg(sal) from emp where deptno=10 group by deptno;
注意分组函数,上面二句语句都能正确执行。
where 效率大于 having
***************************************************/
where 先过滤后分组
having 先分组后过滤
having子句示例
求平均工资大于2000的部门,要求显示:部门号,平均工资
where与having的区别
不能再where子句中使用组函数(注意) ---更优
可以在having子句中使用组函数 ---
where 和having的区别
having和where在没有分组函数的时候是可以通用的,但是having可以使用分组,但是where不能使用分组。没有分组的时候应该优先使用where,因为where的效率更高,where是先筛选数据再进行分组运算,而having是先分组运算在筛选数据,所以分组运算的数据更多,where分组运算的数据更少。
重点纠错,不是where和having不能共存,而是where中不能使用组函数,可以在having字句中使用组函数。
where 子句应放在from的后面
having子句放在group by的后面
where : 不能在子句中使用组函数
having :可以在子句中使用组函数
select deptno ,avg (sal)
from emp
group by deptno
having avg(sal)>2000;