12.1 聚集函數
聚集函數( aggregate function) 運行在行組上,計算和返回單個值的函數。
函 數 | 說 明 |
---|---|
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行數 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
12.1.1 AVG()函數
AVG()
通過對錶中行數計數並計算特定列值之和,求得該列的平均值。 AVG()
可用來返回所有列的平均值,也可以用來返回特定列或行的平均值。下面的例子使用AVG()返回products表中所有產品的平均價格:
mysql> SELECT AVG(prod_price) AS avg_price FROM products;
+-----------+
| avg_price |
+-----------+
| 16.133571 |
+-----------+
- 分析:此SELECT語句返回值
avg_price
,它包含products
表中所有產品的平均價格。
mysql> SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id = 1003;
+-----------+
| avg_price |
+-----------+
| 13.212857 |
+-----------+
- 分析:這條
SELECT
語句與前一條的不同之處在於它包含了WHERE
子句。此WHERE
子句僅過濾出vend_id
爲1003
的產品,因此avg_price
中返回的值只是該供應商的產品的平均值。
只用於單個列 AVG():只能用來確定特定數值列的平均值,而且列名必須作爲函數參數給出。爲了獲得多個列的平均值,必須使用多個AVG()函數。
NULL值:AVG()函數忽略列值爲NULL的行。
12.1.2 COUNT()函數
COUNT()
函數進行計數。 可利用COUNT()
確定表中行的數目或符合特定條件的行的數目。
COUNT()
函數有兩種使用方式。
- 使用
COUNT(*)
對錶中行的數目進行計數, 不管表列中包含的是空
值( NULL)
還是非空值。 - 使用
COUNT(column)
對特定列中具有值的行進行計數,忽略NULL
值。
下面的例子返回customers
表中客戶的總數:
mysql> SELECT COUNT(*) AS num_cust FROM customers;
+----------+
| num_cust |
+----------+
| 5 |
+----------+
- 分析:在此例子中,利用
COUNT(*)
對所有行計數,不管行中各列有什麼值。計數值在num_cust
中返回。
下面的例子只對具有電子郵件地址的客戶計數:
mysql> 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()
函數忽略,但如果COUNT()
函數中用的是星號( *)
,則不忽略。
12.1.3 MAX()函數
MAX()
返回指定列中的最大值。 MAX()
要求指定列名,如下所示:
mysql> SELECT MAX(prod_price) AS max_price FROM products;
+-----------+
| max_price |
+-----------+
| 55.00 |
+-----------+
- 分析:這裏,
MAX()
返回products
表中最貴的物品的價格。
對非數值數據使用MAX():雖然
MAX()
一般用來找出最大的數值或日期值,但MySQL允許將它用來返回任意列中的最大值,包括返回文本列中的最大值。在用於文本數據時,如果數據按相應的列排序,則MAX()
返回最後一行。
NULL值:MAX()
函數忽略列值爲NULL的行。
12.1.4 MIN()函數
MIN()
的功能正好與MAX()
功能相反,它返回指定列的最小值。與MAX()
一樣, MIN()
要求指定列名,如下所示:
mysql> SELECT MIN(prod_price) AS min_price FROM products;
+-----------+
| min_price |
+-----------+
| 2.50 |
+-----------+
- 分析:其中
MIN()
返回products表中最便宜物品的價格。
12.1.5 SUM()函數
SUM()
用來返回指定列值的和(總計)。
下面舉一個例子, orderitems表包含訂單中實際的物品,每個物品有相應的數量( quantity) 。可如下檢索所訂購物品的總數(所有quantity值之和):
mysql> SELECT SUM(quantity) AS items_ordered FROM orderitems WHERE order_num = 20005;
+---------------+
| items_ordered |
+---------------+
| 19 |
+---------------+
- 分析:函數
SUM(quantity)
返回訂單中所有物品數量之和,WHERE
子句保證只統計某個物品訂單中的物品。
SUM()
也可以用來合計計算值。在下面的例子中,合計每項物品的item_price*quantity
,得出總的訂單金額:
mysql> SELECT SUM(item_price*quantity) AS total_price FROM orderitems WHERE order_num = 20005;
+-------------+
| total_price |
+-------------+
| 149.87 |
+-------------+
- 分析:函數
SUM(item_price*quantity)
返回訂單中所有物品價錢之和,WHERE
子句同樣保證只統計某個物品訂單中的物品。
在多個列上進行計算:如本例所示,利用標準的算術操作符,所有聚集函數都可用來執行多個列上的計算。
NULL值:SUM()函數忽略列值爲NULL的行。
12.2 聚集不同值
以上5個聚集函數都可以如下使用:
- 對所有的行執行計算,指定
ALL
參數或不給參數(因爲ALL
是默認行爲); - 只包含不同的值,指定
DISTINCT
參數。
ALL爲默認:ALL參數不需要指定,因爲它是默認行爲。如果不指定DISTINCT,則假定爲ALL。
下面的例子使用AVG()
函數返回特定供應商提供的產品的平均價格。它與上面的SELECT
語句相同,但使用了DISTINCT
參數,因此平均值只考慮各個不同的價格:
mysql> SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id = 1003;
+-----------+
| avg_price |
+-----------+
| 15.998000 |
+-----------+
- 分析:可以看到,在使用了
DISTINCT
後,此例子中的avg_price
比較高,因爲有多個物品具有相同的較低價格。排除它們提升了平均價格。
12.3 組合聚集函數
目前爲止的所有聚集函數例子都只涉及單個函數。但實際上SELECT
語句可根據需要包含多個聚集函數。請看下面的例子:
mysql> 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 |
+-----------+-----------+-----------+-----------+
| 14 | 2.50 | 55.00 | 16.133571 |
+-----------+-----------+-----------+-----------+
- 分析:這裏用單條SELECT語句執行了4個聚集計算,返回4個值(products表中物品的數目,產品價格的最高、最低以及平均值)。
取別名:在指定別名以包含某個聚集函數的結果時,不應該使用表中實際的列名。雖然這樣做並非不合法,但使用唯一的名字會使你的SQL更易於理解和使用(以及將來容易排除故障)。