首先我们应该熟悉什么聚合函数:
例如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 子句
select 子句
order by 子句
首先得知道聚合函数是对结果集运算的,当在where子句使用聚合函数时,此时根据group by 分割结果集的子句还没有执行,此时只有from 后的结果集。
所以无法在where子句中使用聚合函数。