正确。SQL标准支持在SELECT中直接对字段使用+、-、*、/进行四则运算,但需注意数据类型匹配、NULL值处理(任一NULL导致结果为NULL)、除法精度截断及除零风险,并推荐用COALESCE或CAST等函数确保结果可靠。

可以直接在 SELECT 中对字段做加减乘除,但要注意数据类型、NULL 值和运算优先级,否则结果会意外为 NULL 或截断。
字段直接参与四则运算的写法
SQL 标准支持在 SELECT 列表中用 +、-、*、/ 对列(或字面量)计算,例如:price * 1.1 计算含税价,quantity - sold 算剩余库存。
- 运算符两侧可以是列名(如
unit_price)、数字(如100)、函数返回值(如COALESCE(discount, 0)) - 别名必须用
AS显式声明,否则多数数据库不识别(如price * 1.2 AS final_price) - 字符串列不能直接参与算术运算,会报错(如 MySQL 报
ERROR 1366 (HY000),PostgreSQL 报operator does not exist: text + integer)
NULL 值会让整条算术结果变 NULL
只要参与运算的任意字段为 NULL,结果就是 NULL——这不是 bug,是 SQL 的三值逻辑特性。比如 salary + bonus,只要 bonus 是 NULL,结果就不是“没加”,而是彻底消失。
- 用
COALESCE(col, 0)把空值转为 0(MySQL/PostgreSQL/SQL Server 都支持) - 用
IFNULL(col, 0)(MySQL 专用)或ISNULL(col, 0)(SQL Server 专用) - 避免写成
col + 0试图“绕过 NULL”——无效,NULL + 0还是NULL
除法要特别注意类型和精度
/ 运算最容易出隐形问题:整数相除可能被截断(如 5 / 2 在某些数据库里返回 2 而非 2.5),还可能触发除零错误。
- 显式转浮点可保精度:写成
col1 * 1.0 / col2或CAST(col1 AS DECIMAL(10,2)) / col2 - 加
WHERE col2 != 0或用NULLIF(col2, 0)避免除零(col1 / NULLIF(col2, 0)在除零时返回NULL而非报错) - PostgreSQL 中
INTEGER / INTEGER默认向下取整;MySQL 8.0+ 和 SQL Server 默认返回小数,但版本差异大,别依赖默认行为
最常被忽略的是混合类型隐式转换——比如把 TINYINT 和 DECIMAL(5,2) 相加,不同数据库推导结果类型的规则不同,可能导致精度丢失或溢出。真正在生产环境做金额类计算,建议所有参与字段先 CAST 到统一精度类型再运算。










