SQL编程思想:基于5种主流数据库代码实现
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人


3.1.2 数值函数

数值函数通常接收一个或者多个数字类型的参数,并且返回一个数值结果。表3.1列出了常见的SQL数值函数及它们在5种主流数据库中的实现。

表3.1 常见的SQL数值函数与实现

注意:SQLite 3.35.0开始支持内置的数值函数,不再需要单独编译extension-functions.c文件,使用方法请参考官方文档。

下面我们通过一些示例来说明这些函数的作用和注意事项。

1.绝对值函数

ABS(x)函数计算输入参数的绝对值,例如:

我们借助employee演示各种函数的作用,读者也可以使用第1章中介绍的快速查询语句。查询返回的结果如下:

2.取整函数

CEIL(x)和CEILING(x)函数返回大于或等于x的最小整数,也就是向上取整。FLOOR(x)函数返回小于或等于x的最大整数,也就是向下取整,例如:

Oracle不支持CEILING(x)函数,Microsoft SQL Server不支持CEIL(x)函数。查询返回的结果如下:

ROUND(x,n)函数将x四舍五入到n位小数,也就是执行四舍五入运算,例如:

第二个函数调用时省略了参数n,表示四舍五入到整数。Microsoft SQL Server不能省略参数n,可以将ROUND(9.456)替换成ROUND(9.456,0)。查询返回的结果如下:

3.求余函数

MOD(x,y)函数计算x除以y的余数,也就是执行求模运算,例如:

Oracle、MySQL以及PostgreSQL实现了MOD函数。查询返回的结果如下:

Microsoft SQL Server和SQLite没有提供MOD函数,可以使用%运算符进行求模运算:

MySQL和PostgreSQL也支持这种语法。查询返回的结果和上面的示例相同。

4.生成伪随机数

通过计算机生成的随机数都是伪随机数,数据库都提供了生成伪随机数的函数。

MySQL使用RAND函数返回一个大于或等于0且小于1的随机数。Microsoft SQL Server也使用RAND函数返回随机数,但是随机数的取值范围为大于0且小于1,例如:

对于MySQL而言,在一个查询语句中的多次RAND函数调用都会返回不同的随机数。查询返回的结果如下:

对于Microsoft SQL Server而言,在一个查询语句中的多次RAND函数调用返回相同的随机数。查询返回的结果如下:

一般来说,如果你运行上面的示例将会得到不同的随机数。不过,我们也可以为RAND函数指定一个随机数种子,重现相同的随机数,例如:

其中,函数中的参数1是随机数种子。多次执行以上查询将会返回相同的结果。

Oracle提供了一个系统程序包DBMS_RANDOM,其中的VALUE函数可以用于返回大于或等于0且小于1的随机数,例如:

查询返回的结果如下:

对于Oracle,每次调用RAND函数,都会返回不同的随机数。

提示:Oracle系统程序包DBMS_RANDOM中还提供了其他生成随机数和随机字符串的函数,以及设置随机数种子的方法,可以查看官方文档。

PostgreSQL提供了RANDOM函数,可以返回一个大于或等于0且小于1的随机数,例如:

查询返回的结果如下:

对于PostgreSQL,每次调用RANDOM函数都会返回不同的随机数。如果想要重现相同的随机数,可以使用SETSEED函数。例如,重复执行以下两个语句,可以得到相同的随机数:

SQLite也提供了RANDOM函数,可以返回一个大于或等于-263且小于或等于263-1的随机整数,例如:

查询返回的结果如下:

对于SQLite,每次调用RANDOM函数都会返回不同的随机数。SQLite不支持随机数种子设置,无法重现相同的随机数。

提示:除我们上面介绍的函数外,SQL还提供其他的数值函数,例如乘方和开方函数、对数函数以及三角函数,有需要时可以查看数据库相关的文档。