聚集函式
我們經常需要匯總資料而不用把它們實際檢索出來,為此MySQL提
供了專門的函式,使用這些函式,MySQL查詢可用于檢索資料,以便分
析和報表生成,這種型別的檢索例子有以下幾種,
- 確定表中行數(或者滿足某個條件或包含某個特定值的行數),
- 獲得表中行組的和,
- 找出表列(或所有行或某些特定的行)的最大值、最小值和平均
值,
上述例子都需要對表中資料(而不是實際資料本身)匯總,因此,
回傳實際表資料是對時間和處理資源的一種浪費(更不用說帶寬了),重
復一遍,實際想要的是匯總資訊,
為方便這種型別的檢索,MySQL給出了5個聚集函式,見表12-1,
這些函式能進行上述羅列的檢索
聚集函式(aggregate function) 運行在行組上,計算和回傳單
個值的函式,

AVG()函式
AVG() 通過對表中行數計數并計算特定列值之和,求得該列的平均
值, AVG() 可用來回傳所有列的平均值,也可以用來回傳特定列或行的平
均值,

AVG() 也可以用來確定特定列或行的平均值

這條 SELECT 陳述句與前一條的不同之處在于它包含了 WHERE 子
句,此 WHERE 子句僅過濾出 vend_id 為 1003 的產品,因此
avg_price 中回傳的值只是該供應商的產品的平均值
只用于單個列 AVG() 只能用來確定特定數值列的平均值,而
且列名必須作為函式引數給出,為了獲得多個列的平均值,
必須使用多個 AVG() 函式
NULL 值 AVG() 函式忽略列值為 NULL 的行
COUNT()函式
COUNT() 函式進行計數,可利用 COUNT() 確定表中行的數目或符合特
定條件的行的數目,
COUNT() 函式有兩種使用方式,
- 使用 COUNT(*) 對表中行的數目進行計數,不管表列中包含的是空
值( NULL )還是非空值, - 使用 COUNT(column) 對特定列中具有值的行進行計數,忽略
NULL 值,
下面的例子回傳 customers 表中客戶的總數

下面的例子只對具有電子郵件地址的客戶計數

這條 SELECT 陳述句使用 COUNT(cust_email) 對 cust_email 列
中有值的行進行計數,在此例子中, cust_email 的計數為 3 (表
示5個客戶中只有3個客戶有電子郵件地址)
NULL 值 如果指定列名,則指定列的值為空的行被 COUNT()
函式忽略,但如果 COUNT() 函式中用的是星號( * ),則不忽
略
MAX()函式
MAX() 回傳指定列中的最大值, MAX() 要求指定列名

對非數值資料使用 MAX() 雖然 MAX() 一般用來找出最大的
數值或日期值,但MySQL允許將它用來回傳任意列中的最大
值,包括回傳文本列中的最大值,在用于文本資料時,如果數
據按相應的列排序,則 MAX() 回傳最后一行
NULL 值 MAX() 函式忽略列值為 NULL 的行,
MIN()函式
MIN() 的功能正好與 MAX() 功能相反,它回傳指定列的最小值,與
MAX() 一樣, MIN() 要求指定列名
對非數值資料使用 MIN() MIN() 函式與 MAX() 函式類似,
MySQL允許將它用來回傳任意列中的最小值,包括回傳文本
列中的最小值,在用于文本資料時,如果資料按相應的列排序,
則 MIN() 回傳最前面的行
NULL 值 MIN() 函式忽略列值為 NULL 的行
SUM()函式
SUM() 用來回傳指定列值的和(總計),
下面舉一個例子, orderitems表 包含訂單中實際的物品,每個物品
有相應的數量( quantity ),可如下檢索所訂購物品的總數(所有
quantity 值之和):

函式 SUM(quantity) 回傳訂單中所有物品數量之和, WHERE 子
句保證只統計某個物品訂單中的物品
SUM() 也可以用來合計計算值,在下面的例子中,合計每項物品的
item_price*quantity ,得出總的訂單金額

函式 SUM(item_price*quantity) 回傳訂單中所有物品價錢
之和, WHERE 子句同樣保證只統計某個物品訂單中的物品
在多個列上進行計算 如本例所示,利用標準的算術運算子,
所有聚集函式都可用來執行多個列上的計算
NULL 值 SUM() 函式忽略列值為 NULL 的行,
聚集不同值
MySQL 5 及 后 期 版 本 下 面 將 要 介 紹 的 聚 集 函 數 的
DISTINCT 的使用,已經被添加到MySQL 5.0.3中,下面所述
內容在MySQL 4.x中不能正常運行
以上5個聚集函式都可以如下使用:
- 對所有的行執行計算,指定 ALL 引數或不給引數(因為 ALL 是默認
行為); - 只包含不同的值,指定 DISTINCT 引數,
ALL 為默認 ALL 引數不需要指定,因為它是默認行為,如果
不指定 DISTINCT ,則假定為 ALL
下面的例子使用 AVG() 函式回傳特定供應商提供的產品的平均價格,
它與上面的 SELECT 陳述句相同,但使用了 DISTINCT 引數,因此平均值只
考慮各個不同的價格

注意 如果指定列名,則 DISTINCT 只能用于 COUNT() , DISTINCT
不能用于 COUNT(*),因此不允許使用COUNT(DISTINCT),
否則會產生錯誤 ,類似地, DISTINCT 必須使用列名,不能用
于計算或運算式
將 DISTINCT 用于 MIN() 和 MAX() 雖然 DISTINCT 從技術上可
用于 MIN() 和 MAX() ,但這樣做實際上沒有價值,一個列中的
最小值和最大值不管是否包含不同值都是相同的
組合聚集函式
目前為止的所有聚集函式例子都只涉及單個函式,但實際上 SELECT
陳述句可根據需要包含多個聚集函式,請看下面的例子:

取別名 在指定別名以包含某個聚集函式的結果時,不應該使
用表中實際的列名,雖然這樣做并非不合法,但使用唯一的名
字會使你的SQL更易于理解和使用(以及將來容易排除故障)
聚集函式用來匯總資料,MySQL支持一系列聚集函式,可以用多種
方法使用它們以回傳所需的結果,這些函式是高效設計的,它們回傳結
果一般比你在自己的客戶機應用程式中計算要快得多
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/84260.html
標籤:MySQL
