数学函数

Posted yuyu666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学函数相关的知识,希望对你有一定的参考价值。

SQL标准中只规定了4个数学函数,不过很多主流的数据库系统都提供了大量常用的数学函数,而且几乎所有的数据库系统都对它们提供了支持,因此这里我们有必要对这些函数进行详细的介绍。

  • 求绝对值

ABS()函数用来返回一个数值的绝对值。该函数接受一个参数,这个参数为待求绝对值的表达式。执行下面的SQL语句:


SELECT FWeight - 50,ABS(FWeight - 50) , ABS(-5.38) FROM T_Person
  • 求指数

POWER()函数是用来计算指数的函数。该函数接受两个参数,第一个参数为待求幂的表达式,第二个参数为幂。执行下面的SQL语句:


SELECT FWeight,POWER(FWeight,-0.5),POWER(FWeight,2),POWER(FWeight,3),POWER(FWeight,4) FROM T_Person
  • 求平方根

SQRT()函数是用来计算平方根的函数。该函数接受一个参数,这个参数为待计算平方根的表达式。执行下面的SQL语句:


SELECT FWeight,SQRT(FWeight) FROM T_Person
  • 求随机数

在生成随机密码、随机问题等的时候需要使用随机算法生成随机数。不同的数据库提供的生成随机数的方法不同。

在MYSQL中提供了RAND()函数用来生成随机算法,执行下面的SQL语句:


SELECT RAND()

执行完毕我们就能在输出结果中看到下面的执行结果:


0.4614449609115853

因为RAND()函数的返回值是随机的,所以这里看到的执行结果很可能与您的执行结果不同。

  • MSSQLServer

在MSSQLServer中也提供了RAND()函数用来生成随机算法,其使用方法和MYSQL中的类似。除此之外RAND()函数还支持一个参数,这个参数为随机数种子,执行下面的SQL语句:


SELECT RAND(9527)

执行完毕我们就能在输出结果中看到下面的执行结果:


0.8910896774185367

* Oracle

Oracle中没有内置的生成随机数的函数,不过Oracle 提供了包dbms_random用来生成随机数,使用方法如下:


SELECT dbms_random.value FROM dual

执行完毕我们就能在输出结果中看到下面的执行结果:


VALUE

0.14190212623840265315906642197785380122

除了上面这种使用方式,dbms_random包中还提供了其他几种方法用来完成其他的随机处理。

dbms_random.value (low, high)用来返回一个大于或等于low,小于high的随机数,执行下面的SQL语句:


SELECT dbms_random.value(60,100) FROM dual

执行完毕我们就能在输出结果中看到下面的执行结果:


DBMS_RANDOM.VALUE(60,100)

89.1205784709389820708190169252633962636

dbms_random. normal 用来返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1 与+1 之间,95%介于-2 与+2 之间,99%介于-3与+3之间。执行下面的SQL语句:


SELECT dbms_random.normal FROM dual

执行完毕我们就能在输出结果中看到下面的执行结果:


NORMAL

-0.8376085098260252406127477817042282552217

dbms_random.string(opt, len)用来返回一个随机字符串,opt为选项参数,len表示返回的字符串长度,最大值为60。参数opt 可选值如下:


"U":返回全是大写的字符串。

"L":返回全是小写的字符串。

"A":返回大小写结合的字符串。

"X":返回全是大写和数字的字符串。

"P":返回键盘上出现字符的随机组合。

可以使用dbms_random.string 来产生随机的用户密码或者验证码。执行下面的SQL 语句:


SELECT dbms_random.string("U",8) as UP,

dbms_random.string("L",5) as LP,

dbms_random.string("A",6) as AP,

dbms_random.string("X",6) as XP,

dbms_random.string("P",8) as PP FROM dual

执行完毕我们就能在输出结果中看到下面的执行结果:


UP LP AP XP PP

