MySQL 里直接用 +
、-
、*
、/
就能算数
MySQL 支持标准的四则运算符,不需要额外函数。只要字段或值是数字类型(比如
INT、
DECIMAL、
FLOAT),就可以在
SELECT、
WHERE、
ORDER BY甚至
UPDATE中直接参与计算。
常见错误现象:
SELECT price + '10'—— 字符串
'10'会被隐式转成数字,但若内容含非数字字符(如
'10元'),结果变成
0或警告;更稳妥的是显式转换:
CAST('10' AS DECIMAL)。
除法 /返回
DECIMAL或
DOUBLE,不是整数;想取整用
DIV(如
7 DIV 2 → 3)
NULL参与任何算术运算,结果都是
NULL;需要先用
IFNULL()或
COALESCE()处理 小数精度问题:
DECIMAL(10,2)字段做乘除后可能超位数,MySQL 会四舍五入,不是截断
遇到负数、取模、幂运算怎么办
MySQL 提供了基础数学函数覆盖这些场景,不用自己拼逻辑。
使用场景:计算折扣后价格(含负号)、分页余数判断、指数增长模拟等。
取负用-前缀即可:
SELECT -amount;别写成
NEG(amount)(已废弃) 取模用
%或
MOD()函数,二者等价;
5 % 2 → 1,注意负数模运算结果符号跟随被除数(
-5 % 2 → -1) 幂运算用
POW(x, y)或
POWER(x, y);
POW(2, 3) → 8;不支持
**语法(那是 PostgreSQL/Python 的)
聚合计算中怎么加减乘除
算术运算可以嵌套在
SUM()、
AVG()、
COUNT()等聚合函数内部,也可以作用于聚合结果之后。
关键区别:
SUM(price * quantity):先逐行算金额,再求和(正确)
SUM(price) * SUM(quantity):分别求和再相乘(业务上通常错误)
AVG(price / 100)和
AVG(price) / 100数学结果相同,但前者每行都除,后者只除一次;有精度差异时表现不同
性能影响:带运算的聚合列无法走索引覆盖(除非建函数索引,MySQL 8.0.13+ 支持
CREATE INDEX idx ON t ((price * quantity)))。
WHERE 条件里做数学比较容易踩什么坑
最常出问题的地方不是语法,而是数据类型隐式转换和浮点误差。
错误示例:
WHERE price * 0.9 > 100看似没问题,但如果
price是
DECIMAL(10,2),乘法后可能变成
DECIMAL(12,3),而比较时 MySQL 可能临时转成
DOUBLE引入浮点误差。 浮点字段(
FLOAT/
DOUBLE)慎用于精确比较,比如
WHERE score = 99.5可能查不到——改用范围:
ABS(score - 99.5)字符串字段参与计算前务必确认内容纯数字,否则静默转成
0;可用
price REGEXP '^[0-9.]+$'过滤 日期也能“算”:
order_date + INTERVAL 7 DAY是合法表达式,但别对
DATETIME直接加数字(
order_date + 1是错的)
真正麻烦的不是语法会不会写,而是哪一步悄悄丢了精度、哪一列其实藏了空格或单位字符、哪个隐式转换正在拖慢查询。动手前先
SELECT price, LENGTH(price), DUMP(price)看一眼实际值。
