mysql聚合函式的使用
很多時候,我們還希望能夠通過對資料進行分析,總結出規律和趨勢或生成高水平的報表。例如,對於採購經理來說,他可能對所有銷售出去的產品清單不感興趣,而只是想要知道這個月產品的銷售量。SQL提供了聚合函式(aggregate functions)功能來支援對大量資料進行總結的操作。
本文我們將具體來看看這些函式的功能和用法,包括新增資料和計算平均值的函式、對符合特定標準的記錄進行計數的函式,以及找出表中最大值和最小值的函式。
我們將使用下文所示的ProductOrder表來執行我們所有的查詢。注意,這個表並沒有標準化,而是將幾個資料實體聯合到一個表中,這樣做是為了簡化條件方便說明。如果要設計較好的關係資料庫,應當把這些內容至少分成三個關聯表Products、Orders和Customers。
訂單號 |
客戶名 |
客戶姓 |
數量 |
單價 |
所在地 |
122 |
John |
Jacob |
21 |
4.52 |
北美洲 |
923 |
Ralph |
Wiggum |
192 |
3.99 |
北美洲 |
238 |
Ryan |
Johnson |
87 |
4.49 |
非洲 |
829 |
Mary |
Smith |
842 |
2.99 |
北美洲 |
824 |
Elizabeth |
Marks |
48 |
3.48 |
非洲 |
753 |
James |
Linea |
9 |
7.85 |
北美洲 |
942 |
Alan |
Jonas |
638 |
3.29 |
歐洲 |
1.SUM函式:
我們先從SUM函式開始。這個函式通常在SELECT語句中使用,返回系列值的總數。假設產品專案經理想了解目前為止商品的總銷售額,那麼我們可以使用以下的查詢指令碼:
SELECT SUM(數量) AS 總數 |
2. AVG函式(平均函式)
使用方法和SUM類似,它給我們提供系列值的算術平均數。這次我們可以嘗試稍微複雜點的任務:找出北美洲大陸所有訂單的金額平均值。注意,我們需要將“數量”列和“單價”列相乘計算出每張訂單的金額總數。查詢指令碼如下:
SELECT AVG(單價* 數量) As 平均金額 |
3. COUNT計數函式
SQL提供了COUNT函式來查詢滿足設定標準的記錄的數量。我們可以使用單獨COUNT(*)語法來檢索一個表內的行數。此外,還可以利用WHERE子句來設定計數條件,返回特定記錄的條數。例如,假設我們的產品銷售經理想了解公司處理了多少張要求購買100個以上產品的訂單。下面是滿足這個條件的SQL查詢指令碼:
SELECT COUNT(*) AS '大訂單數量' |
COUNT函式還允許使用 DISTINCT關鍵字和表示式來計算滿足表示式的值在目標資料中出現的數量。同樣地,還可以使用ALL關鍵字來返回滿足表示式的值的全部數量,不管其中有沒有重複值。例如,產品經理想通過一個簡單查詢返回資料庫中“所在地”的數量。
首先我們來看看使用ALL關鍵字的查詢:
SELECT COUNT(ALL
所在地) As '所在地數量' 返回的結果為: 所在地數量 |
顯然這不是我們需要的結果。因為根據ProductOrders表所示,所有訂單的所在地只有三個,分別是北美洲、非洲、歐洲。下面讓我們來用DISTINCT關鍵字來代替看看:
SELECT COUNT(DISTINCT 所在地) As '所在地數量' |
這才是我們想要的結果。
4. 最大值和最小值
在本文的最後一節,我們來看看SQL為我們提供用來查詢滿足給定表示式的最大值和最小值的函式。MAX()函式返回給定資料集中的最大值。我們可以給該函式一個欄位名稱來返回表中給定欄位的最大值。還可以在MAX()函式中使用表示式和GROUP BY從句來加強查詢功能。
還是ProductOrders表,假設我們的產品經理想要從這個資料庫中找到給公司帶來最多收入的那份訂單。我們可以使用以下查詢來找到這張訂單,並返回該訂單的銷售總金額:
SELECT MAX(數量 * 單價)As '最大的訂單' |
MIN()函式的用法類似,但返回表示式的最小值。讓我們用MIN()函式來嘗試稍微複雜一點的查詢。我們的銷售部門目前正在分析小訂單的資料。他們想要查詢每個所在地的最小訂單。這除了要在表示式中計算值外,還需要用到GROUP BY從句來總結所在地的資料。SQL查詢如下:
SELECT 所在地, MIN(數量 *
單價) AS '最小訂單'
FROM ProductOrders
GROUP BY 所在地
返回結果如下:
所在地最小訂單------------- ---------------------
非洲 167.04
歐洲 2099.02
北美洲70.65