1. 程式人生 > >where條件裡為什麼不能有聚合函式

where條件裡為什麼不能有聚合函式

轉自: https://blog.csdn.net/zhaomengszu/article/details/80784096

首先我們應該熟悉什麼聚合函式:

例如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子句中使用聚合函式。