MySQL聚合查詢COUNT、SUM、AVG用法實戰(zhàn)案例指南
前言
日常開發(fā)中,我們經(jīng)常需要對數(shù)據(jù)進(jìn)行「統(tǒng)計分析」,比如:統(tǒng)計用戶總數(shù)、計算平均年齡、求和訂單金額,這時候就需要用到 MySQL 聚合函數(shù)。
最常用的聚合函數(shù)有3個:COUNT(計數(shù))、SUM(求和)、AVG(求平均),本篇用實戰(zhàn)案例,講透每個函數(shù)的用法、場景和避坑點,新手能直接套用。
繼續(xù)使用前面的user表,新增一張訂單表(增加實戰(zhàn)場景):
-- 創(chuàng)建訂單表 order(注意order是關(guān)鍵字,用反引號包裹)
CREATE TABLE `order` (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT, -- 關(guān)聯(lián)用戶表主鍵
amount DECIMAL(10,2), -- 訂單金額(保留2位小數(shù))
create_time DATETIME DEFAULT NOW()
);-- 插入訂單測試數(shù)據(jù) INSERT INTO `order` (user_id, amount) VALUES (1, 99.90), (1, 199.90), (2, 59.90), (3, 299.90), (4, 159.90), (4, 89.90);
一、COUNT:計數(shù)(最常用)
核心作用:統(tǒng)計符合條件的「記錄條數(shù)」,有3種常用寫法,重點區(qū)分差異。
1. COUNT(*)
統(tǒng)計所有記錄條數(shù),包括 NULL 值(最常用、效率最高)。
-- 1. 統(tǒng)計用戶總數(shù) SELECT COUNT(*) AS user_total FROM user; -- 2. 統(tǒng)計性別為男的用戶數(shù) SELECT COUNT(*) AS male_total FROM user WHERE gender = 1; -- 3. 統(tǒng)計訂單總數(shù) SELECT COUNT(*) AS order_total FROM `order`;
2. COUNT(字段名)
統(tǒng)計該字段「非NULL值」的記錄條數(shù),忽略NULL值。
-- 統(tǒng)計age字段非NULL的用戶數(shù)(如果有用戶age為NULL,會被排除) SELECT COUNT(age) AS age_not_null FROM user;
3. COUNT(DISTINCT 字段名)
統(tǒng)計該字段「非NULL且不重復(fù)」的記錄條數(shù)。
-- 統(tǒng)計有訂單的不同用戶數(shù)(一個用戶可能有多個訂單,只算1次) SELECT COUNT(DISTINCT user_id) AS user_with_order FROM `order`;
COUNT避坑
? 錯誤:用COUNT(字段名)統(tǒng)計總條數(shù),忽略了NULL值,導(dǎo)致統(tǒng)計結(jié)果偏小;
? 正確:統(tǒng)計總條數(shù)優(yōu)先用 COUNT(*),統(tǒng)計非NULL字段用 COUNT(字段名)。
二、SUM:求和
核心作用:對指定「數(shù)值類型字段」求和,忽略NULL值,非數(shù)值類型求和會返回0。
-- 1. 統(tǒng)計所有訂單的總金額 SELECT SUM(amount) AS total_amount FROM `order`; -- 2. 統(tǒng)計用戶id=1的所有訂單金額總和 SELECT SUM(amount) AS user1_total FROM `order` WHERE user_id = 1; -- 3. 非數(shù)值字段求和(返回0,無意義) SELECT SUM(name) AS wrong_sum FROM user;
SUM避坑
? 錯誤:對非數(shù)值字段(如name、email)使用SUM,結(jié)果無意義;
? 正確:SUM僅用于數(shù)值類型字段(int、decimal等)。
三、AVG:求平均
核心作用:對指定「數(shù)值類型字段」求平均值,忽略NULL值,計算邏輯:總和 ÷ 非NULL記錄數(shù)。
-- 1. 計算所有用戶的平均年齡 SELECT AVG(age) AS avg_age FROM user; -- 2. 計算所有訂單的平均金額(保留2位小數(shù),用ROUND函數(shù)) SELECT ROUND(AVG(amount), 2) AS avg_amount FROM `order`; -- 3. 計算性別為女的用戶平均年齡 SELECT AVG(age) AS female_avg_age FROM user WHERE gender = 2;
AVG避坑
? 錯誤:忽略NULL值的影響,比如部分用戶age為NULL,會導(dǎo)致平均年齡計算偏差;
? 正確:如果需要包含NULL值(按0計算),可搭配IFNULL函數(shù):SELECT AVG(IFNULL(age, 0)) FROM user;
四、聚合查詢實戰(zhàn)案例
需求:統(tǒng)計有訂單的用戶中,年齡大于20的用戶數(shù)、他們的平均年齡、以及他們的訂單總金額。
SELECT
COUNT(DISTINCT u.id) AS target_user, -- 符合條件的用戶數(shù)
ROUND(AVG(u.age), 2) AS avg_age, -- 平均年齡
SUM(o.amount) AS total_order_amount -- 訂單總金額
FROM user u
LEFT JOIN `order` o ON u.id = o.user_id -- 關(guān)聯(lián)用戶表和訂單表
WHERE u.age > 20 AND o.user_id IS NOT NULL; -- 有訂單且年齡>20五、總結(jié)
1. COUNT:計數(shù),優(yōu)先用COUNT(*),統(tǒng)計非NULL用COUNT(字段),去重計數(shù)用COUNT(DISTINCT 字段);
2. SUM:對數(shù)值字段求和,忽略NULL,非數(shù)值字段返回0;
3. AVG:對數(shù)值字段求平均,忽略NULL,可搭配ROUND函數(shù)保留小數(shù)。
到此這篇關(guān)于MySQL聚合查詢COUNT、SUM、AVG用法實戰(zhàn)案例指南的文章就介紹到這了,更多相關(guān)mysql聚合查詢count、sum avg用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MYSQL聚合查詢、分組查詢、聯(lián)合查詢舉例詳解
- MySQL 數(shù)據(jù)庫約束、聚合查詢和聯(lián)合查詢使用案例
- MySQL進(jìn)階查詢、聚合查詢和聯(lián)合查詢
- MySQL聚合查詢與聯(lián)合查詢操作實例
- MySQL?數(shù)據(jù)庫聚合查詢和聯(lián)合查詢操作
- mysql數(shù)據(jù)庫之count()函數(shù)和sum()函數(shù)用法及區(qū)別說明
- mysql一條sql查出多個條件不同的sum或count問題
- mysql?sum(if())和count(if())的用法說明
- Mysql中的count()與sum()區(qū)別詳細(xì)介紹
相關(guān)文章
mysql 常用數(shù)據(jù)庫語句 小練習(xí)
一個mysql小練習(xí) 建表 查詢 修改表 增加字段 刪除字段2009-07-07
SQL?日期處理視圖創(chuàng)建(常見數(shù)據(jù)類型查詢防范?SQL注入)
這篇文章主要為大家介紹了SQL日期處理和視圖創(chuàng)建:常見數(shù)據(jù)類型、示例查詢和防范?SQL?注入方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
MySQL敏感數(shù)據(jù)進(jìn)行加密的幾種方法小結(jié)
本文介紹了在MySQL中對敏感數(shù)據(jù)進(jìn)行加密的幾種方法,每種方法都有其適用場景和特點,可以根據(jù)具體需求選擇合適的方法來保護(hù)數(shù)據(jù)安全,感興趣的可以了解一下2024-11-11
Mysql將查詢結(jié)果集轉(zhuǎn)換為JSON數(shù)據(jù)的實例代碼
這篇文章主要介紹了Mysql將查詢結(jié)果集轉(zhuǎn)換為JSON數(shù)據(jù)的實例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
MySQL中連接池參數(shù)優(yōu)化與性能提升指南
這篇文章主要深入探討了MySQL連接池中的關(guān)鍵參數(shù),分析參數(shù)配置不合理可能導(dǎo)致的性能問題,并分享實用的優(yōu)化方法,希望可以幫助開發(fā)者提升系統(tǒng)性能2025-07-07

