MySQL聚合查询COUNT、SUM、AVG用法实战案例指南

 更新时间:2026年05月18日 10:52:35   作者:Languorous.  
本文主要讲述了MySQL中最常用的聚合函数:COUNT、SUM、AVG的用法、场景和避免误区的方法,通过实战案例深入剖析了每个函数的适用场景和注意事项,感兴趣的朋友跟随小编一起看看吧

前言

日常开发中,我们经常需要对数据进行「统计分析」,比如:统计用户总数、计算平均年龄、求和订单金额,这时候就需要用到 MySQL 聚合函数。

最常用的聚合函数有3个:COUNT(计数)、SUM(求和)、AVG(求平均),本篇用实战案例,讲透每个函数的用法、场景和避坑点,新手能直接套用。

继续使用前面的user表,新增一张订单表(增加实战场景):

-- 创建订单表 order(注意order是关键字,用反引号包裹)
CREATE TABLE `order` (
    order_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT,  -- 关联用户表主键
    amount DECIMAL(10,2),  -- 订单金额(保留2位小数)
    create_time DATETIME DEFAULT NOW()
);
-- 插入订单测试数据
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:计数(最常用)

核心作用:统计符合条件的「记录条数」,有3种常用写法,重点区分差异。

1. COUNT(*)

统计所有记录条数,包括 NULL 值(最常用、效率最高)。

-- 1. 统计用户总数
SELECT COUNT(*) AS user_total FROM user;
-- 2. 统计性别为男的用户数
SELECT COUNT(*) AS male_total FROM user WHERE gender = 1;
-- 3. 统计订单总数
SELECT COUNT(*) AS order_total FROM `order`;

2. COUNT(字段名)

统计该字段「非NULL值」的记录条数,忽略NULL值。

-- 统计age字段非NULL的用户数(如果有用户age为NULL,会被排除)
SELECT COUNT(age) AS age_not_null FROM user;

3. COUNT(DISTINCT 字段名)

统计该字段「非NULL且不重复」的记录条数。

-- 统计有订单的不同用户数(一个用户可能有多个订单,只算1次)
SELECT COUNT(DISTINCT user_id) AS user_with_order FROM `order`;

COUNT避坑

❌ 错误:用COUNT(字段名)统计总条数,忽略了NULL值,导致统计结果偏小;

✅ 正确:统计总条数优先用 COUNT(*),统计非NULL字段用 COUNT(字段名)。

二、SUM:求和

核心作用:对指定「数值类型字段」求和,忽略NULL值,非数值类型求和会返回0。

-- 1. 统计所有订单的总金额
SELECT SUM(amount) AS total_amount FROM `order`;
-- 2. 统计用户id=1的所有订单金额总和
SELECT SUM(amount) AS user1_total FROM `order` WHERE user_id = 1;
-- 3. 非数值字段求和(返回0,无意义)
SELECT SUM(name) AS wrong_sum FROM user;

SUM避坑

❌ 错误:对非数值字段(如name、email)使用SUM,结果无意义;

✅ 正确:SUM仅用于数值类型字段(int、decimal等)。

三、AVG:求平均

核心作用:对指定「数值类型字段」求平均值,忽略NULL值,计算逻辑:总和 ÷ 非NULL记录数。

-- 1. 计算所有用户的平均年龄
SELECT AVG(age) AS avg_age FROM user;
-- 2. 计算所有订单的平均金额(保留2位小数,用ROUND函数)
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,会导致平均年龄计算偏差;

✅ 正确:如果需要包含NULL值(按0计算),可搭配IFNULL函数:SELECT AVG(IFNULL(age, 0)) FROM user;

四、聚合查询实战案例

需求:统计有订单的用户中,年龄大于20的用户数、他们的平均年龄、以及他们的订单总金额。

SELECT 
    COUNT(DISTINCT u.id) AS target_user,  -- 符合条件的用户数
    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  -- 关联用户表和订单表
WHERE u.age > 20 AND o.user_id IS NOT NULL;  -- 有订单且年龄>20

五、总结

1. COUNT:计数,优先用COUNT(*),统计非NULL用COUNT(字段),去重计数用COUNT(DISTINCT 字段);

2. SUM:对数值字段求和,忽略NULL,非数值字段返回0;

3. AVG:对数值字段求平均,忽略NULL,可搭配ROUND函数保留小数。

到此这篇关于MySQL聚合查询COUNT、SUM、AVG用法实战案例指南的文章就介绍到这了,更多相关mysql聚合查询count、sum avg用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySql8 WITH RECURSIVE递归查询父子集的方法

    MySql8 WITH RECURSIVE递归查询父子集的方法

    这篇文章主要介绍了MySql8 WITH RECURSIVE递归查询父子集的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • mysql sql常用语句大全

    mysql sql常用语句大全

    这篇文章主要介绍了mysql sql常用语句大全,主要包括操作数据库的命令,修改表的命令及对数据库的操作,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Mysql迁移到TiDB双写数据库兜底方案详解

    Mysql迁移到TiDB双写数据库兜底方案详解

    这篇文章主要为大家介绍了Mysql迁移到TiDB双写数据库兜底方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • MySql多表链接查询详细教程

    MySql多表链接查询详细教程

    这篇文章主要介绍了MySql多表链接查询详细教程的相关资料,需要的朋友可以参考下
    2022-10-10
  • Mysql数据库设计三范式实例解析

    Mysql数据库设计三范式实例解析

    这篇文章主要介绍了Mysql数据库设计三范式实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 简单了解mysql InnoDB MyISAM相关区别

    简单了解mysql InnoDB MyISAM相关区别

    这篇文章主要介绍了简单了解mysql InnoDB MyISAM相关区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • mysql实现按照某个时间段分组统计

    mysql实现按照某个时间段分组统计

    这篇文章主要介绍了mysql实现按照某个时间段分组统计方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 傻瓜式用Eclipse连接MySQL数据库

    傻瓜式用Eclipse连接MySQL数据库

    本来不想写这么简单人文章,在百度上搜索我这个标题,完全符合标题的一大堆。但我按照那些文章捣鼓了很久,就是不行。
    2015-09-09
  • MySQL存储引擎MyISAM与InnoDB的9点区别

    MySQL存储引擎MyISAM与InnoDB的9点区别

    这篇文章主要介绍了MySQL存储引擎MyISAM与InnoDB的9点区别,写给有选择困难症的同学,需要的朋友可以参考下
    2014-08-08
  • 使用MySQL的geometry类型处理经纬度距离问题的方法

    使用MySQL的geometry类型处理经纬度距离问题的方法

    这篇文章主要介绍了使用MySQL的geometry类型处理经纬度距离问题的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01

最新评论