RXSINVJD swokb blsYor M63XKZ 4H{lUKMs
  • DB2

和Oracle一样,DB2同样没有内置的生成随机数的函数,不过DB2的SYSFUN包提供了rand函数用来生成随机数,在使用之前要确保已经被正确安装了,其使用方法非常简单,执行下面的SQL语句:


select SYSFUN.rand() from SYSIBM.SYSDUMMY1

执行完毕我们就能在输出结果中看到下面的执行结果:


1

0.1216772972808008

舍入到最大整数

在MYSQL、MSSQLServer和DB2中提供了名称为CEILING()函数,Oracle也提供了类似的函数CEIL()。这个函数用来舍掉一个数的小数点后的部分,并且向上舍入到邻近的最大的整数。比如3.33将被舍入为4、2.89 将被舍入为3、-3.61将被舍入为-3。如果感觉-3.61将被舍入为-3 而不是-4 感到奇怪,那么请记住这个函数是用来向上舍入到最大的整数,在英语中CEILING可以理解为“天花板”,舍入到“高高在上的天花板”当然也就是尽可能大的舍入了。

这个函数有一个参数,参数为待舍入的数值,执行下面的SQL语句:


MYSQL、MSSQLServer、DB2:

SELECT FName,FWeight, CEILING(FWeight), CEILING(FWeight*-1) FROM T_Person

Oracle:

SELECT FName,FWeight, CEIL(FWeight) , CEIL (FWeight*-1) FROM T_Person

舍入到最小整数

SQL中提供了FLOOR()函数,和CEILING()函数正好相反,FLOOR()函数用来舍掉一个数的小数点后的部分,并且向下舍入到邻近的最小的整数。比如3.33将被舍入为3、2.89将被舍入为2、-3.61将被舍入为-4。如果感觉-3.61将被舍入为-4而不是-3感到奇怪,那么请记住这个函数是用来向下舍入到最小的整数,在英语中FLOOR 可以理解为“地板”,舍入到“低低在下的地板”当然也就是尽可能小的舍入了。

这个函数有一个参数,参数为待舍入的数值,执行下面的SQL语句:


SELECT FName,FWeight,FLOOR(FWeight),FLOOR(FWeight*-1) FROM T_Person
  • 四舍五入

ROUND()函数也是用来进行数值四舍五入的,不过不像CEILING()函数那样总是向最大值舍入或者像FLOOR()函数那样总是向最小值舍入,ROUND()函数将数值向最近的数值舍入。在英语中ROUND可以理解为“半径”,舍入到“离我半径最近的数”当然也就是四舍五入了。

ROUND()函数有两个参数和单一参数两种用法,下面分别进行介绍。

  • 两个参数

两个参数的ROUND()函数用法为:ROUND(m,d),其中m为待进行四舍五入的数值,而d则为计算精度,也就是进行四舍五入时保留的小数位数。比如3.663 进行精度为2 的四舍五入得到3.66、-2.337 进行精度为2 的四舍五入得到-2.34、3.32122进行精度为3的四舍五入得到3.321。当d为0 的时候则表示不保留小数位进行四舍五入,比如3.663进行精度为0的四舍五入得到4、-2.337进行精度为0的四舍五入得到-2、3.32122进行精度为

0的四舍五入得到3。

特别值得一提的是,d还可以取负值,这时表示在整数部分进行四舍五入。比如36.63进行精度为-1 的四舍五入得到40、233.7 进行精度为-2 的四舍五入得到200、3321.22 进行精度为-2的四舍五入得到3300。

执行下面的SQL语句:


SELECT FName,FWeight, ROUND(FWeight,1),ROUND(FWeight*-1,0) , ROUND(FWeight,-1) FROM T_Person;
  • 单一参数

单一参数的ROUND()函数用法为:ROUND(m),其中m为待进行四舍五入的数值,它可以看做精度为0 的四舍五入运算,也就是ROUND(m,0)。比如3.663进行四舍五入得到4、-2.337进行四舍五入得到-2、3.32122进行四舍五入得到3。

执行下面的SQL语句:


SELECT FName,FWeight, ROUND(FWeight), ROUND(FWeight*-1) FROM T_Person

注意这种单一函数的用法在MSSQLServer 上以及DB2 上不被支持,必须显示的指明精度为0。

  • 求正弦值

用来计算一个数值的正弦值的函数为SIN(),它接受一个参数,这个参数为待计算正弦值的表达式。执行下面的SQL语句:


SELECT FName,FWeight,SIN(FWeight) FROM T_Person
  • 求余弦值

用来计算一个数值的余弦值的函数为COS (),它接受一个参数,这个参数为待计算余弦值的表达式。执行下面的SQL语句:


SELECT FName,FWeight, COS(FWeight) FROM T_Person
  • 求反正弦值

用来计算一个数值的反正弦值的函数为ASIN(),它接受一个参数,这个参数为待计算反正弦值的表达式。执行下面的SQL语句:


SELECT FName,FWeight, ASIN(1/FWeight) FROM T_Person
  • 求反余弦值

用来计算一个数值的反余弦值的函数为ACOS(),它接受一个参数,这个参数为待计算反余弦值的表达式。执行下面的SQL语句:


SELECT FName,FWeight, ACOS(1/FWeight) FROM T_Person
  • 求正切值

用来计算一个数值的正切值的函数为TAN(),它接受一个参数,这个参数为待计算正切值的表达式。执行下面的SQL语句:


SELECT FName,FWeight, TAN(FWeight) FROM T_Person
  • 求反正切值

用来计算一个数值的反正切值的函数为ATAN(),它接受一个参数,这个参数为待计算反正切值的表达式。执行下面的SQL语句:


SELECT FName,FWeight, ATAN(FWeight) FROM T_Person
  • 求2个变量的反正切

ATAN2函数(在MYSQLServer 中这个函数名称为ATN2)用来计算2 个变量的反正切,其使用格式为:ATAN2(X,Y),函数返回2 个变量X 和Y 的反正切。它类似于计算Y/X 的反正切,除了两个参数的符号被用来决定结果的象限。

执行下面的SQL语句:


MYSQL,Oracle,DB2:

SELECT FName,FWeight, ATAN2(FWeight,2) FROM T_Person

MSSQLServer:

SELECT FName,FWeight, ATN2(FWeight,2) FROM T_Person
  • 求余切

用来计算一个数值的反正切值的函数为COT(),它接受一个参数,这个参数为待计算余切值的表达式。在Oracle中不支持这个函数,不过根据余切是正切的倒数这一个特性,可以使用TAN()函数来变通实现。

执行下面的SQL语句:


MYSQL,MSSQLServer,DB2:

SELECT FName,FWeight, COT(FWeight) FROM T_Person

Oracle:

SELECT FName,FWeight,1/tan(FWeight) FROM T_Person
  • 求圆周率π值

圆周率π值是一个恒定值,所以在使用它的时候可以使用3.1415926……来引用它,不过手工输入π值非常容易出错,在MYSQL 和MSSQLServer 中提供了PI()函数用来取得圆周率π值,这个函数不需要使用参数,在Oracle和DB2中不支持PI()函数,不过根据-1的反余弦值等于π值的这一特性,我们可以用ACOS(-1)来变通实现。

执行下面的SQL语句:


MYSQL,MSSQLServer:

SELECT FName,FWeight,FWeight *PI() FROM T_Person

Oracle,DB2:

SELECT FName,FWeight,FWeight * acos(-1) FROM T_Person
  • 弧度制转换为角度制

用来将一个数值从弧度制转换为角度制的函数为DEGREES (),它接受一个参数,这个参数为待转换的表达式。在Oracle和DB2 中不支持这个函数,不过根据:角度制=弧度制*180/π这一个特性,可以用变通方式来实现。

执行下面的SQL语句:


MYSQL,MSSQLServer:

SELECT FName,FWeight, DEGREES(FWeight) FROM T_Person

Oracle,DB2:

SELECT FName,FWeight,(FWeight*180)/acos(-1) FROM T_Person
  • 角度制转换为弧度制

用来将一个数值从角度制转换为弧度制的函数为RADIANS (),它接受一个参数,这个参数为待转换的表达式。在Oracle和DB2 中不支持这个函数,不过根据:弧度制=角度制*π/180这一个特性,可以用变通方式来实现。

执行下面的SQL语句:


MYSQL,MSSQLServer:

SELECT FName,FWeight, RADIANS(FWeight) FROM T_Person

Oracle,DB2:

SELECT FName,FWeight,(FWeight*acos(-1)/180) FROM T_Person
  • 求符号

SIGN()函数用来返回一个数值的符号,如果数值大于0 则返回1,如果数值等于0 则返回0,如果数值小于0 则返回-1。该函数接受一个参数,这个参数为待求绝对值的表达式。执行下面的SQL语句:


SELECT FName,FWeight-48.68,SIGN(FWeight-48.68) FROM T_Person
  • 求符号

SIGN()函数用来返回一个数值的符号,如果数值大于0 则返回1,如果数值等于0 则返回0,如果数值小于0 则返回-1。该函数接受一个参数,这个参数为待求绝对值的表达式。执行下面的SQL语句:


SELECT FName,FWeight-48.68,SIGN(FWeight-48.68) FROM T_Person
  • 求整除余数

MOD()函数用来计算两个数整除后的余数。该函数接受两个参数,第一个参数为除数,而第二个参数则是被除数。在MYSQL 和Oracle 中提供了对MOD()函数的直接支持;在MSSQLServer中不支持MOD(),不过MSSQLServer中直接提供了操作符“%”用来计算两个数的整除余数;DB2中不支持求整除余数操作。

执行下面的SQL语句:


MYSQL,Oracle:

SELECT FName,FWeight,MOD(FWeight , 5) FROM T_Person

MSSQLServer:

SELECT FName,FWeight,FWeight % 5 FROM T_Person
  • 求自然对数

LOG()函数用来计算一个数的自然对数值。该函数接受一个参数,此参数为待计算自然对数的表达式,在Oracle中这个函数的名称为LN()。

执行下面的SQL语句:


MYSQL,MSSQLServer,DB2:

SELECT FName,FWeight, LOG(FWeight) FROM T_Person

Oracle:

SELECT FName,FWeight, LN(FWeight) FROM T_Person
  • 求自然对数

LOG()函数用来计算一个数的自然对数值。该函数接受一个参数,此参数为待计算自然对数的表达式,在Oracle中这个函数的名称为LN()。

执行下面的SQL语句:


MYSQL,MSSQLServer,DB2:

SELECT FName,FWeight, LOG(FWeight) FROM T_Person

Oracle:

SELECT FName,FWeight, LN(FWeight) FROM T_Person
  • 求以10为底的对数

LOG10()函数用来计算一个数的以10 为底的对数值。该函数接受一个参数,此参数为待计算对数的表达式,在Oracle中不支持这个函数,不过Oracle中有一个可以计算任意数为底的对数的函数LOG(m,n),它用来计算以m为底n的对数,我们将m设为常量10 就可以了。

执行下面的SQL语句:


MYSQL,MSSQLServer,DB2:

SELECT FName,FWeight, LOG10(FWeight) FROM T_Person

Oracle:

SELECT FName,FWeight,LOG(10,FWeight) FROM T_Person
  • 求幂

POWER(X,Y)函数用来计算X的Y次幂。

执行下面的SQL语句:


SELECT FName,FWeight, POWER(1.18,FWeight) FROM T_Person

以上是关于数学函数的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——声明函数

VSCode自定义代码片段8——声明函数

数学上相同的变量 - 一个破坏着色器而不是

谱分析中窗的选取

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销

在 Visual Studio 中创建构造函数的代码片段或快捷方式