MySQL的聚合函数是用于对一组值进行计算并返回单个汇总结果的函数,常和GROUP BY子句配合使用,实现分组统计的需求,也可以单独使用完成全表数据的统计。

常用聚合函数及功能说明
1. COUNT() 统计函数
COUNT()用于统计符合条件的行数,支持三种常见用法:
COUNT(*):统计所有行数,包括值为NULL的行COUNT(列名):统计指定列非NULL的行数,会忽略该列值为NULL的行COUNT(DISTINCT 列名):统计指定列去重后的非NULL行数
示例代码如下:
-- 统计用户表总条数 SELECT COUNT(*) AS total_user FROM user; -- 统计有邮箱的用户数量,忽略email为NULL的行 SELECT COUNT(email) AS has_email_user FROM user; -- 统计去重后的城市数量 SELECT COUNT(DISTINCT city) AS city_count FROM user;
2. SUM() 求和函数
SUM()用于对指定列的数值进行求和,仅处理数值类型的列,会忽略值为NULL的行,如果所有值都是NULL则返回NULL。
示例代码如下:
-- 统计所有订单的总金额 SELECT SUM(order_amount) AS total_amount FROM order_info; -- 统计2024年1月的订单总金额 SELECT SUM(order_amount) AS jan_amount FROM order_info WHERE order_date >= '2024-01-01' AND order_date < '2024-02-01';
3. AVG() 平均值函数
AVG()用于计算指定列数值的平均值,计算时会忽略NULL值,公式为SUM(列名)/COUNT(列名),如果所有值都是NULL则返回NULL。
示例代码如下:
-- 统计用户的平均年龄 SELECT AVG(age) AS avg_age FROM user; -- 统计商品的平均价格,保留两位小数 SELECT ROUND(AVG(price), 2) AS avg_price FROM product;
4. MAX() 和 MIN() 最值函数
MAX()返回指定列的最大值,MIN()返回指定列的最小值,支持数值、字符串、日期时间类型的列,会忽略NULL值。
示例代码如下:
-- 查询最高的商品价格和最低的商品价格 SELECT MAX(price) AS max_price, MIN(price) AS min_price FROM product; -- 查询最新的订单时间和最早的订单时间 SELECT MAX(order_time) AS latest_order, MIN(order_time) AS earliest_order FROM order_info;
聚合函数的使用注意事项
1. 与GROUP BY配合使用
当使用GROUP BY对数据进行分组后,聚合函数会作用于每个分组内的数据,返回每个组对应的汇总结果。
示例代码如下:
-- 统计每个城市的用户数量 SELECT city, COUNT(*) AS user_count FROM user GROUP BY city; -- 统计每个类别的商品平均价格 SELECT category_id, AVG(price) AS avg_price FROM product GROUP BY category_id;
2. WHERE和HAVING的区别
WHERE子句用于在分组前过滤数据,不能使用聚合函数作为过滤条件;HAVING子句用于在分组后过滤数据,可以使用聚合函数作为过滤条件。
示例代码如下:
-- 先过滤出年龄大于等于18的用户,再统计每个城市的成年用户数量 SELECT city, COUNT(*) AS adult_user_count FROM user WHERE age >= 18 GROUP BY city; -- 统计用户数量超过100的城市 SELECT city, COUNT(*) AS user_count FROM user GROUP BY city HAVING COUNT(*) > 100;
3. 处理NULL值的特性
除了COUNT(*)之外,其他聚合函数都会忽略NULL值,在编写统计逻辑时需要注意这一点,避免出现统计结果不符合预期的情况。
比如某列有3行数据,值分别为10、20、NULL,那么SUM(列名)的结果是30,AVG(列名)的结果是15,而不是10。
常见使用场景总结
| 聚合函数 | 适用场景 |
|---|---|
| COUNT() | 统计行数、去重统计、判断数据是否存在 |
| SUM() | 计算总金额、总数量、累计值 |
| AVG() | 计算平均值、平均得分、平均耗时 |
| MAX()/MIN() | 查询极值、最新/最早时间、最高/最低价格 |