mysql算术运算符为+、-、*、/、%,需注意字段类型匹配与null传播特性;where中避免对字段运算以防索引失效,聚合函数自动忽略null但中间计算需手动处理。

MySQL 字段直接加减乘除怎么写
算术运算符在 MySQL 里就是 +、-、*、/、%,用法和大多数语言一致,但必须注意字段类型和 NULL 的行为。
常见错误是写 SELECT price + '10' FROM goods; —— 字符串字面量会触发隐式转换,可能出错或结果异常;正确做法是确保两边都是数值类型。
-
SELECT id, price * 1.1 AS price_with_tax FROM products;(给价格加 10% 税) - 如果
price是NULL,整个表达式结果也是NULL,不是 0 —— 这点常被忽略 - 整数除法
5 / 2返回2.5(MySQL 默认返回 DECIMAL 或 DOUBLE),想取整用DIV:5 DIV 2→2 -
%是取模,不是百分号;10 % 3返回1,不是10%
WHERE 条件里用算术运算要注意什么
在 WHERE 中对字段做运算,容易导致索引失效。比如 WHERE price * 1.1 > 100,MySQL 无法直接用 price 上的索引。
更安全的做法是把运算移到等号右边:WHERE price > 100 / 1.1,这样能走索引。
- 避免
WHERE year(created_at) = 2024,改用WHERE created_at >= '2024-01-01' AND created_at - 如果必须运算,且字段有索引,优先考虑函数索引(MySQL 8.0+):
CREATE INDEX idx_price_tax ON products ((price * 1.1)); -
WHERE id + 0 = 123这类无意义运算,纯属干扰优化器,别写
UPDATE 时字段自增/自减怎么写才安全
直接写 UPDATE users SET balance = balance + 100 WHERE id = 123; 是标准且安全的,MySQL 会原子性执行。
但要注意并发场景下是否需要更高一致性 —— 比如余额变动,单纯靠这个语句不能防止超扣。
- 不要用
SELECT ... FOR UPDATE加锁再UPDATE,除非业务明确要求事务隔离级别高于默认的 REPEATABLE READ - 避免在一条语句里多次引用同一字段并做不同运算,例如
SET a = a + 1, b = a + 2—— 第二个a是更新前的旧值,不是刚算出的新值 - 如果字段是
DECIMAL,注意精度丢失:DECIMAL(10,2)做/运算可能截断,建议显式用ROUND(col / 100, 2)
NULL 参与算术运算的结果总是 NULL
这是最容易踩的坑:任何数和 NULL 做 +、-、*、/、%,结果全是 NULL,不是报错,也不是跳过。
比如 SELECT SUM(price * tax_rate) FROM orders;,只要有一行 tax_rate 是 NULL,整列乘积为 NULL,SUM() 会忽略这些 NULL,但如果你没意识到,会误以为数据丢了。
- 用
IFNULL(price, 0)或COALESCE(price, 0)显式兜底 -
WHERE price * 0.1 > 10会自动过滤掉所有price为NULL的行 —— 因为NULL > 10结果是UNKNOWN,不满足条件 - 聚合函数如
SUM()、AVG()本身会跳过NULL,但中间计算过程不会自动处理,得自己控制
事情说清了就结束










