afightz

SQL语句——为什么分组函数(多行处理函数)不能用在where语句之后?

在SQL语句中,常见的分组查询函数为:

  sum()求和

  avg()求平均值

  min()求最小值  

  max()求最大值

  count()求数目

在分组函数中有几个重要的特征:

1.分组函数进行时自动忽略null

2.执行顺序为先分组后处理,如果没有分组则默认整张表为一组

 

常用SQL语句结构为:

select ...
from...
where...
group by...
order by....

其具体执行顺序为:

:from...
where...
group by...(分组)
select...
order by...

由此可见:如果将分组函数直接放置where后,分组这一步骤在where之后执行,与分组函数的特征相违背,所以不能将分组函数直接放置在where之后;

 

应用实例:

求每个部门的最高薪资,并且高于3000元

错误方法:

select depno,max(sal)
from emp
where 
  max(sal)>3000
--where 后面不能直接写上分组函数
group by
  deptno;

正确方法:

引入having,having和group by是配套使用的,基本逻辑为分组后再对分组进行筛选 

同时这也是引入having的必要性

select depno,max(sal)
from emp
group by
  deptno;
having 
    max(sal)>3000;

但是having语句再效率方面不及where语句,所以从语句优化的方面出发,优先使用where,次而使用having

SQL语句优化

select 
    depno,max(sal)
from 
    emp
where
    sal>3000    
group by
    deptno;
    

不能利用where来进行优化的例子:

求每个部门的最高平均薪资,并且平均工资高于3000元

 

 

 

 

posted on 2022-05-07 10:18  清风微影  阅读(475)  评论(0编辑  收藏  举报

导航