SQL中where子句中不能出现聚合函数的原因


首先我们应该熟悉什么聚合函数:

例如SUM(),MIN(),Max()这类的,我们称作是聚合函数。

那么我们不能在where子句中使用这些函数,为什么呢?

聚集函数也叫列函数,它们都是基于整列数据进行计算的,而where子句则是对数据行进行过滤的,在筛选过程中依赖“基于已经筛选完毕的数据得出的计算结果”是一种悖论,这是行不通的。更简单地说,因为聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!

而where子句还处于“确定”结果集的过程中,因而不能使用聚集函数。

与where子句不能出现聚集函数正相反的是,我们几乎看不到不使用聚集函数的having子句。为什么?因为在水平方向上根据外部指定条件的筛选(也就是对行的筛选),where子句可以独立完成,剩下的往往都是需要根据结果集自身的统计数据进一步筛选了,这时,几乎都需要通过having子句配合聚集函数来完成。

按照下面这个就是错误的,会报一个错误:Group function is not allowed here

select department_id,avg(salary)  
from employees  
where  avg(salary)>6000  
group by department_id  
--having  avg(salary)>6000 

原因。

sql语句的执行顺序为

 from子句

where 子句

group by 子句

having 子句

order by 子句

select 子句

首先得知道聚合函数是对结果集运算的,当在where子句使用聚合函数时,此时根据group by 分割结果集的子句还没有执行,此时只有from 后的结果集。

所以无法在where子句中使用聚合函数。





猜你喜欢

转载自blog.csdn.net/zhaomengszu/article/details/80784096