要統計記錄數量用count()函數,計算總和與平均值用sum()和avg(),查找極值用max()和min(),結合group by實現分組統計。1. count(*)統計所有行,count(字段名)僅統計非NULL值;2. sum(字段)求總和,avg(字段)求平均值,僅適用于數值型;3. max()和min()可獲取最大值與最小值,支持數值、日期、字符串類型;4. 使用group by按字段分組后聚合,結合having篩選分組結果,實現復雜統計分析。
在 mysql 查詢中,聚合函數是非常實用的一類函數,尤其在做統計、匯總時幾乎離不開它們。常見的比如 SUM、AVG、COUNT、MAX、MIN 等,都是處理數據時最常用到的工具。
下面結合幾個實際場景,看看這些函數是怎么用的。
如何統計表中的記錄數量?
COUNT() 是最常用來統計行數的函數。它有幾個使用方式:
- COUNT(*):統計所有行數,包括 NULL。
- COUNT(字段名):只統計該字段不為 NULL 的行數。
示例:
假設有一個用戶表 users,想查看總共有多少注冊用戶:
SELECT COUNT(*) AS total_users FROM users;
如果只想統計有手機號的用戶數量:
SELECT COUNT(phone) AS has_phone_users FROM users;
這種方式在分析數據完整性或缺失率時非常有用。
如何計算某列的總和與平均值?
當你需要對某個數值型字段進行求和或求平均時,SUM() 和 AVG() 就派上用場了。
實際案例:
假設有一個訂單表 orders,里面有訂單金額 amount 字段。要統計所有訂單總金額和平均訂單金額:
SELECT SUM(amount) AS total_amount, AVG(amount) AS avg_amount FROM orders;
這在財務報表、銷售分析中是常見需求。
注意:這兩個函數都只對數值型字段有效,不能用于字符串或日期類型。
如何找出最大值和最小值?
MAX() 和 MIN() 可以快速獲取某一列的最大值和最小值,適用于數值、日期、字符串等多種類型。
舉例說明:
還是以 orders 表為例,想知道最高和最低訂單金額:
SELECT MAX(amount) AS max_order, MIN(amount) AS min_order FROM orders;
也可以用在時間字段上,比如找出最早和最近的下單時間:
SELECT MIN(order_date) AS first_order, MAX(order_date) AS latest_order FROM orders;
這對了解業務的時間跨度很有幫助。
聚合函數 + 分組查詢的實際應用
真正的統計分析往往不是全局匯總,而是按類別分組后再聚合。這就需要用到 GROUP BY。
場景舉例:
有一個銷售記錄表 sales,包含 product_id(產品ID)和 sale_amount(銷售額)。我們想看每個產品的總銷售額:
SELECT product_id, SUM(sale_amount) AS total_sales FROM sales GROUP BY product_id;
還可以加上篩選條件,例如只看總銷售額超過1000的產品:
SELECT product_id, SUM(sale_amount) AS total_sales FROM sales GROUP BY product_id HAVING total_sales > 1000;
這里注意:
- WHERE 是在分組前過濾數據;
- HAVING 是在分組后篩選結果。
這是很多人容易混淆的地方。
基本上就這些。聚合函數雖然看起來簡單,但在實際查詢中靈活搭配 GROUP BY、HAVING、JOIN 等語句,可以完成非常復雜的統計任務。用得多了你會發現,很多數據分析其實就是在“怎么分組+怎么匯總”之間做文章。