聚集函数的用法,说复杂也复杂,说简单其实也就那么回事。比如 COUNT、AVG 这些,其实你平时查个人数、算个平均分都会用到。像 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 值 的习惯。不然平均值看着挺正常,结果其实是错的,那就尴尬了。
如果你在做成绩系统的统计,可以多尝试下不同写法,对比结果,有时候会发现一些挺有意思的差异。