目錄匯總: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 語句時出錯。
請參閱
(完)