解釋1、sql
聚合函數是比較where、having 的關鍵。 開門見山。where、聚合函數、having 在from後面的執行順序:數據庫
where>聚合函數(sum,min,max,avg,count)>havingoracle
列出group by來比較兩者。(因where和having 在使用group by時問的最多) 若須引入聚合函數來對group by 結果進行過濾 則只能用having。(此處很少說,本身想 是先執行聚合函數仍是先過濾 而後比對我上面列出的執行順序 一看便知)函數
樣例:select sum(score) from student where sex='man' group by name having sum(score)>210spa
注意事項 : 一、where 後不能跟聚合函數,由於where執行順序大於聚合函數。 二、where 子句的做用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組以前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。 三、having 子句的做用是篩選知足條件的組,即在分組以後過濾數據,條件中常常包含聚組函數,使用having 條件顯示特定的組,也可使用多個分組標準進行分組。排序
Sql語句中的順序能夠是where——group by——having或者group by——havingclass
Group by 分組select
Order by 排序sql語句
解釋2、數據
「Where」是一個約束聲明,在查詢數據庫的結果返回以前對數據庫中的查詢條件進行約束,即在結果返回以前起做用,且where後面不能使用「聚合函數」;
「Having」是一個過濾聲明,所謂過濾是在查詢數據庫的結果返回以後進行過濾,即在結果返回以後起做用,而且having後面可使用「聚合函數」。
由於聚合函數是比較where和having的關鍵,因此先說下聚合函數。所謂聚合函數,是對一組值進行計算而且返回單一值的函數,在sql中常見於下面幾個字眼:sum---求和,count---計數,max---最大值,avg---平均值等。
接下來從使用的角度:
where後面之因此不能使用聚合函數是由於where的執行順序在聚合函數以前,以下面這個sql語句:
錯誤:
select sum(score) from student group by student.sex where sum(student.age)>100;
having既然是對查出來的結果進行過濾,那麼就不能對沒有查出來的值使用having,以下面這個sql語句:
錯誤:
select student.id,student.name from student having student.score >90;
下面給出一個where 和 having組合使用的sql語句:
select sum(score) from student where sex='man' group by name having sum(score)>210;
實例:
咱們常常會遇到以「累計(count)」或是「累加(sum)」爲條件的查詢。好比aaa表:
ID, NAME, SHU
1, a, 3
2, a, 4
3, b, 5
4, b, 7
5, a,
6, a, 20
Q1:查詢出現過2次的name。
Select * from aaa group by name having count(name)>=2;
Q2:查詢單一用戶的SHU總和大於10的用戶
Select * from aaa group by name having sum(shu)>10;
一個HAVING子句最多隻能包含40個表達式,HAVING子句的表達式之間能夠用AND和OR分割。
Q3: 求和用累加 sum ,求行的總數用累計 count select name, count(shu), sum(shu) from aaa group by name
結果爲:a 3 27 b 2 12 可見:oracle 數據庫中對空值的是一致忽略的,count 函數認爲沒有此項,而sum函數不計算。