ITPub博客

首页 > 数据库 > > 12.6 数值函数和操作符

12.6 数值函数和操作符

作者:飘絮絮絮丶 时间:2020-05-12 10:28:45 0 删除 编辑

参考官方文档:

dev.mysql.com/doc/refma



12.6.1 参数操作符


通常的算术运算符可用。 结果根据以下规则确定:

  • 在 - ,+和*的情况下,如果两个操作数都是整数,则结果以BIGINT(64位)精度计算。
  • 如果两个操作数都是整数,并且其中任何一个都是无符号的,则结果是一个无符号整数。 对于减法,如果启用了NO_UNSIGNED_SUBTRACTION SQL模式,即使任何操作数是无符号的,结果也会被有符号。
  • 如果+, - ,/,*,%中的任何一个操作数是实数或字符串值,则结果的精度是具有最大精度的操作数的精度。
  • 在用/执行除法时,使用两个精确值操作数时的结果比例是第一个操作数的scale 加上div_precision_increment系统变量的值(默认为4)。 例如,表达式5.05 / 0.014的结果的小数位数为六位小数(360.714286)。

这些规则适用于每个操作,因此嵌套计算意味着每个组件的精度。 因此,(14620/9432456)/(24250/9432456)首先解析为(0.0014)/(0.0026),最终结果为小数点后8位(0.60288653)。


由于这些规则及其应用方式,应注意确保计算的组件和子组件使用适当的精度级别。


算术运算符适用于数字。 对于其他类型的值,可能会有替代操作。 例如,要添加日期值,请使用DATE_ADD();

  • +,-,*,/ -- 一般算术操作符
  • DIV

整数划分。 从除法结果中舍弃小数点右侧的小数部分。


如果任一操作数具有非整数类型,则在将结果转换为BIGINT之前,操作数将转换为DECIMAL并使用DECIMAL算术进行分割。 如果结果超出BIGINT范围,则会发生错误。


mysql> SELECT 5 DIV 2, -5 DIV 2, 5 DIV -2, -5 DIV -2;

-> 2, -2, -2, 2

  • N % M, N MOD M

模数操作。 返回N除以M的余数。


12.6.2 数学函数


所有数学函数在发生错误时返回NULL。

  • ABS(X)

返回X的绝对值。

mysql> SELECT ABS(2);

-> 2

mysql> SELECT ABS(-32);

-> 32


该功能可以安全地用于BIGINT值。

  • ACOS(X)

返回X的反余弦值,即余弦值为X的值。如果X不在-1到1的范围内,则返回NULL。


mysql> SELECT ACOS(1);

-> 0

mysql> SELECT ACOS(1.0001);

-> NULL

mysql> SELECT ACOS(0);

-> 1.5707963267949

  • ASIN(X)

返回X的反正弦值,即正弦为X的值。如果X不在-1到1的范围内,则返回NULL。

mysql> SELECT ASIN(0.2);

-> 0.20135792079033

mysql> SELECT ASIN('foo');

+-------------+

| ASIN('foo') |

+-------------+

| 0 |

+-------------+

1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;

+---------+------+-----------------------------------------+

| Level | Code | Message |

+---------+------+-----------------------------------------+

| Warning | 1292 | Truncated incorrect DOUBLE value: 'foo' |

+---------+------+-----------------------------------------+

  • ATAN(X)

返回X的反正切值,即正切值为X的值。

mysql> SELECT ATAN(2);

-> 1.1071487177941

mysql> SELECT ATAN(-2);

-> -1.1071487177941

  • ATAN(Y,X), ATAN2(Y,X)

返回两个变量X和Y的反正切值。它类似于计算Y/X的反正切值。


mysql> SELECT ATAN(-2,2);

-> -0.78539816339745

mysql> SELECT ATAN2(PI(),0);

-> 1.5707963267949

  • CEIL(X)

CEIL()是CEILING()的同义词。

  • CEILING(X)

返回不小于X的最小整数值。

mysql> SELECT CEILING(1.23);

-> 2

mysql> SELECT CEILING(-1.23);

-> -1


对于精确值数字参数,返回值具有精确值数字类型。 对于字符串或浮点参数,返回值具有浮点类型。

  • CONV(N,from_base,to_base)

