在日常的数据库操作中,我们很少只需要查询原始数据,更多时候需要对数据进行统计、汇总分析 —— 比如统计用户总数、计算平均年龄、找出年龄最大的用户等。SQL 中的聚集函数(Aggregate Function)就是专门用来实现这类需求的工具,本文将手把手教你掌握常用聚集函数的用法。
聚集函数是对一组数据进行计算并返回单个结果的函数,它能快速实现数据的汇总统计,无需手动遍历计算。常用的聚集函数包括:
AVG() 计算平均值
COUNT() 统计总数
MAX() 计算最大值
MIN() 计算最小值
SUM() 求和
AVG() 用于计算某列的平均值,仅适用于数值型列(如年龄、金额等),会自动忽略 NULL 值。
示例 1:计算所有用户的平均年龄
> SELECT AVG(age) AS avg_age FROM `user`
avg_age|
-------+
28.3000|
1 row(s) fetched.示例 2:计算女性用户的平均年龄
> SELECT AVG(age) AS female_avg_age FROM `user` WHERE gender = '女'
female_avg_age|
--------------+
27.8000|
1 row(s) fetched.
COUNT() 用于统计记录数,有两种常用用法:
COUNT(*):统计所有行数(包括 NULL 值);
COUNT(列名):统计指定列非 NULL 的行数。
示例 1:统计用户表总人数
> SELECT COUNT(*) AS total_user FROM `user`
total_user|
----------+
10|
1 row(s) fetched.示例 2:统计有邮箱的用户数量(排除 email 为 NULL 的记录)
> SELECT COUNT(email) AS has_email_user FROM `user`
has_email_user|
--------------+
8|
1 row(s) fetched.示例 3:统计性别为男性的用户数
> SELECT COUNT(*) AS male_user FROM `user` WHERE gender = '男'
male_user|
---------+
4|
1 row(s) fetched.
MAX() 用于获取某列的最大值,支持数值型、字符型、日期型列(字符型按字符编码排序,日期型按时间先后)。
示例 1:查找用户中最大的年龄
> SELECT MAX(age) AS max_age FROM `user`
max_age|
-------+
35|
1 row(s) fetched.示例 2:查找创建时间最晚的用户(结合表中 create_time 字段)
> SELECT name, create_time FROM `user` WHERE create_time = (SELECT MAX(create_time) FROM `user`)
name|create_time |
----+-------------------+
孙七 |2025-01-27 12:17:00|
1 row(s) fetched.
MIN() 与 MAX() 相反,用于获取某列的最小值,用法完全一致。
示例 1:查找用户中最小的年龄
> SELECT MIN(age) AS min_age FROM `user`
min_age|
-------+
22|
1 row(s) fetched.示例 2:查找手机号最小的用户(字符型排序)
> SELECT name, phone FROM `user` WHERE phone = (SELECT MIN(phone) FROM `user`)
name|phone |
----+-----------+
张三 |13800138000|
1 row(s) fetched.
SUM() 用于计算某列数值的总和,仅适用于数值型列,自动忽略 NULL 值。
示例 1:计算所有男性用户的年龄总和
> SELECT SUM(age) AS male_total_age FROM `user` WHERE gender = '男'
male_total_age|
--------------+
112|
1 row(s) fetched.示例 2:计算年龄大于 30 岁的用户年龄总和
> SELECT SUM(age) AS over_30_total_age FROM `user` WHERE age > 30
over_30_total_age|
-----------------+
98|
1 row(s) fetched.
默认情况下,聚集函数会计算所有值(包括重复值);如果需要只计算唯一值,可以结合 DISTINCT 关键字。
示例 1:计算不同年龄的平均值(去重后)
-- 先看所有年龄:25、30、28、22、35、27、32、29、24、31(无重复)
-- 若有重复值(比如新增一个25岁用户),则:
> SELECT AVG(DISTINCT age) AS distinct_avg_age FROM `user`
distinct_avg_age|
----------------+
28.3000|
1 row(s) fetched.示例 2:统计不同性别的数量(去重)
> SELECT COUNT(DISTINCT gender) AS distinct_gender FROM `user`
distinct_gender|
---------------+
2|
1 row(s) fetched.
实际场景中,我们常需要一次性获取多个汇总结果,此时可以在一个 SELECT 语句中组合多个聚集函数。
示例:一次性统计用户年龄的核心指标
> SELECT
COUNT(*) AS total_user, -- 总人数
AVG(age) AS avg_age, -- 平均年龄
MAX(age) AS max_age, -- 最大年龄
MIN(age) AS min_age, -- 最小年龄
SUM(age) AS total_age, -- 年龄总和
COUNT(DISTINCT gender) AS gender_type -- 性别类型数
FROM `user`
total_user|avg_age|max_age|min_age|total_age|gender_type|
----------+-------+-------+-------+---------+-----------+
10|28.3000| 35| 22| 283| 2|
1 row(s) fetched.