Sql- Group By ,Where,having用法

Group by,where,having 是數據庫查詢中最經常使用的幾個關鍵字。在工做中,時經常使用到,前面遇到一個問題,一個查詢中使用了where ,group by ,having及彙集函數時 ,執行順序是怎麼樣的?爲了回答這個問題,將這個三個關鍵字的用法整理一下。數據庫

  • Where:數據庫中經常使用的是Where關鍵字,用於在初始表中篩選查詢。以下面這個例子,從user表中查詢出userDepartmentId等於2的數據
Select * from dbo.user where userDepartmentId=2
  • Group by:對Select查詢出來的數據集按照某個字段或者表達式進行分組,得到一組組的集合,而後從每組中取出一個指定字段或者表達式的值。

咱們須要注意的是:在使用Group By的SQL語句中,select中返回的字段,必須知足如下兩個條件之一:oracle

  1. 包含在Group By語句的後面,做爲分組的依據;
  2. 這些字段包含在聚合函數中。常見的聚會函數有:count,sum,MAX, AVG等

從剛纔的那個例子中,咱們查詢出每一個城市,相同年齡的員工數量:函數

select city, count(*),age from dbo.user where departmentID=2 group by city,age
  • Having:用於對where和group by查詢出來的分組經行過濾,查處出知足條件的分組結果。因此Having的使用須要注意如下幾點:
  1. Having只能用於Group By(分組統計語句中)
  2. WHERE 是用於在初始表中篩選查詢,HAVING用於在WHERE和GROUP BY 結果分組中查詢
  3. Having 子句中的每個元素也必須出如今select列表中
  4. Having語句可使用聚合函數,而where不使用。

仍是剛纔的例子,咱們進一步整理,查詢員工數量大於20的城市和年齡段spa

select city, count(*),age from dbo.user where departmentID=2 group by city,age having age >40

 

回到本章開頭的那個問題:當一個語句中同時含有where、group by  、having及彙集函數時,執行順序以下:code

  1. 執行where子句查找符合條件的數據;
  2. 使用group by 子句對數據進行分組;對group by 子句造成的組運行彙集函數計算每一組的值;
  3. 最後用having 子句去掉不符合條件的組。
  4. having 子句中的每個元素也必須出如今select列表中。有些數據庫例外,如oracle.
  5. having子句和where子句均可以用來設定限制條件以使查詢結果知足必定的條件限制。
  6. having子句限制的是組,而不是行。where子句中不能使用匯集函數,而having子句中能夠。
相關文章
相關標籤/搜索