在不同的数字基础之间转换数字。 返回数字N的字符串表示形式,从基本from_base转换为基本to_base。 如果任何参数为NULL,则返回NULL。 参数N被解释为整数,但可以被指定为整数或字符串。 最小基数为2,最大基数为36.如果from_base为负数,则N被视为有符号数。 否则,N被视为无符号的。 CONV() 以64位精度工作。


mysql> SELECT CONV('a',16,2);

-> '1010'

mysql> SELECT CONV('6E',18,8);

-> '172'

mysql> SELECT CONV(-17,10,-18);

-> '-H'

mysql> SELECT CONV(10+'10'+'10'+X'0a',10,10);

-> '40'


--进制转换



  • COS(X)

返回X的余弦,其中X以弧度给出。

mysql> SELECT COS(PI());

-> -1


  • COT(X)

返回X的余切值。

mysql> SELECT COT(12);

-> -1.5726734063977

mysql> SELECT COT(0);

-> out-of-range error


  • CRC32(expr)

计算循环冗余校验值并返回一个32位无符号值。 如果参数为NULL,则结果为NULL。 该参数预计是一个字符串,并且(如果可能的话)被视为一个。


mysql> SELECT CRC32('MySQL'); -> 3259397556

mysql> SELECT CRC32('mysql'); -> 2501908538



  • DEGREES(X)

返回参数X,从弧度转换为度数。


mysql> SELECT DEGREES(PI());

-> 180

mysql> SELECT DEGREES(PI() / 2);

-> 90



  • EXP(X)

返回引起X的幂的e(自然对数的底数)的值。此函数的反函数是LOG()(仅使用单个参数)或LN()。


mysql> SELECT EXP(2);

-> 7.3890560989307

mysql> SELECT EXP(-2);

-> 0.13533528323661

mysql> SELECT EXP(0);

-> 1



  • FLOOR(X)

返回不大于X的最大整数值。


mysql> SELECT FLOOR(1.23), FLOOR(-1.23);

-> 1, -2


对于精确值数字参数,返回值具有精确值数字类型。 对于字符串或浮点参数,返回值具有浮点类型。


  • FORMAT(X,D)

将数字X格式化为像'#,###,###。##'这样的格式,四舍五入为D小数位,并将结果作为字符串返回。 有关细节,请参见第12.5节“字符串函数”。



  • HEX(N_or_S)

该函数可用于获取十进制数或字符串的十六进制表示形式; 它的表现方式因论证的类型而异。 有关详细信息,请参见第12.5节“字符串函数”中的该函数的描述。


  • LN(X)


返回X的自然对数; 即X的基数e对数。如果X小于或等于0.0E0,则该函数返回NULL,并且(从MySQL 5.7.4起)会出现“ Invalid argument for logarithm”警告。


mysql> SELECT LN(2);

-> 0.69314718055995

mysql> SELECT LN(-2);

-> NULL



该函数与LOG(X)同义。 这个函数的反函数是EXP()函数。

  • LOG(X), LOG(B,X)


如果使用一个参数调用,则此函数返回X的自然对数。如果X小于或等于0.0E0,则函数将返回NULL,并且(从MySQL 5.7.4开始)会出现“ Invalid argument for logarithm”警告。


这个函数的反函数(当用一个参数调用时)是EXP()函数。


mysql> SELECT LOG(2);

-> 0.69314718055995

mysql> SELECT LOG(-2);

-> NULL



如果用两个参数调用,则此函数将X的对数返回给基数B.如果X小于或等于0,或者B小于或等于1,则返回NULL。

mysql> SELECT LOG(2,65536);

-> 16

mysql> SELECT LOG(10,100);

-> 2

mysql> SELECT LOG(1,100);

-> NULL


LOG(B,X)等同于LOG(X)/ LOG(B)。

  • LOG2(X)

返回X的基数为2的对数。如果X小于或等于0.0E0,则函数返回NULL,并且(从MySQL 5.7.4开始)会报告“Invalid argument for logarithm”警告。


mysql> SELECT LOG2(65536);

-> 16

mysql> SELECT LOG2(-100);

-> NULL


