SQL中求平均值、最大值和最小值主要用AVG()、MAX()、MIN()三个聚合函数,均忽略NULL值,可全表汇总或配合GROUP BY分组统计;AVG()计算非NULL数值的算术平均,MAX()/MIN()支持数值、日期、字符串等类型;使用时需注意WHERE不能接聚合函数、空值返回NULL、普通列需出现在GROUP BY中。

SQL 中求平均值、最大值和最小值,主要用 AVG()、MAX()、MIN() 这三个聚合函数,它们都作用于一列数值,忽略 NULL 值,且必须配合 GROUP BY(分组)或用于全表汇总(无 GROUP BY 时返回单行结果)。
AVG():算术平均值,自动跳过 NULL
AVG() 计算指定列的非 NULL 值的平均数,结果默认保留小数(取决于字段类型)。注意它不接受字符串或日期直接参与运算(除非隐式转换成功)。
- 基础写法:SELECT AVG(salary) FROM employees; —— 返回全体员工薪资均值
- 配合 WHERE 筛选:SELECT AVG(score) FROM exams WHERE subject = 'Math';
- 结果想保留两位小数?可用 ROUND:SELECT ROUND(AVG(price), 2) FROM products;
- 如果整列全是 NULL 或无记录,AVG() 返回 NULL,不是 0
MAX() 和 MIN():找极值,支持多种数据类型
MAX() 和 MIN() 不仅能用于数字,还可用于日期(如最早/最晚入职时间)、字符串(按字典序,如首字母最小/最大的姓名)。
- 查最高分和最低分:SELECT MAX(score), MIN(score) FROM scores;
- 查最新订单时间:SELECT MAX(order_date) FROM orders;
- 查字典序最小的用户名:SELECT MIN(username) FROM users;(注意:大小写敏感性依数据库而定)
- 它们也跳过 NULL;若无有效值,同样返回 NULL
组合使用 + 分组统计(GROUP BY)
真正实用的场景往往是“按部门看平均薪资、最高薪、最低薪”,这时必须加 GROUP BY。
- SELECT dept, AVG(salary), MAX(salary), MIN(salary) FROM employees GROUP BY dept;
- 可以加 HAVING 过滤分组结果,比如只看平均薪资超 8000 的部门:HAVING AVG(salary) > 8000
- ORDER BY 可对分组结果排序,例如按平均薪资降序:ORDER BY AVG(salary) DESC
常见误区提醒
- AVG/MAX/MIN 是聚合函数,不能直接和普通列混着 SELECT(除非该列在 GROUP BY 中出现)
- 别在 WHERE 中用聚合函数(会报错),要过滤分组结果请用 HAVING
- 空表或全 NULL 列不会报错,但返回 NULL —— 应用层需做空值判断
- 字符型数字(如 '123')可能被部分数据库转成数值计算,但不推荐依赖此行为,应先 CAST 或确保类型一致
基本上就这些。掌握这三个函数的语义、NULL 处理规则和与 GROUP BY / HAVING 的配合逻辑,就能覆盖大多数统计分析需求。










