目錄
- 創建分組
- 請參閱
目錄匯總:SQL 入門教程:面向萌新小白的零基礎入門教程
從 聚集函式 得知,使用 SQL 聚集函式可以匯總資料,這樣,我們就能夠對行進行計數,計算和與平均數,不檢索所有資料就獲得最大值和最小值,
目前為止的所有計算都是在表的所有資料或匹配特定的 WHERE 子句 的資料上進行的,比如下面的例子回傳供應商 DLL01 提供的產品數目:
輸入▼
SELECT COUNT(*) AS num_prods
FROM Products
WHERE vend_id = 'DLL01';
輸出▼
num_prods
-----------
4
如果要回傳每個供應商提供的產品數目,該怎么辦?或者回傳只提供一項產品的供應商的產品,或者回傳提供 10 個以上產品的供應商的產品,怎么辦?
這就是分組大顯身手的時候了,使用分組可以將資料分為多個邏輯組,對每個組進行聚集計算,
創建分組
分組是使用 SELECT 陳述句 的 GROUP BY 子句建立的,理解分組的最好辦法是看一個例子:
輸入▼
SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;
輸出▼
vend_id num_prods
------- ---------
BRS01 3
DLL01 4
FNG01 2
分析▼
上面的 SELECT 陳述句指定了兩個列:vend_id 包含產品供應商的 ID,num_prods 為計算欄位(用 COUNT(*) 函式建立),GROUP BY 子句指示 DBMS 按 vend_id 排序并分組資料,這就會對每個 vend_id 而不是整個表計算 num_prods 一次,從輸出中可以看到,供應商 BRS01 有 3 個產品,供應商 DLL01 有 4 個產品,而供應商 FNG01 有 2 個產品,
因為使用了 GROUP BY,就不必指定要計算和估值的每個組了,系統會自動完成,GROUP BY 子句指示 DBMS 分組資料,然后對每個組而不是整個結果集進行聚集,
在使用 GROUP BY 子句前,需要知道一些重要的規定,
GROUP BY子句可以包含任意數目的列,因而可以對分組進行嵌套,更細致地進行資料分組,- 如果在
GROUP BY子句中嵌套了分組,資料將在最后指定的分組上進行匯總,換句話說,在建立分組時,指定的所有列都一起計算(所以不能從個別的列取回資料), GROUP BY子句中列出的每一列都必須是檢索列或有效的運算式(但不能是聚集函式),如果在SELECT中使用運算式,則必須在GROUP BY子句中指定相同的運算式,不能使用別名,- 大多數 SQL 實作不允許
GROUP BY列帶有長度可變的資料型別(如文本或備注型欄位), - 除聚集計算陳述句外,
SELECT陳述句中的每一列都必須在GROUP BY子句中給出, - 如果分組列中包含具有
NULL值的行,則NULL將作為一個分組回傳,如果列中有多行NULL值,它們將分為一組, GROUP BY子句必須出現在WHERE子句之后,ORDER BY 子句 之前,
提示:
ALL子句Microsoft SQL Server 等有些 SQL 實作在
GROUP BY中支持可選的ALL子句,這個子句可用來回傳所有分組,即使是沒有匹配行的分組也回傳(在此情況下,聚集將回傳NULL),具體的 DBMS 是否支持ALL,請參閱相應的檔案,
注意:通過相對位置指定列
有的 SQL 實作允許根據
SELECT串列中的位置指定GROUP BY的列,例如,GROUP BY 2, 1可表示按選擇的第二個列分組,然后再按第一個列分組,雖然這種速記語法很方便,但并非所有 SQL 實作都支持,并且使用它容易在編輯 SQL 陳述句時出錯,
請參閱
- 資料分組
- 過濾分組
- 分組和排序
- GROUP BY 練習題
(完)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/296428.html
標籤:SQL Server
上一篇:分布式運算中,高精度校時器的暢想
