SQL 入門教程:資料分組(GROUP BY)
從 聚集函式 得知,使用 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 語句時出錯。
請參閱
(完)