14.6.2 数学函数
表14.10 数学函数
Name | Description |
---|---|
ABS() |
返回绝对值 |
ACOS() |
返回弧余正切 |
ASIN() |
返回弧正切 |
ATAN() |
返回弧余正切 |
ATAN2() , ATAN() |
返回弧余正切的两个参数 |
CEIL() |
返回小于或等于参数的最小整数值 |
CEILING() |
返回小于或等于参数的最小整数值 |
CONV() |
将数字转换为不同的数字基础 |
COS() |
返回余弦值 |
COT() |
返回余切值 |
CRC32() |
计算循环冗余校验值 |
DEGREES() |
将弧度转换为角度 |
EXP() |
将到指定幂的指数 |
FLOOR() |
返回不大于参数的最大整数值 |
LN() |
返回自然对数的参数 |
LOG() |
返回自然对数的第一个参数 |
LOG10() |
返回以10为底的对数 |
LOG2() |
返回以2为底的对数 |
MOD() |
返回余数 |
PI() |
返回pi的值 |
POW() |
将参数提升到指定幂 |
POWER() |
返回指定的幂次方的参数值 |
RADIANS() |
将参数转换为弧度 |
RAND() |
返回一个随机浮点值 |
ROUND() |
对参数进行四舍五入 |
SIGN() |
返回参数的符号 |
SIN() |
返回参数的正弦值 |
SQRT() |
返回参数的平方根 |
TAN() |
返回参数的正切值 |
TRUNCATE() |
截断到指定的小数位数 |
所有数学函数在发生错误时返回NULL
。
-
返回
X
的绝对值,或者如果X
是NULL
则返回NULL
。结果类型来自于参数类型。这个结果的后果是
ABS(-9223372036854775808)
会产生错误,因为结果无法存储在有符号BIGINT
值中。mysql> SELECT ABS(2); -> 2 mysql> SELECT ABS(-32); -> 32
这个函数可以安全地与
BIGINT
值一起使用。 -
返回
X
的弧余正切值,即是 cosine 是X
的值。返回NULL
如果X
不在范围-1
到1
之间,或者如果X
是NULL
。mysql> SELECT ACOS(1); -> 0 mysql> SELECT ACOS(1.0001); -> NULL mysql> SELECT ACOS(0); -> 1.5707963267949
-
返回
X
的弧正切值,即是 sine 是X
的值。返回NULL
如果X
不在范围-1
到1
之间,或者如果X
是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' | +---------+------+-----------------------------------------+
-
返回
X
的正切值,即 tangent 的值为X
。如果X
是,则返回NULL
。
mysql> SELECT ATAN(2); -> 1.1071487177941 mysql> SELECT ATAN(-2); -> -1.1071487177941
-
返回两个变量
X
和Y
的正切值。它类似于计算,则返回NULL
。
mysql> SELECT ATAN(-2,2); -> -0.78539816339745 mysql> SELECT ATAN2(PI(),0); -> 1.5707963267949
-
返回小于或等于
X
的最小整数值。如果X
为NULL
,则返回NULL
.mysql> SELECT CEILING(1.23); -> 2 mysql> SELECT CEILING(-1.23); -> -1
对于精确值数字参数,返回值具有精确值数字类型。对于字符串或浮点数参数,返回值具有浮点数类型。
-
将数字转换为不同的数制。返回一个字符串表示形式的数字
N
,从基from_base
到基to_base
转换。如果任何参数为NULL
,则返回NULL
。参数N
被解释为整数,但可以指定为整数或字符串。最小的基是2
,最大基是36
。如果from_base
是一个负数,N
被视为有符号的数字。否则,N
被 tratted as unsigned。CONV()
使用64位精度。CONV()
如果任何参数为NULL
,则返回NULL
。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'
-
返回弧度为
X
的余弦值。返回NULL
如果X
是NULL
。mysql> SELECT COS(PI()); -> -1
-
返回
X
的余切值。返回NULL
如果X
是NULL
。mysql> SELECT COT(12); -> -1.5726734063977 mysql> SELECT COT(0); -> out-of-range error
-
计算循环冗余校验值并返回一个 32 位无符号值。结果为
NULL
如果参数是NULL
。参数预期是一个字符串,如果可能,会将其视为一个字符串处理。mysql> SELECT CRC32('MySQL'); -> 3259397556 mysql> SELECT CRC32('mysql'); -> 2501908538
-
将弧度为
X
的值转换为角度,并返回该值。返回NULL
如果X
是NULL
。mysql> SELECT DEGREES(PI()); -> 180 mysql> SELECT DEGREES(PI() / 2); -> 90
-
返回自然对数的底数e的X次幂。该函数的反函数是
LOG()
(使用单个参数)或LN()
。如果X是
NULL
,则该函数返回NULL
。mysql> SELECT EXP(2); -> 7.3890560989307 mysql> SELECT EXP(-2); -> 0.13533528323661 mysql> SELECT EXP(0); -> 1
-
返回不大于X的最大整数值。如果X是
NULL
,则返回NULL
。mysql> SELECT FLOOR(1.23), FLOOR(-1.23); -> 1, -2
对于精确值数字参数,返回值具有精确值数字类型。对于字符串或浮点参数,返回值具有浮点类型。
-
将数字X格式化为类似于
'#,###,###.##'
的格式,四舍五入到D位小数,并返回结果作为字符串。详细信息请见第14.8节,“String Functions and Operators”。 -
该函数可以将十进制数字或字符串转换为十六进制表示形式;其行为取决于参数的类型。请查看第14.8节,“String Functions and Operators”中的该函数描述,以获取详细信息。
-
LN(
X
)返回
X
的自然对数,即以e为底的对数。如果X
小于或等于0.0E0,该函数返回NULL
,并报告警告“Invalid argument for logarithm”。如果X
为NULL
,则返回NULL
。mysql> SELECT LN(2); -> 0.69314718055995 mysql> SELECT LN(-2); -> NULL
-
如果使用一个参数调用该函数,它将返回
X
的自然对数。如果X
小于或等于0.0E0,该函数将返回NULL
,并报告警告“Invalid argument for logarithm”。如果X
或B
为NULL
,则返回NULL
。该函数的逆函数(当使用单个参数时)是
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
-
返回基于2的对数值
。如果X
X
小于或等于0.0E0,该函数返回NULL
,并报告警告“对数无效参数”。如果X
为NULL
,该函数也返回NULL
。mysql> SELECT LOG2(65536); -> 16 mysql> SELECT LOG2(-100); -> NULL
LOG2()
用于确定一个数字需要多少位来存储。这一函数等同于表达式LOG(
。X
) / LOG(2) -
返回基于10的对数值
X
。如果X
小于或等于0.0E0,该函数返回NULL
,并报告警告“对数无效参数”。如果X
为NULL
,该函数也返回NULL
。mysql> SELECT LOG10(2); -> 0.30102999566398 mysql> SELECT LOG10(100); -> 2 mysql> SELECT LOG10(-100); -> NULL
-
模运算。返回N 除以 M 的余数。如果 M 或 N 是,则返回
NULL
。
mysql> SELECT MOD(234, 10); -> 4 mysql> SELECT 253 % 7; -> 1 mysql> SELECT MOD(29,9); -> 2 mysql> SELECT 29 MOD 9; -> 2
这个函数可以安全地与 值一起使用。
MOD()
也可以在具有小数部分的值上工作,并返回除法后的精确余数:mysql> SELECT MOD(34.5,3); -> 1.5
-
返回π(pi)的值。默认显示的小数位数是七,但 MySQL 使用内部的双精度值。
由于该函数的返回值是一个双精度值,因此在不同平台或实现之间可能会出现exact representation的差异。这也适用于使用
PI()
的任何表达式。请参阅第13.1.4节,“浮点类型(近似值)- FLOAT, DOUBLE”。mysql> SELECT PI(); -> 3.141593 mysql> SELECT PI()+0.000000000000000000; -> 3.141592653589793000
-
POW(
X
,Y
)返回值为
X
的Y
次幂。返回NULL
如果X
或Y
为NULL
。mysql> SELECT POW(2,2); -> 4 mysql> SELECT POW(2,-2); -> 0.25
-
POWER(
X
,Y
)这是对
POW()
的同义词。 -
RADIANS(
X
)将参数
X
从度转换为弧度。注意,π弧度等于180度。返回NULL
如果X
为NULL
。mysql> SELECT RADIANS(90); -> 1.5707963267949
-
RAND([
N
])返回一个随机的浮点值
v
,范围在0
≤v
<1.0
。要获得一个随机整数R
,范围在i
≤R
<j
,可以使用表达式:FLOOR(
i
+ RAND() * (j
-i
))。例如,要获得一个随机整数在范围
7
≤R
<12
,可以使用以下语句:SELECT FLOOR(7 + (RAND() * 5));
如果指定了整数参数
N
,它将被用作种子值。-
在使用常量初始值参数时,种子是在语句准备好之前初始化一次的。
-
在使用非常量初始值参数(例如列名)时,种子将在每次调用
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)
RAND()
在WHERE
子句中被评估为每个行(当从一个表选择时)或多个行的组合(当从多个表连接时)。因此,对于优化器目的,RAND()
不是一个常量值,并且不能用于索引优化。更多信息,请见第10.2.1.20节,“函数调用优化”。在
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
时使用这个函数,会记录警告。 -
-
将参数
X
四舍五入到D
位小数点。参数X
的数据类型决定了四舍五入算法。如果未指定D
,则默认为0。可以将D
设置为负数,以使D
位左侧的值变为0。最大绝对值为30;超过30(或-30)的数字将被截断。如果X
或D
为,函数将返回NULL
。
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(.12345678901234567890123456789012345, 35); -> 0.123456789012345678901234567890
返回值的数据类型与第一个参数相同(假设它是整数、双精度浮点数或十进制)。这意味着,对于整数参数,结果是一个整数(无小数):
mysql> SELECT ROUND(150.000,2), ROUND(150,2); +------------------+--------------+ | ROUND(150.000,2) | ROUND(150,2) | +------------------+--------------+ | 150.00 | 150 | +------------------+--------------+
ROUND()
根据第一个参数的类型使用以下规则:-
对于精确值数字,
ROUND()
使用“半往零”或“向最近”的规则:如果正数的分数部分大于或等于0.5,则将其舍入到下一个整数;如果负数的分数部分大于或等于0.5,则将其舍入到上一个整数。否则,如果正数的分数部分小于0.5,则将其舍入到下一个整数;如果负数的分数部分小于0.5,则将其舍入到上一个整数。 -
对于近似值数字,结果取决于C库。在许多系统中,这意味着
ROUND()
使用“向最近偶数”的规则:如果分数部分恰好在两个整数之间,则将其舍入到最近的偶数。
以下示例展示了精确值和近似值舍入的差异:
mysql> SELECT ROUND(2.5), ROUND(25E-1); +------------+--------------+ | ROUND(2.5) | ROUND(25E-1) | +------------+--------------+ | 3 | 2 | +------------+--------------+
更多信息,请见第14.24节,“精度数学”。
ROUND()
和TRUNCATE()
的返回数据类型由以下规则确定:-
如果第一个参数是任何整数类型,则返回类型总是
BIGINT
。 -
当第一个参数是浮点数类型或非数字类型时,返回类型总是
DOUBLE
。 -
当第一个参数是
DECIMAL
值时,返回类型也为DECIMAL
。 -
返回值的类型属性也从第一个参数中复制,除非第二个参数是一个常量值,并且是
DECIMAL
类型时。当期望的小数位数少于参数的scale时,结果的scale和精度将相应地调整。
此外,对于
ROUND()
函数(但不是TRUNCATE()
函数),精度将增加一个位以容纳增加的有效数字。如果第二个参数是负数,返回类型将调整其scale为0,并且对应的精度。例如,ROUND(99.999, 2)
返回100.00
—第一个参数是DECIMAL(5, 3)
,返回类型是DECIMAL(5, 2)
。如果第二个参数是负数,返回类型的scale为0,并且对应的精度;
ROUND(99.999, -1)
返回100
,该值是DECIMAL(3, 0)
。
-
-
返回参数的符号为
-1
、0
或1
,取决于X
是否为负、零或正。返回NULL
如果X
为NULL
。mysql> SELECT SIGN(-32); -> -1 mysql> SELECT SIGN(0); -> 0 mysql> SELECT SIGN(234); -> 1
-
返回以弧度为单位的
X
的正弦值。返回NULL
如果X
为NULL
。mysql> SELECT SIN(PI()); -> 1.2246063538224e-16 mysql> SELECT ROUND(SIN(PI())); -> 0
-
返回非负数
X
的平方根。如果X
为NULL
,函数返回NULL
。mysql> SELECT SQRT(4); -> 2 mysql> SELECT SQRT(20); -> 4.4721359549996 mysql> SELECT SQRT(-16); -> NULL
-
返回以弧度为单位的
X
的正切值。返回NULL
如果X
为NULL
。mysql> SELECT TAN(PI()); -> -1.2246063538224e-16 mysql> SELECT TAN(PI()+1); -> 1.5574077246549
-
将值
X
截断到小数点后D
位。如果D
等于0
,结果将没有小数点或分数部分。D
可以为负值,以使值X
的小数点左侧的D
位变为零。如果X
或D
等于NULL
,函数将返回NULL
。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
所有数字都向零方向进行四舍五入。
TRUNCATE()
函数的返回数据类型遵循与ROUND()
函数相同的规则;详细信息请见ROUND()
的描述。