前言
在 MySQL 数据库开发中,数值处理是极为常见的操作场景之一,其重要性与字符串处理并列。无论是进行数据统计(如求和、平均值)、执行数学运算(如取整、幂运算),还是实现业务逻辑(例如薪资计算、随机数生成),都离不开各类数字函数的支持。
熟练掌握常用的数字函数,不仅可以避免手动编写复杂的计算逻辑,还能有效简化 SQL 语句,提升开发效率和数据计算的准确性。本文系统梳理了 21 个高频使用的 MySQL 数字函数,并按照四大应用场景分类:基础运算、取整与四舍五入、统计分析、进阶数学运算。每个函数均提供清晰的功能说明及实战示例(涵盖单值计算与表级统计),便于开发者快速理解与直接应用,建议收藏以备查阅。
一、基础运算函数(绝对值、整除、余数等)
1. ABS(x):获取数值的绝对值
该函数用于返回指定数值的绝对值。对于负数,结果为正;正数和零保持不变。常用于处理可能包含负值的数据,如温度变化、财务盈亏金额等场景。
x
SELECT ABS(-10) AS '绝对值'; -- 结果:10
SELECT ABS(0) AS '绝对值'; -- 结果:0
SELECT ABS(10) AS '绝对值'; -- 结果:10
-- 业务场景:计算商品库存差异的绝对值(避免负数展示)
SELECT product_id, ABS(actual_stock - theory_stock) AS 库存差异 FROM product;
3. MOD(x, y):求两数相除后的余数
返回 x 除以 y 的余数,也可使用 x % y 表达相同含义。此函数广泛应用于判断奇偶性、周期性分组、轮询分配等逻辑控制中。
y
x%y
SELECT MOD(20,3); -- 结果:2(20÷3=6余2)
SELECT 15 MOD 4; -- 结果:3(等价于MOD(15,4))
SELECT MOD(7,2); -- 结果:1(判断奇数)
-- 业务场景:筛选偶数ID的商品
SELECT product_id, product_name FROM product WHERE MOD(product_id, 2) = 0;
2. n DIV m:执行整数除法(仅取商)
DIV 是整除操作符,返回被除数 n 除以除数 m 后的商部分,小数部分直接舍去,仅保留整数结果。注意:除数不能为 0,否则会报错。
DIV
n
m
SELECT 10 DIV 2; -- 结果:5(10÷2=5,无余数)
SELECT 20 DIV 3; -- 结果:6(20÷3=6.666,取整数商6)
SELECT 15 DIV 4; -- 结果:3(15÷4=3.75,取整数商3)
-- 业务场景:计算每个部门的平均分组人数(假设10人一组)
SELECT dept_id, COUNT(*) DIV 10 AS 完整分组数 FROM emp GROUP BY dept_id;
二、取整与四舍五入函数(精确控制数值精度)
4. CEIL(x) / CEILING(x):向上取整
两个函数功能完全一致,均返回大于或等于给定数值 x 的最小整数。无论小数部分是否超过 0.5,都会向正无穷方向进位。
x
SELECT CEIL(2.0); -- 结果:2
SELECT CEIL(2.1); -- 结果:3
SELECT CEIL(2.9); -- 结果:3
SELECT CEILING(1.01);-- 结果:2
SELECT CEILING(5.99);-- 结果:6
-- 业务场景:计算订单分页总页数(每页10条,不足1页按1页算)
SELECT CEIL(COUNT(*) / 10) AS 总页数 FROM order_main WHERE create_time BETWEEN '2024-01-01' AND '2024-01-31';
5. FLOOR(x):向下取整
返回小于或等于 x 的最大整数,即直接截断小数部分,不进行任何进位操作,相当于“向下舍入”。
x
SELECT FLOOR(5.0); -- 结果:5
SELECT FLOOR(5.1); -- 结果:5
SELECT FLOOR(5.9); -- 结果:5
SELECT FLOOR(3.999); -- 结果:3
-- 业务场景:计算商品折扣后价格(向下取整,不四舍五入)
SELECT product_id, FLOOR(price * 0.8) AS 折扣后价格 FROM product;
6. ROUND(x [,y]):标准四舍五入
将数值 x 按照指定的小数位数 y 进行四舍五入:
- 若省略
y,默认保留 0 位小数(结果为整数); - 当
y > 0时,保留对应位数的小数; - 当
y < 0时,对整数部分进行四舍五入(例如y = -1表示精确到十位)。
x
y
y>0
y<0
y=-1
-- 保留整数(默认)
SELECT ROUND(8.0); -- 结果:8
SELECT ROUND(8.5); -- 结果:9
SELECT ROUND(8.4); -- 结果:8
-- 保留指定小数位
SELECT ROUND(8.923,2); -- 结果:8.92
SELECT ROUND(8.925,2); -- 结果:8.93
-- 对整数部分四舍五入(保留到十位)
SELECT ROUND(123.45, -1); -- 结果:120
-- 业务场景:计算商品均价(保留2位小数)
SELECT category_id, ROUND(AVG(price), 2) AS 分类均价 FROM product GROUP BY category_id;
7. TRUNCATE(x, y):数值截断(非四舍五入)
将数值 x 截断至小数点后 y 位,与 ROUND 不同的是,TRUNCATE 不进行四舍五入,而是直接丢弃多余位数,确保结果不会因进位而改变。
x
y
ROUND
SELECT TRUNCATE(6.523,2); -- 结果:6.52
SELECT TRUNCATE(6.529,2); -- 结果:6.52(未四舍五入)
SELECT TRUNCATE(9.999,1); -- 结果:9.9
SELECT TRUNCATE(123.456,0); -- 结果:123(截断所有小数)
-- 业务场景:计算税费(保留2位小数,直接截断多余部分)
SELECT order_id, TRUNCATE(pay_amount * 0.06, 2) AS 税费 FROM order_main;
三、统计分析函数(求和、均值、极值等)
8. AVG(expression):计算字段平均值
返回指定表达式或字段的算术平均值,自动忽略 NULL 值。适用于统计评分、价格、薪资水平等连续型数值的中心趋势。
expression
NULL
-- 统计员工平均薪资
SELECT AVG(sal) AS '员工平均薪资' FROM emp; -- 结果:29025.00÷14≈2073.21
-- 业务场景:统计各部门员工平均薪资
SELECT dept_id, AVG(sal) AS 部门平均薪资 FROM emp GROUP BY dept_id;
-- 业务场景:统计商品分类平均价格(忽略价格为NULL的商品)
SELECT category_id, AVG(price) AS 分类平均价格 FROM product GROUP BY category_id;
10. MAX(expression):获取最大值
返回字段中的最大数值,NULL 值会被自动排除。常用于查找最高工资、最高销售记录等场景。
expression
NULL
-- 查询员工最高工资
SELECT MAX(sal) AS '最高工资' FROM emp;
-- 业务场景:查询各分类商品的最高价格
SELECT category_id, MAX(price) AS 分类最高价格 FROM product GROUP BY category_id;
-- 业务场景:查询2024年最大的单笔订单金额
SELECT MAX(pay_amount) AS 最大单笔订单金额 FROM order_main WHERE YEAR(create_time)=2024;
11. MIN(expression):获取最小值
返回字段中的最小数值,同样忽略 NULL 值。典型用途包括查询最低价格、最低工资等信息。
expression
NULL
-- 查询员工最低工资
SELECT MIN(sal) AS '最低工资' FROM emp;
-- 业务场景:查询各部门的最低薪资
SELECT dept_id, MIN(sal) AS 部门最低薪资 FROM emp GROUP BY dept_id;
-- 业务场景:查询库存最低的10个商品
SELECT product_id, product_name, stock FROM product ORDER BY MIN(stock) LIMIT 10;
12. SUM(expression):计算总和
对指定字段的所有非 NULL 数值求和,广泛应用于总销售额、总薪资支出等汇总统计任务。
expression
NULL
-- 统计员工薪水发放总数
SELECT SUM(sal) AS '发放的薪水总数' FROM emp; -- 结果:29025.00
-- 业务场景:统计各部门薪资总和
SELECT dept_id, SUM(sal) AS 部门薪资总额 FROM emp GROUP BY dept_id;
-- 业务场景:统计2024年1月的总销售额
SELECT SUM(pay_amount) AS 1月总销售额 FROM order_main WHERE create_time BETWEEN '2024-01-01' AND '2024-01-31';
9. COUNT(expression):统计记录数量
根据不同的参数形式,COUNT 可实现多种计数方式:
COUNT(*):统计所有行数,包含含有 NULL 的记录;COUNT(expression):仅统计该字段非 NULL 的记录数;COUNT(DISTINCT expression):统计该字段非 NULL 且去重后的唯一值数量。
COUNT(*)
NULL
COUNT(字段名)
NULL
COUNT(DISTINCT 字段名)
-- 统计发薪水的人数(sal字段非NULL)
SELECT COUNT(sal) AS '发薪水的人数' FROM emp; -- 结果:14
-- 统计有佣金的人数(comm字段非NULL)
SELECT COUNT(comm) AS '有佣金的人数' FROM emp; -- 结果:4
-- 统计员工总数(包括所有记录)
SELECT COUNT(*) AS '员工总数' FROM emp; -- 结果:14
-- 统计不重复的部门数
SELECT COUNT(DISTINCT dept_id) AS 不重复部门数 FROM emp;
-- 业务场景:统计2024年1月的有效订单数(order_status=1表示有效)
SELECT COUNT(*) AS 1月有效订单数 FROM order_main WHERE create_time BETWEEN '2024-01-01' AND '2024-01-31' AND order_status=1;
13. GREATEST(expr1, expr2, ...)
从多个表达式或常量中返回最大值,支持字段组合或直接传参。与 MAX 函数的区别在于:MAX 作用于某一列的聚合,而 GREATEST 用于多值之间的横向比较。
MAX
GREATEST
-- 取固定值列表的最大值
SELECT GREATEST(10,30,-15,90,55) AS '最大值'; -- 结果:90
-- 取字段组合的最大值(查询员工薪资和佣金中的较大值)
SELECT emp_id, ename, GREATEST(sal, IFNULL(comm,0)) AS 薪资最大值 FROM emp;
-- 业务场景:计算商品原价、促销价、会员价中的最高定价
SELECT product_id, GREATEST(original_price, promotion_price, member_price) AS 最高定价 FROM product;
14. LEAST(expr1, expr2, ...)
返回多个输入值中的最小值,适用场景与 GREATEST 相反。同样可用于字段间或常量间的最小值判定,区别于 MIN 聚合函数的作用范围。
MIN
LEAST
-- 取固定值列表的最小值
SELECT LEAST(10,30,-15,90,55) AS '最小值'; -- 结果:-15
-- 取字段组合的最小值(查询员工薪资和佣金中的较小值)
SELECT emp_id, ename, LEAST(sal, IFNULL(comm,9999)) AS 薪资最小值 FROM emp;
-- 业务场景:计算商品三个渠道价格中的最低定价
SELECT product_id, LEAST(original_price, promotion_price, member_price) AS 最低定价 FROM product;
四、进阶运算函数(幂、指数、平方根、随机数等)
15. EXP(x):计算 e 的 x 次方
返回自然对数底数 e(约等于 2.71828)的 x 次幂,常用于指数增长模型、复利计算、概率分布等数学建模场景。
e
x
SELECT EXP(0); -- 结果:1(e^0=1)
SELECT EXP(1); -- 结果:2.718281828459045(e^1=e)
SELECT EXP(3); -- 结果:20.085536923187668(e^3≈20.09)
16. POW(x, y) / POWER(x, y):计算 x 的 y 次方
两者功能完全相同,用于返回 x 的 y 次幂,是进行幂运算的核心函数,适用于科学计算、几何面积/体积推导等复杂公式处理。
x
y五、核心注意事项(避免常见问题)
NULL 值处理:在使用统计类函数(如、AVG、COUNT等)时,系统会自动跳过SUM值。若业务逻辑需要将NULL视为 0 参与计算,应配合NULL进行转换,例如使用IFNULL(字段名, 0)实现默认值填充。AVG(IFNULL(comm, 0))
数据类型兼容性:数值函数仅适用于数值型字段(如、INT、DECIMAL等)。当应用于字符串类型时,MySQL 会尝试隐式类型转换;若转换失败,则返回FLOAT。NULL
精度控制问题:使用或FLOAT类型进行计算时,可能存在浮点精度丢失的情况。在涉及金额、薪资等对精度要求较高的场景中,推荐使用DOUBLE数据类型,并结合DECIMAL函数设定所需的小数位数,以确保计算准确性。ROUND
性能优化建议:的执行效率高于COUNT(*),因其无需判断字段是否为COUNT(字段名);而NULL在处理大表时性能较差,建议通过其他抽样策略替代,提升查询效率。ORDER BY RAND()
进阶数学函数详解
17. SQRT(x):计算平方根
该函数用于返回非负数的平方根。当输入值为负数时,结果返回x。常用于几何运算、距离计算等数学相关场景。NULL
实战案例:
SELECT SQRT(25); -- 结果:5(5^2=25)
SELECT SQRT(2); -- 结果:1.4142135623730951(√2≈1.414)
SELECT SQRT(0); -- 结果:0
SELECT SQRT(-4); -- 结果:NULL(负数无实数平方根)
-- 业务场景:计算正方形商品的对角线长度(边长×√2)
SELECT product_id, side_length * SQRT(2) AS 对角线长度 FROM product WHERE shape='正方形';
18. PI():获取圆周率
返回圆周率的近似值,约为 3.141593。广泛应用于与圆形相关的计算,如面积、周长等几何问题。π
实战案例:
SELECT PI(); -- 结果:3.141592653589793
-- 业务场景:计算圆形商品的面积(π×半径?)
SELECT product_id, PI() * POW(radius, 2) AS 圆形面积 FROM product WHERE shape='圆形';
19. RAND():生成随机浮点数
生成一个介于 0(包含)到 1(不包含)之间的随机浮点数。适用于生成随机验证码、实现数据随机排序、抽样查询等业务需求。
实战案例:
-- 生成单个随机数
SELECT RAND(); -- 结果:0.xxxxxx(每次执行结果不同)
-- 生成1-100的随机整数
SELECT FLOOR(RAND() * 100) + 1 AS 1到100随机数;
-- 业务场景:随机抽取5个商品作为推荐
SELECT product_id, product_name FROM product ORDER BY RAND() LIMIT 5;
-- 业务场景:生成6位随机验证码(000000-999999)
SELECT LPAD(FLOOR(RAND() * 1000000), 6, '0') AS 6位随机验证码;
幂运算函数说明
某函数以指定数值为底数,作为指数,用于执行幂运算操作,例如求平方、立方等常见数学计算。y
SELECT POW(2,3); -- 结果:8(2^3=8)
SELECT POW(2,10); -- 结果:1024(2^10=1024)
SELECT POWER(3,2); -- 结果:9(3^2=9)
SELECT POWER(10,3);-- 结果:1000(10^3=1000)
-- 业务场景:计算商品体积(边长的立方,假设为正方体)
SELECT product_id, POW(side_length, 3) AS 商品体积 FROM product WHERE shape='正方体';
总结
本文系统梳理了 MySQL 中数值处理的四大核心应用场景:基础算术运算、取整与四舍五入、统计分析函数以及高级数学运算,共涵盖 21 个常用函数,并为每个函数提供可直接运行的实战示例,覆盖薪资统计、价格计算、数据抽样等典型开发需求。
在实际应用中,可根据具体业务灵活组合使用这些函数,例如利用生成随机验证码,或通过RAND()+LPAD()计算圆形区域面积。同时,务必注意PI()+POW()值的处理及浮点精度问题,合理选择数据类型和函数搭配,保障计算结果的正确性与系统性能。NULL


雷达卡


京公网安备 11010802022788号







