SUM()直接计算数值列总和,自动忽略NULL值;仅当整列NULL或无匹配行时返回NULL,需用COALESCE(SUM(col),0)确保返回0。

直接用 SUM() 就能算总和,但 NULL 会被自动忽略
SUM() 是聚合函数,作用就是把一列数值加起来。它只接受数值型列(INT、DECIMAL、FLOAT 等),遇到 NULL 会跳过,不报错也不参与计算。
常见误判是以为含 NULL 的列求和会出错或返回 NULL——其实不会:SUM() 只要找到至少一个非 NULL 数值,就返回累加结果;全为 NULL 或空表时才返回 NULL。
- 写法示例:
SELECT SUM(sales_amount) FROM orders; - 如果
sales_amount有 3 行:100、NULL、200,结果是300,不是NULL - 想把
NULL当 0 处理?得显式用COALESCE(sales_amount, 0)
分组求和必须配 GROUP BY,漏写会报错
想按部门、日期、用户等维度分别算总和,就得加 GROUP BY。SQL 引擎要求:所有非聚合字段(即没包在 SUM()、COUNT() 等里的字段)都必须出现在 GROUP BY 子句中。
典型错误是写了 SUM() 又顺手选了其他字段却不加 GROUP BY,MySQL 5.7+ 和 PostgreSQL 会直接报错:ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause。
- 正确写法:
SELECT dept, SUM(salary) FROM employees GROUP BY dept; - 错误写法:
SELECT dept, name, SUM(salary) FROM employees;(name既没聚合也没分组) - MySQL 8.0+ 默认严格模式下,
ONLY_FULL_GROUP_BY开启,这个限制更硬性
SUM() 不能直接用于字符串或布尔类型,类型转换要小心
有些数据库(如 PostgreSQL)对类型检查很严:SUM() 传入 TEXT 或 BOOLEAN 列会报错,哪怕内容全是数字字符。MySQL 虽会隐式转,但容易出意外结果(比如字符串截断、科学计数法误读)。
例如 amount_text 是 VARCHAR 类型,存着 '100'、'200.5',直接 SUM(amount_text) 在 MySQL 中可能工作,但在 PostgreSQL 中必须先 CAST(amount_text AS NUMERIC)。
- 安全做法:显式转换,如
SUM(CAST(price_str AS DECIMAL(10,2))) - 布尔类型(
TRUE/FALSE)在多数数据库里不能直传给SUM();可转成整数:SUM(CASE WHEN paid THEN 1 ELSE 0 END) - 注意浮点精度:对金额类数据,优先用
DECIMAL而非FLOAT,避免SUM()累积误差
空表或无匹配行时 SUM() 返回 NULL,业务逻辑里常需处理
这是最容易被忽略的一点:当 WHERE 条件没命中任何行,或者整张表为空,SUM() 不返回 0,而是 NULL。前端或应用层若没判空,可能触发空指针或展示异常。
别依赖客户端做 NULL 判断,应在 SQL 层兜底:
- 用
COALESCE(SUM(col), 0)最常用,确保结果是数字 - PostgreSQL 支持
COALESCE,MySQL 和 SQL Server 同样支持 - 避免写成
IFNULL(SUM(col), 0)(MySQL 特有),降低跨库迁移成本
复杂点在于嵌套查询或视图里,SUM() 的 NULL 可能被多层包裹后更难察觉——只要涉及“可能无数据”的场景,就该默认加一层 COALESCE。

















