1. 程式人生 > 其它 >SQL 入門教程:資料分組(GROUP BY)

SQL 入門教程:資料分組(GROUP BY)

目錄

目錄彙總: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 語句時出錯。

請參閱

(完)