資料分組入門
資料分組用來將資料分為多個邏輯組,從而可以對每個組進行聚合運算。SQL語句中使用GROUP BY子句進行分組,使用方式為“GROUP BY 分組欄位”。分組語句必須和聚合函式一起使用,GROUP BY子句負責將資料分成邏輯組,而聚合函式則對每一個組進行統計計算。
雖然GROUP BY子句常常和聚合函式一起使用,不過GROUP BY子句並不是不能離開聚合函式而單獨使用的,雖然不使用聚合函式的GROUP BY子句看起來用處不大,不過它能夠幫助我們更好的理解資料分組的原理,所以本小節我們將演示GROUP BY子句的分組能力。
我們首先來看一下如果通過SQL語句實現“檢視公司員工有哪些年齡段的”,因為這裡只需要列出員工的年齡段,所以使用GROUP BY子句就完全可以實現:
SELECT FAge FROM T_Employee GROUP BY FAge
執行完畢我們就能在輸出結果中看到下面的執行結果:
FAge
22
23
25
27
28
這個SQL語句處理表中的所有記錄,並且將FAge相同的資料行放到一組,分組後的資料可以看作一個臨時的結果集,而SELECT FAge語句則取出每組的FAge欄位的值,這樣我們就得到上表的員工年齡段表了。
GROUP BY子句將檢索結果劃分為多個組,每個組是所有記錄的一個子集。上面的SQL例子在執行的時候資料庫系統將資料分成了下面的分組:
需要注意的是GROUP BY子句的位置,GROUP BY子句必須放到SELECT語句的之後,如果SELECT語句有WHERE子句,則GROUP BY子句必須放到WHERE語句的之後。比如下面的SQL語句是錯誤的:
SELECT FAge FROM T_Employee GROUP BY FAge WHERE FSubCompany = "Beijing"
而下面的SQL語句則是正確的:
SELECT FAge FROM T_Employee WHERE FSubCompany = "Beijing" GROUP BY FAge
需要分組的所有列都必須位於GROUP BY子句的列名列表中,也就是沒有出現在GROUP BY子句中的列(聚合函式除外)是不能放到SELECT語句後的列名列表中的。比如下面的SQL語句是錯誤的:
SELECT FAge,FSalary FROM T_Employee GROUP BY FAge
道理非常簡單,因為採用分組以後的查詢結果集是以分組形式提供的,由於每組中人員的
員工工資都不一樣,所以就不存在能夠統一代表本組工資水平的FSalary欄位了,所以上面的SQL語句是錯誤的。不過每組中員工的平均工資卻是能夠代表本組統一工資水平的,所以可以對FSalary使用聚合函式,下面的SQL語句是正確的:
SELECT FAge,AVG(FSalary) FROM T_Employee GROUP BY FAge
GROUP BY子句中可以指定多個列,只需要將多個列的列名用逗號隔開即可。指定多個分組規則以後,資料庫系統將按照定義的分組順序來對資料進行逐層分組,首先按照第一個分組列進行分組,然後在每個小組內按照第二個分組列進行再次分組……逐層分組,從而實現“組中組”的效果,而查詢的結果集是以最末一級分組來進行輸出的。比如下面的SQL語句將會列出所有分公司的所有部門情況:
SELECT FSubCompany,FDepartment FROM T_Employee GROUP BY FSubCompany,FDepartment
執行完畢我們就能在輸出結果中看到下面的執行結果:
上面的SQL例子在執行的時候資料庫系統將資料分成了下面的分組: