count(*)统计所有行(含null行),count(列名)仅统计该列非null行;avg/sum遇全null返回null,需coalesce处理;group by要求select非聚合列必须出现在group by或被聚合函数包裹。

Java 中操作 MySQL 聚合函数,核心是把标准 SQL 写对,再用 JDBC 正确执行和取值。重点不在 Java 侧“怎么写函数”,而在于 SQL 逻辑是否清晰、NULL 处理是否得当、分组规则是否合规。
COUNT 统计行数:注意 * 和列名的区别
COUNT(*) 统计全部行(含字段为 NULL 的记录),COUNT(列名) 只统计该列非 NULL 的行。误用会导致结果偏少。
- 查用户总注册数:用 COUNT(*),比如
SELECT COUNT(*) FROM users - 查填了手机号的用户数:用 COUNT(phone),因为 NULL 手机号不计入
- JDBC 中获取结果:
rs.getLong(1)或rs.getInt(1)(推荐 long 防溢出)
SUM 和 AVG 计算数值:结果可能为 NULL,必须处理
SUM 和 AVG 对全 NULL 列或空结果集返回 NULL,不是 0。Java 端直接调用 getDouble() 或 getBigDecimal() 会得到 null,容易触发 NPE。
Java Linux版下载入口,提供 Oracle JDK 26.0.2 官方 Linux 安装包、Java 环境配置、JDBC 数据库连接和 Java 服务端开发相关信息。
- 安全写法:SQL 中用 COALESCE(SUM(amount), 0) 或 IFNULL(AVG(score), 0) 显式转默认值
- Java 中建议用
rs.getBigDecimal("total", BigDecimal.ZERO)(JDBC 8.0+ 支持默认值),或手动判空 - 注意语义:AVG 自动跳过 NULL,但不会跳过 0——若“未评分”存为 0,均值会被拉低
GROUP BY 分组统计:SELECT 列必须合法
MySQL 5.7+ 默认严格模式下,SELECT 中出现未聚合、也未出现在 GROUP BY 中的列,会直接报错。
- 错误写法:
SELECT user_id, name, COUNT(*) FROM orders GROUP BY user_id(name 既没分组也没聚合) - 正确做法二选一:把 name 加进 GROUP BY(如
GROUP BY user_id, name),或 用聚合包裹(如MAX(name)) - 分组后筛选用 HAVING,不是 WHERE;例如
HAVING SUM(amount) > 1000
避免常见陷阱:嵌套和性能
聚合函数不能互相嵌套,比如 COUNT(SUM(x)) 是语法错误。同时,COUNT(列名) 比 COUNT(*) 更慢,尤其在 InnoDB 表中。
- 想统计“每个部门平均工资超 5000 的人数”,不能写
COUNT(AVG(salary)),应先子查询过滤,再外层 COUNT(*) - 性能优先:统计总数尽量用
COUNT(*),而不是COUNT(id)或COUNT(1)(三者在新版 MySQL 差异极小,但语义最清晰的是*) - 大数据量时,考虑加覆盖索引(如
INDEX(dept_id, salary))加速GROUP BY dept_id, AVG(salary)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










