在日常的数据库操作中,我们很少只需要查询原始数据,更多时候需要对数据进行统计、汇总分析 —— 比如统计用户总数、计算平均年龄、找出年龄最大的用户等。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.