在数据库的日常查询中,我们经常需要统计某列数值的平均情况,比如统计学生平均成绩、商品平均价格等,这时候SQL的AVG函数就能派上用场。它是SQL中用于计算平均值的内置聚合函数,使用起来非常简单高效。

AVG函数基础语法
AVG函数的基本语法格式如下,它会对指定列的所有非NULL值进行计算,最终返回平均值结果:
-- 基础语法,计算指定列的平均值 SELECT AVG(列名) FROM 表名;
需要注意的是,AVG函数会自动忽略列中的NULL值,不会把NULL纳入计算范围,如果列中所有值都是NULL,那么函数会返回NULL结果。
不同场景下的使用方式
1. 单表无筛选求平均值
如果我们想直接计算某张表中某列的整体平均值,不需要额外筛选条件,直接用基础语法即可。比如有一张学生成绩表score,里面包含学生ID和语文成绩chinese_score,要计算所有学生的语文平均成绩:
-- 计算所有学生的语文平均成绩 SELECT AVG(chinese_score) AS avg_chinese FROM score;
这里用AS给计算结果起了别名avg_chinese,方便后续查看结果时明确列的含义。
2. 带条件筛选求平均值
如果只需要计算符合特定条件的数据的平均值,可以搭配WHERE子句使用。比如要计算语文成绩大于80分的学生平均成绩:
-- 计算语文成绩大于80分的学生平均成绩 SELECT AVG(chinese_score) AS avg_chinese_high FROM score WHERE chinese_score > 80;
3. 分组计算平均值
当我们需要按某个维度分组计算平均值时,可以结合GROUP BY子句使用。比如score表中还有班级字段class_id,要按班级计算各班语文平均成绩:
-- 按班级分组计算语文平均成绩 SELECT class_id, AVG(chinese_score) AS class_avg_chinese FROM score GROUP BY class_id;
使用注意事项
- AVG函数只能用于数值类型的列,如果用于字符串或者日期类型的列,查询结果会报错。
- 如果想要保留小数的位数,可以结合ROUND函数使用,比如
ROUND(AVG(chinese_score), 2)可以保留两位小数。 - 如果需要把NULL值当作0参与计算,可以先用COALESCE函数把NULL转换成0,再使用AVG函数,比如
AVG(COALESCE(chinese_score, 0))。
和其他平均值计算方式的对比
除了用AVG函数,我们也可以手动用SUM函数加COUNT函数计算平均值,公式是SUM(列名)/COUNT(列名),但这种方式需要注意NULL值的处理,而AVG函数已经内置了忽略NULL的逻辑,使用起来更简便,也不容易出错。比如手动计算平均成绩的写法如下:
-- 手动计算平均成绩,注意这里COUNT会统计非NULL的行数,和AVG逻辑一致 SELECT SUM(chinese_score)/COUNT(chinese_score) AS manual_avg FROM score;
不过如果列中存在NULL值,手动计算的方式如果没做处理,很容易和AVG函数的结果出现偏差,所以优先推荐使用AVG函数来计算平均值。