LOG2()对于查明数字要存储多少位有用。 这个函数等价于表达式LOG(X)/ LOG(2)。


  • LOG10(X)


返回X的基数为10的对数。如果X小于或等于0.0E0,则函数返回NULL,并且(从MySQL 5.7.4开始)会报告“ Invalid argument for logarithm”警告。


mysql> SELECT LOG10(2);

-> 0.30102999566398

mysql> SELECT LOG10(100);

-> 2

mysql> SELECT LOG10(-100);

-> NULL


LOG10(X)相当于LOG(10,X)。

  • MOD(N,M), N % M, N MOD M

模数操作。 返回N除以M的余数

mysql> SELECT MOD(234, 10);

-> 4

mysql> SELECT 253 % 7;

-> 1

mysql> SELECT MOD(29,9);

-> 2

mysql> SELECT 29 MOD 9;

-> 2


该功能可以安全地用于BIGINT值。


MOD()也适用于具有小数部分的值,并返回除法后的精确余数:


mysql> SELECT MOD(34.5,3);

-> 1.5


MOD(N,0)返回NULL。


  • PI()

返回π(pi)的值。 显示的默认小数位数是7,但MySQL在内部使用完整的双精度值。


mysql> SELECT PI();

-> 3.141593

mysql> SELECT PI()+0.000000000000000000;

-> 3.141592653589793116

  • POW(X,Y)

返回X的值增加到Y的幂。

mysql> SELECT POW(2,2);

-> 4

mysql> SELECT POW(2,-2);

-> 0.25

  • POWER(X,Y)

这是POW()的同义词。

  • RADIANS(X)

返回从度数转换为弧度的参数X. (注意π弧度等于180度。)

mysql> SELECT RADIANS(90);

-> 1.5707963267949

  • RAND([N])

返回0 <= v <1.0范围内的随机浮点值v。 要获得范围为i <= R <j的随机整数R,请使用表达式FLOOR(i + RAND()*(j-i))。 例如,要获取7 <= R <12范围内的随机整数,请使用以下语句:


SELECT FLOOR(7 + (RAND() * 5));


如果指定了整数参数N,则将其用作seed值:

  • 在初始化参数不变的情况下,当语句准备好时,种子会在执行前初始化一次。
  • 使用非常量初始化参数(如列名称),seed将使用每次调用RAND()的值进行初始化。


这种行为的一个含义是,对于相等的参数值,RAND(N)每次都返回相同的值,从而产生可重复的列值序列。 在以下示例中,由RAND(3)生成的值序列与它发生的两个位置相同。


mysql> CREATE TABLE t (i INT);

Query OK, 0 rows affected (0.42 sec)

mysql> INSERT INTO t VALUES(1),(2),(3);

Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0

mysql> SELECT i, RAND() FROM t;

+------+------------------+

| i | RAND() |

+------+------------------+

| 1 | 0.61914388706828 |

| 2 | 0.93845168309142 |

| 3 | 0.83482678498591 |

+------+------------------+

3 rows in set (0.00 sec)

mysql> SELECT i, RAND(3) FROM t;

+------+------------------+

| i | RAND(3) |

+------+------------------+

| 1 | 0.90576975597606 |

| 2 | 0.37307905813035 |

| 3 | 0.14808605345719 |

+------+------------------+

3 rows in set (0.00 sec)

mysql> SELECT i, RAND() FROM t;

+------+------------------+

| i | RAND() |

+------+------------------+

| 1 | 0.35877890638893 |

| 2 | 0.28941420772058 |

| 3 | 0.37073435016976 |

+------+------------------+

3 rows in set (0.00 sec)

mysql> SELECT i, RAND(3) FROM t;

+------+------------------+

| i | RAND(3) |

+------+------------------+

| 1 | 0.90576975597606 |

| 2 | 0.37307905813035 |

| 3 | 0.14808605345719 |

+------+------------------+

3 rows in set (0.01 sec)



对于每一行(从一个表中选择时)或行的组合(在从多表连接中进行选择时),都会对WHERE子句中的RAND()进行评估。 因此,出于优化程序的目的,RAND()不是一个常数值,不能用于索引优化。 有关更多信息,请参见第8.2.1.17节“函数调用优化”。



