聚集函数的用法,说复杂也复杂,说简单其实也就那么回事。比如 COUNTAVG 这些,其实你平时查个人数、算个平均分都会用到。像 select count(*) from student 就是最常见的例子,用来统计总人数,挺直观的。

但有个坑,容易忽略:AVG、SUM 这些聚集函数是不管空值的,所以你要算平均成绩的时候,默认是跳过那些 grade 是空的记录。比如:

select avg(grade) from sc where cno = '1'

这时候,只有有成绩的学生才参与计算,空的不算。那如果你想把没成绩的也算进去,比如算成 0 分咋办?可以这样写:

select sum(grade)/count(*) from sc where cno='1'

这样就都计入了,嗯,包含了空值,前提是你得提前把空值成 0,比如用 IFNULL(grade, 0)

那是不是就这第二种写法更合理?也不是。说到底,怎么算,得看业务场景。你要的是“真实有效成绩的平均”还是“全体报名学生的平均”,这取决于你要展示什么信息。

如果你想深入挖挖,可以看看这几个还挺有用的链接:

如果你是刚开始写查询语句的,记得要养成判断是否有 NULL 值 的习惯。不然平均值看着挺正常,结果其实是错的,那就尴尬了。

如果你在做成绩系统的统计,可以多尝试下不同写法,对比结果,有时候会发现一些挺有意思的差异。