注意 :
having語句一般結合GROUP BY一起使用的。。。。。
Having短語與WHERE的區別!!!
WHERE子句作用於基表或視圖,從中選擇滿足條件的元組。HAVING短語作用於組,從中選擇滿足條件的組。
where是從查詢滿足條件的數據,用於查詢數據之前;having用於在查出的數據中挑選滿足條件的數據,在數據查出來之后處理。
select語法的順序問題:
select 一般在的后面的內容都是要查詢的字段 from 要查詢到表 where group by having 分組后帶有條件只能使用having order by limit 0,100 它必須放到最后面
下面我們舉例說明
首先我們創建這么一張表:
簡單的介紹一下每一個域的意思:JOB—工種、SAL—–工資、DEP—–部門
插入數據:
需求:從該表中篩選出工種不是“M” ,以部門來划分平均工資大於28000,按降序排列的記錄。
代碼:
SELECT DEP, JOB, AVG(SAL) FROM EMPL WHERE JOB <> 'M' GROUP BY DEP, JOB HAVING AVG(SAL) > 28000 ORDER BY 3 DESC;
我們來一步一步地剖析這個長SQL語句:
第一,from得到的是所有的表中的記錄,也就是:
第二,where 得到
第三步,group by DEP,JOB得到
第四步,having avg(SAL)>28000
也就是從所得的五個分組中找出平均工資大於28000的分組,也就是第二、四、五組
第五步就是降序排列:(當然SELECT我們一直在使用,其實這以整句的查詢是有六個子句的)所以最終結果就是
這里有一個值得注意的地方就是,當我們把查詢結果的第三個域改為SAL的時候,查詢結果會怎么樣呢?
SELECT DEP, JOB, SAL FROM EMPL WHERE JOB <> 'M' GROUP BY DEP, JOB HAVING AVG(SAL) > 28000 ORDER BY 3 DESC;
那么結果就是每一個組中的第一條記錄的SAL,這是沒有任何實際意義的,因為這既不是最多的工資,也不是最小的工資,他只是每一個組中的第一條記錄對應的SAL
正如我上面所說的一樣,31000是BLU這組的第一條記錄的SAL,33000是GRE這一組的第一條記錄的SAL,32000是RED這一組的第一條記錄
看一下查詢結果:
所以我們在投影的時候一定要特別注意每一個域的實際意義!
一定要記住這一條規則
SELECT子句中包含集函數
SELECT子句中包含的列:
1、在集函數中的列
2、不在集函數中的列–這些列必須全部包含在GROUP BY子句中。
(即使用GROUP BY子句后,SELECT子句的列名列表中只能出現分組屬性和集函數 )
-------------------------另一種解釋----------------
聚合函數是比較where、having 的關鍵。
開門見山。where、聚合函數、having 在from后面的執行順序:
where>聚合函數(sum,min,max,avg,count)>having
列出group by來比較二者。()因where和having 在使用group by時問的最多)
若須引入聚合函數來對group by 結果進行過濾 則只能用having。(此處不多說,自己想 是先執行聚合函數還是先過濾 然后比對我上面列出的執行順序 一看便知)
例如:
select sum(score) from student where sex='man' group by name having sum(score)>210
注意事項 :
1、where 后不能跟聚合函數,因為where執行順序大於聚合函數。
2、where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。
3、having 子句的作用是篩選滿足條件的組,即在分組之后過濾數據,條件中經常包含聚組函數,使用having 條件顯示特定的組,也可以使用多個分組標准進行分組。