在ORDER BY或GROUP BY子句中使用带有RAND()值的列可能会产生意外的结果,因为对于任一子句,RAND()表达式可以针对同一行进行多次评估,每次都返回不同的结果。 如果目标是以随机顺序检索行,则可以使用如下所示的语句:

SELECT * FROM tbl_name ORDER BY RAND();



要从一组行中选择一个随机样本,请将ORDER BY RAND()与LIMIT结合使用:



SELECT * FROM table1, table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000;


RAND() 并不意味着是一个完美的随机生成器。 这是一种快速生成随需数据的方式,可以在相同MySQL版本的平台之间移植。



这个函数对于基于语句的复制是不安全的。 如果在binlog_format设置为STATEMENT时使用此函数,则会记录一条警告。 (BUG#49222)


  • ROUND(X), ROUND(X,D)


将参数X舍入到D小数位。 舍入算法取决于X的数据类型。如果未指定,则D默认为0。 D可能是负数,导致值X的小数点左边的D数字变为零。


mysql> SELECT ROUND(-1.23);

-> -1

mysql> SELECT ROUND(-1.58);

-> -2

mysql> SELECT ROUND(1.58);

-> 2

mysql> SELECT ROUND(1.298, 1);

-> 1.3

mysql> SELECT ROUND(1.298, 0);

-> 1

mysql> SELECT ROUND(23.298, -1);

-> 20



返回值与第一个参数具有相同的类型(假设它是整数,双精度或十进制)。 这意味着对于整数参数,结果是一个整数(无小数位):


mysql> SELECT ROUND(150.000,2), ROUND(150,2);

+------------------+--------------+

| ROUND(150.000,2) | ROUND(150,2)

| +------------------+--------------+

| 150.00 | 150 |

+------------------+--------------+


根据第一个参数的类型,ROUND()使用以下规则:

  • 对于精确值数字,ROUND()使用近似规则:小数部分为.5或更大的值在正数时向上取整 ,如果为负数时向下取整数 (换句话说,它是从零开始舍去的。)如果小数部分小于.5,则数值向下取整,如果是负数,则向上取整。
  • 对于近似值数字,结果取决于C库。 在许多系统上,这意味着ROUND()使用“round to nearest even”规则:将任何小数部分的值四舍五入到最接近的偶数整数。


以下示例显示了精确值和近似值的舍入方式不同:

mysql> SELECT ROUND(2.5), ROUND(25E-1);

+------------+--------------+

| ROUND(2.5) | ROUND(25E-1) |

+------------+--------------+

| 3 | 2 |

+------------+--------------+


  • SIGN(X)


根据X是负数,零还是正数,将参数的符号返回为-1,0或1。

mysql> SELECT SIGN(-32);

-> -1

mysql> SELECT SIGN(0);

-> 0

mysql> SELECT SIGN(234);

-> 1

  • SIN(X)


返回X的正弦值,其中X以弧度给出。

mysql> SELECT SIN(PI());

-> 1.2246063538224e-16

mysql> SELECT ROUND(SIN(PI()));

-> 0


  • SQRT(X)


返回非负数X的平方根。

mysql> SELECT SQRT(4);

-> 2

mysql> SELECT SQRT(20);

-> 4.4721359549996

mysql> SELECT SQRT(-16);

-> NULL


  • TAN(X)


返回X的正切值,其中X以弧度给出。


mysql> SELECT TAN(PI());

-> -1.2246063538224e-16

mysql> SELECT TAN(PI()+1);

-> 1.5574077246549


  • TRUNCATE(X,D)


返回数字X,截断到D小数位。 如果D为0,结果没有小数点或小数部分。 D可能是负数,导致值X的小数点左边的D数字变为零

mysql> SELECT TRUNCATE(1.223,1);

-> 1.2

mysql> SELECT TRUNCATE(1.999,1);

-> 1.9

mysql> SELECT TRUNCATE(1.999,0);

-> 1

mysql> SELECT TRUNCATE(-1.999,1);

-> -1.9

mysql> SELECT TRUNCATE(122,-2);

-> 100

mysql> SELECT TRUNCATE(10.28*100,0);

-> 1028

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3162391/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: HyperSQL 使用手册
请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42295