4. 聚合函数

聚合函数对"一组值"算出一个结果,常和分组一起用:

SUM():计算某列数值的总和。
语法:SUM(column_name)
说明:SUM 函数忽略 NULL 值,只对列中的非 NULL 数值进行求和。

AVG():计算某列数值的平均值。
语法:AVG(column_name)
说明:同样忽略 NULL 值,只对非 NULL 的数值计算平均值。

COUNT():统计某列的行数或满足特定条件的行数。
语法:
COUNT(*):统计结果集的总行数,包括 NULL 值。
COUNT(column_name):统计指定列中非 NULL 值的行数。

MAX():返回某列中的最大值。
语法:MAX(column_name)
说明:对于数值、日期和字符串类型的列都适用。在字符串比较时,按照字符编码顺序确定最大值。

MIN():返回某列中的最小值。
语法:MIN(column_name)
说明:与 MAX() 类似,适用于多种数据类型,字符串比较时按字符编码顺序确定最小值。

GROUP_CONCAT():将分组后的某列值连接成一个字符串。
语法:GROUP_CONCAT([DISTINCT] column_name [ORDER BY sort_expression] [SEPARATOR separator])
示例:假设存在一个 orders 表,包含 order_id 和 product_name 列。要按 order_id 分组,将每个订单中的产品名称连接成一个字符串:
SELECT order_id, GROUP_CONCAT(product_name SEPARATOR ', ') AS products
FROM orders
GROUP BY order_id;
说明:
DISTINCT 可选,用于去除重复值。
ORDER BY 可选,用于指定连接值的排序方式。
SEPARATOR 可选,用于指定连接字符串的分隔符,默认为逗号 ,。

这些聚合函数通常与 GROUP BY 子句一起使用,以便对数据进行分组统计。如果不使用 GROUP BY,聚合函数会将整个结果集视为一组进行计算。

sql
SELECT COUNT(*) FROM student;              -- 总人数
SELECT AVG(sage) FROM student;           -- 平均年龄
SELECT MAX(sage), MIN(sage) FROM student; -- 最大/最小年龄
SELECT SUM(sage) FROM student
WHERE sbirthplace LIKE '北京%';            -- 北京学生年龄之和
💡 COUNT(*) 数行,COUNT(列) 数该列非 NULL 的行。统计"男生数"可写 COUNT(1) WHERE ssex='男'。

📝 本节例题

以下例题均基于 教学实例 库(student / course / sc / teacher / grades / dept / emp),开始前先执行 USE 教学实例;。建议先自己写一遍,再展开答案对照。

案例 1
统计学生的总人数
统计男(女)生的总数
查看参考答案(可复制)
sql
select count(*) from student; -- 统计的是总记录数
select count(sbirthplace) from student; -- 统计的是idcard字段不为null的记录数
select count(1) from student where ssex='男'; -- 对于count聚合函数,统计符合条件的总记录数,还可以通过 count(数字/字符串)的形式进行统计查询
select count(1) '总人数' from student; -- 给函数结果加个别称
案例 2
统计所有学生的平均年龄
统计所有女生的平均年龄
查看参考答案(可复制)
sql
select avg(sage) from student;
案例 3
统计学生的最大年龄
查看参考答案(可复制)
sql
select max(sage) from student;
案例 4
统计学生的最小年龄
查看参考答案(可复制)
sql
select min(sage) from student;
案例 5
统计北京的学生的年龄之和
查看参考答案(可复制)
sql
select sum(sage) from student where sbirthplace like '北京%';