SQL 的主要功能就是对数据进行处理和分析。为了提高数据处理的效率,SQL 为我们提供了许多预定义的功能模块,也就是函数(Function)。
数值函数通常接收一个或者多个数字类型的参数,并且返回一个数值结果。本文比较五种主流数据库常用数值函数的实现和差异,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。
数值函数 |
函数功能 |
MySQL |
Oracle |
SQL Server |
PostgreSQL |
SQLite |
ABS(x) |
计算x的绝对值 |
✔️ |
✔️ |
✔️ |
✔️ |
✔️ |
CEILING(x) |
返回大于或等于x的最小整数 |
✔️ |
CEIL(x) |
✔️ |
✔️ |
CEIL(x) |
FLOOR(x) |
返回小于或等于x的最大整数 |
✔️ |
✔️ |
✔️ |
✔️ |
✔️ |
MOD(x, y) |
计算x除以y的余数 |
✔️ |
✔️ |
x % y |
✔️ |
x % y |
ROUND(x, n) |
将x四舍五入到n位小数 |
✔️ |
✔️ |
✔️ |
✔️ |
✔️ |
RANDOM() |
返回一个伪随机数 |
RAND() |
DBMS_RANDOM |
RAND() |
✔️ |
✔️ |
绝对值函数
ABS(x) 函数计算输入参数的绝对值,例如:
SELECT ABS(-1), ABS(1), ABS(0)
FROM employee
WHERE emp_id = 1;
查询返回的结果如下:
ABS(-1)|ABS(1)|ABS(0)
-------|------|------
1| 1| 0
取整函数
CEIL(x) 和 CEILING(x) 函数返回大于或等于 x 的最小整数,也就是向上取整。FLOOR(x) 函数返回小于或等于 x 的最大整数,也就是向下取整。例如:
SELECT CEIL(-2), CEILING(-2), FLOOR(4.5)
FROM employee
WHERE emp_id = 1;
Oracle 不支持 CEILING(x) 函数,Microsoft SQL Server 不支持 CEIL(x) 函数。查询返回的结果如下:
CEIL(-2)|CEILING(-2)|FLOOR(4.5)
--------|-----------|----------
-2| -2| 4
ROUND(x, n) 函数将 x 四舍五入到 n 位小数,也就是执行四舍五入运算。例如:
SELECT ROUND(9.456, 1), ROUND(9.456)
FROM employee
WHERE emp_id = 1;
第二个函数调用时省略了参数 n,表示四舍五入到整数。Microsoft SQL Server 不能省略参数 n,可以将 ROUND(9.456) 替换成 ROUND(9.456, 0)。查询返回的结果如下:
ROUND(9.456, 1)|ROUND(9.456)
---------------|------------
9.5| 9
求余函数
MOD(x, y)函数计算 x 除以 y 的余数,也就是执行求模运算。例如:
-- Oracle、MySQL 以及 PostgreSQL
SELECT MOD(5,3)
FROM employee
WHERE emp_id = 1;
Oracle、MySQL 以及 PostgreSQL 实现了 MOD 函数。查询返回的结果如下:
MOD(5,3)
--------
2
Microsoft SQL Server 和 SQLite 没有提供 MOD 函数,可以使用%运算符进行求模运算:
-- Microsoft SQL Server、MySQL、PostgreSQL 以及 SQLite
SELECT 5 % 3
FROM employee
WHERE emp_id = 1;
MySQL 和 PostgreSQL 也支持这种语法。查询返回的结果和上面的示例相同。
生成伪随机数
通过计算机生成的随机数都是伪随机数,数据库都提供了生成伪随机数的函数。
MySQL 使用 RAND 函数返回一个大于或等于 0 且小于 1 的随机数。Microsoft SQL Server 也使用 RAND 函数返回随机数,但是随机数的取值范围为大于 0 且小于 1。例如:
-- MySQL 和 Microsoft SQL Server
SELECT RAND()
FROM employee
WHERE emp_id