Mysql中Group By使用Having語句配合查詢(where和having區別)


注意 :

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 條件顯示特定的組,也可以使用多個分組標准進行分組。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM