SQL 不只是用来处理文本和表格。在真实的数据库里,经常要和价格、数量、分数、百分比、坐标打交道,也就是数字。想象一下:
- 你要算折扣,想把金额四舍五入到整数。
- 你想筛选出学号为偶数/奇数的学生。
- 你在做分数分析,想知道方差的平方根。
- 或者你在写分数计算公式,需要用到幂运算。
SQL 完全能搞定这些,不用外部编程语言——直接在查询里用内置的数学函数就行。今天我们聊聊最常用的六个:
ROUND()— 四舍五入CEIL()— 向上取整FLOOR()— 向下取整MOD()— 取余POWER()— 幂运算SQRT()— 平方根
* 数字的四舍五入:ROUND()、CEIL()、FLOOR()*
经常在处理小数(比如 4.67891)时,需要四舍五入。比如你在算平均分、订单总价、折扣百分比等等,多余的小数位不仅“难看”,还可能让人误解。
ROUND() — 按数学规则四舍五入
ROUND(number [, digits])
number— 要四舍五入的数字。digits(可选)— 保留几位小数。
例子:
SELECT ROUND(4.67); -- 5
SELECT ROUND(4.6789, 2); -- 4.68
ROUND() 跟你平时数学里的四舍五入一样:4.5 → 5,4.49 → 4。
很适合处理金额或分数,想让显示好看点:4.33333 → 4.33。
CEIL() — 向上取整到最近的整数
SELECT CEIL(4.1); -- 5
- 如果本来就是整数,结果不变。
- 总是返回不小于原数的整数。
比如你要算商品分页数:21个商品,每页10个→需要3页。
FLOOR() — 向下取整
SELECT FLOOR(4.9); -- 4
- 返回不大于原数的整数。
用来判断“楼层”或“台阶”,看值落在哪一级。
对比:
| 值 | ROUND() | CEIL() | FLOOR() |
|---|---|---|---|
| 4.4 | 4 | 5 | 4 |
| 4.6 | 5 | 5 | 4 |
| -4.6 | -5 | -4 | -5 |
* 取余:MOD()*
取余有什么用?比如:
- 判断一个数是不是偶数。
- 按模式把行分组(比如分成3个队)。
- 实现循环(比如“每隔五条记录”)。
语法:
MOD(dividend, divisor)
例子:
SELECT MOD(17, 5); -- 2 (3*5 +2)
SELECT MOD(10, 3); -- 1 (3*3 +1)
注意:余数的符号取决于第一个参数(dividend)的符号。
用法:
SELECT student_id,
CASE WHEN MOD(student_id, 2) = 0 THEN '偶数' ELSE '奇数' END AS parity
FROM students;
* 幂运算:POWER()*
有时候不只是乘法,还要用数学公式:
- 算利息:
base * POWER(1 + rate, years) - 圆面积:
π * r^2 - 机器学习里的公式权重
语法:
POWER(base, exponent)
例子:
SELECT POWER(2, 3); -- 8
SELECT POWER(5, 2); -- 25
SELECT POWER(9, 0.5); -- 3 (平方根)
这个函数啥都能算:整数、小数、负数都行。
平方根:SQRT()
要算平方根,尤其是做统计(比如标准差),SQRT() 很有用。
SELECT SQRT(25); -- 5
SELECT SQRT(2); -- ~1.4142
如果传进去负数,会报错。如果有可能遇到负数,用 ABS():
SELECT SQRT(ABS(-25)); -- 5
实用场景
场景1:订单总价四舍五入
SELECT order_id, ROUND(total_price, 0) AS total_rounded
FROM orders;
场景2:算分页数
SELECT CEIL(COUNT(*) / 10.0) AS pages_needed
FROM products;
场景3:把学生分成3组
SELECT student_id,
MOD(student_id, 3) AS group_number
FROM students;
场景4:均方根
SELECT SQRT(AVG(POWER(score, 2))) AS root_mean_square
FROM grades;
常见错误和建议
ROUND() 可以传第二个参数——要保留到小数点后几位别忘了。
MOD() 处理负数时可能会有意外结果。
POWER() 和 SQRT() 支持小数参数——需要的话用 CAST()。
确保 SQRT() 里别传负数,不然会报错。
GO TO FULL VERSION