本文介紹什麼是 SQL 的聚集函數,如何利用它們彙總表的數據。這些函數很高效,它們返回結果一般比你在自己的客戶端應用程式中計算要快得多。 一、聚集函數 我們經常需要彙總數據而不用把它們實際檢索出來,為此 SQL 提供了專門的函數。使用這些函數,SQL 查詢可用於檢索數據,以便分析和報表生成。這種類型 ...
目錄
本文介紹什麼是 SQL 的聚集函數,如何利用它們彙總表的數據。這些函數很高效,它們返回結果一般比你在自己的客戶端應用程式中計算要快得多。
一、聚集函數
我們經常需要彙總數據而不用把它們實際檢索出來,為此 SQL 提供了專門的函數。使用這些函數,SQL 查詢可用於檢索數據,以便分析和報表生成。這種類型的檢索例子有:
- 確定表中行數(或者滿足某個條件或包含某個特定值的行數);
- 獲得表中某些行的和;
- 找出表列(或所有行或某些特定的行)的最大值、最小值、平均值。
上述例子都需要彙總出表中的數據,而不需要查出數據本身。因此,返回實際表數據純屬浪費時間和處理資源(更不用說帶寬了)。再說一遍,我們實際想要的是彙總信息。
為方便這種類型的檢索,SQL 給出了 5 個聚集函數,見表 1。這些函數能進行上述檢索。與 SQL 如何使用函數處理數據 介紹的數據處理函數不同,SQL 的聚集函數在各種主要 SQL 實現中得到了相當一致的支持。
聚集函數(aggregate function)
對某些行運行的函數,計算並返回一個值。
表 1 SQL 聚集函數
函數 | 說明 |
---|---|
AVG() |
返回某列的平均值 |
COUNT() |
返回某列的行數 |
MAX() |
返回某列的最大值 |
MIN() |
返回某列的最小值 |
SUM() |
返回某列值之和 |
下麵說明各函數的使用。
1.1 AVG() 函數
AVG()
通過對錶中行數計數並計算其列值之和,求得該列的平均值。AVG()
可用來返回所有列的平均值,也可以用來返回特定列或行的平均值。
下麵的例子使用 AVG()
返回 Products
表中所有產品的平均價格:
SELECT AVG(prod_price) AS avg_price
FROM Products;
輸出:
avg_price
-------------
6.823333
此 SELECT
語句返回值 avg_price
,它包含 Products
表中所有產品的平均價格。如 SQL 如何創建計算欄位 中所述,avg_price
是一個別名。
AVG()
也可以用來確定特定列或行的平均值。下麵的例子返回特定供應商所提供產品的平均價格:
SELECT AVG(prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';
輸出:
avg_price
-----------
3.8650
這條 SELECT
語句與前一條的不同之處在於,它包含了 WHERE
子句。此 WHERE
子句僅過濾出 vend_id
為 DLL01
的產品,因此 avg_price
中返回的值只是該供應商產品的平均值。
註意:只用於單個列
AVG()
只能用來確定特定數值列的平均值,而且列名必須作為函數參數給出。為了獲得多個列的平均值,必須使用多個AVG()
函數。只有一個例外是要從多個列計算出一個值時,本問後面會講到。
說明:
NULL
值
AVG()
函數忽略列值為NULL
的行。
1.2 COUNT() 函數
COUNT()
函數進行計數。可利用 COUNT()
確定表中行的數目或符合特定條件的行的數目。
COUNT()
函數有兩種使用方式:
- 使用
COUNT(*)
對錶中行的數目進行計數,不管表列中包含的是空值(NULL
)還是非空值。 - 使用
COUNT(column)
對特定列中具有值的行進行計數,忽略NULL
值。
下麵的例子返回 Customers
表中顧客的總數:
SELECT COUNT(*) AS num_cust
FROM Customers;
輸出:
num_cust
--------
5
在此例子中,利用 COUNT(*)
對所有行計數,不管行中各列有什麼值。計數值在 num_cust
中返回。
下麵的例子只對具有電子郵件地址的客戶計數:
SELECT COUNT(cust_email) AS num_cust
FROM Customers;
輸出:
num_cust
--------
3
這條 SELECT
語句使用 COUNT(cust_email)
對 cust_email
列中有值的行進行計數。在此例子中,cust_email
的計數為 3(表示 5 個顧客中只有 3 個顧客有電子郵件地址)。
說明:
NULL
值如果指定列名,則
COUNT()
函數會忽略指定列的值為NULL
的行,但如果COUNT()
函數中用的是星號(*
),則不忽略。
1.3 MAX() 函數
MAX()
返回指定列中的最大值。MAX()
要求指定列名,如下所示:
SELECT MAX(prod_price) AS max_price
FROM Products;
輸出:
max_price
----------
11.9900
這裡,MAX()
返回 Products
表中最貴物品的價格。
提示:對非數值數據使用
MAX()
雖然
MAX()
一般用來找出最大的數值或日期值,但許多(並非所有)DBMS 允許將它用來返回任意列中的最大值,包括返迴文本列中的最大值。在用於文本數據時,
MAX()
返回按該列排序後的最後一行。
說明:
NULL
值
MAX()
函數忽略列值為NULL
的行。
1.4 MIN() 函數
MIN()
的功能正好與 MAX()
功能相反,它返回指定列的最小值。與 MAX()
一樣,MIN()
要求指定列名,如下所示:
SELECT MIN(prod_price) AS min_price
FROM Products;
輸出:
min_price
----------
3.4900
其中 MIN()
返回 Products
表中最便宜物品的價格。
提示:對非數值數據使用
MIN()
雖然
MIN()
一般用來找出最小的數值或日期值,但許多(並非所有)DBMS 允許將它用來返回任意列中的最小值,包括返迴文本列中的最小值。在用於文本數據時,
MIN()
返回該列排序後最前面的行。
說明:
NULL
值
MIN()
函數忽略列值為NULL
的行。
1.5 SUM() 函數
SUM()
用來返回指定列值的和(總計)。
下麵舉一個例子,OrderItems
包含訂單中實際的物品,每個物品有相應的數量。可如下檢索所訂購物品的總數(所有 quantity
值之和):
SELECT SUM(quantity) AS items_ordered
FROM OrderItems
WHERE order_num = 20005;
輸出:
items_ordered
----------
200
函數 SUM(quantity)
返回訂單中所有物品數量之和,WHERE
子句保證只統計某個物品訂單中的物品。
SUM()
也可以用來合計計算值。在下麵的例子中,合計每項物品的 item_price*quantity
,得出總的訂單金額:
SELECT SUM(item_price*quantity) AS total_price
FROM OrderItems
WHERE order_num = 20005;
輸出:
total_price
----------
1648.0000
函數 SUM(item_price*quantity)
返回訂單中所有物品價錢之和,WHERE
子句同樣保證只統計某個物品訂單中的物品。
提示:在多個列上進行計算
如本例所示,利用標準的算術操作符,所有聚集函數都可用來執行多個列上的計算。
說明:
NULL
值
SUM()
函數忽略列值為NULL
的行。
二、聚集不同值
以上 5 個聚集函數都可以如下使用。
- 對所有行執行計算,指定
ALL
參數或不指定參數(因為ALL
是預設行為)。 - 只包含不同的值,指定
DISTINCT
參數。
提示:
ALL
為預設
ALL
參數不需要指定,因為它是預設行為。如果不指定DISTINCT
,則假定為ALL
。
下麵的例子使用 AVG()
函數返回特定供應商提供的產品的平均價格。它與上面的 SELECT
語句相同,但使用了 DISTINCT
參數,因此平均值只考慮各個不同的價格:
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM Products
WHERE vend_id = 'DLL01';
輸出:
avg_price
-----------
4.2400
可以看到,在使用了 DISTINCT
後,此例子中的 avg_price
比較高,因為有多個物品具有相同的較低價格。排除它們提升了平均價格。
註意:
DISTINCT
不能用於COUNT(*)
如果指定列名,則
DISTINCT
只能用於COUNT()
。DISTINCT
不能用於COUNT(*)
。類似地,DISTINCT
必須使用列名,不能用於計算或表達式。
提示:將
DISTINCT
用於MIN()
和MAX()
雖然
DISTINCT
從技術上可用於MIN()
和MAX()
,但這樣做實際上沒有價值。一個列中的最小值和最大值不管是否只考慮不同值,結果都是相同的。
說明:其他聚集參數
除了這裡介紹的
DISTINCT
和ALL
參數,有的 DBMS 還支持其他參數,如支持對查詢結果的子集進行計算的TOP
和TOP PERCENT
。為瞭解具體的 DBMS 支持哪些參數,請參閱相應的文檔。
三、組合聚集函數
目前為止的所有聚集函數例子都只涉及單個函數。但實際上,SELECT
語句可根據需要包含多個聚集函數。請看下麵的例子:
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM Products;
輸出:
num_items price_min price_max price_avg
---------- --------------- --------------- ---------
9 3.4900 11.9900 6.823333
這裡用單條 SELECT
語句執行了 4 個聚集計算,返回 4 個值(Products
表中物品的數目,產品價格的最高值、最低值以及平均值)。
註意:取別名
在指定別名以包含某個聚集函數的結果時,不應該使用表中實際的列名。雖然這樣做也算合法,但許多 SQL 實現不支持,可能會產生模糊的錯誤消息。
四、小結
聚集函數用來彙總數據。SQL 支持 5 個聚集函數,可以用多種方法使用它們,返回所需的結果。這些函數很高效,它們返回結果一般比你在自己的客戶端應用程式中計算要快得多。
原文鏈接:https://www.developerastrid.com/sql/sql-summarizing-data/
(完)