表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() |
返回π的值 |
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的反余弦,即值的余弦是X。如果X不在-1到1的范围内,或者X是NULL,则返回NULL。mysql> SELECT ACOS(1); -> 0 mysql> SELECT ACOS(1.0001); -> NULL mysql> SELECT ACOS(0); -> 1.5707963267949 -
返回
X的反正弦,即值的正弦是X。如果X不在-1到1的范围内,或者X是NULL,则返回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的反正切,即值的正切是X。如果X是NULL,则返回NULL。mysql> SELECT ATAN(2); -> 1.1071487177941 mysql> SELECT ATAN(-2); -> -1.1071487177941 -
返回两个变量
X和Y的反正切。它类似于计算的反正切,除了使用两个参数的符号来确定结果的象限。如果Y/XX或Y是NULL,则返回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被视为无符号数字。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的余弦,X以弧度表示。如果X为NULL,则返回NULL。mysql> SELECT COS(PI()); -> -1 -
返回
X的余切。如果X为NULL,则返回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从弧度转换为度。如果X为NULL,则返回NULL。mysql> SELECT DEGREES(PI()); -> 180 mysql> SELECT DEGREES(PI() / 2); -> 90 -
返回 e(自然对数的底数)提升到
X的幂。如果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 节,“字符串函数和操作符”。 -
该函数可以用于获取十进制数字或字符串的十六进制表示形式;根据参数的类型,处理方式不同。详见 第 14.8 节,“字符串函数和操作符” 中的函数描述。
-
返回
X的自然对数;即 e 的对数。如果X小于或等于 0.0E0,函数返回NULL并报告警告“无效的对数参数”。如果X为NULL,则返回NULL。mysql> SELECT LN(2); -> 0.69314718055995 mysql> SELECT LN(-2); -> NULL -
如果使用一个参数调用此函数,将返回自然对数的
X。如果X小于或等于 0.0E0,函数将返回NULL并报告警告 “无效的对数参数”。如果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); -> NULLLOG(等同于B,X)LOG(。X) / LOG(B) -
返回
的二进制对数。如果XX小于或等于 0.0E0,函数将返回NULL并报告警告 “无效的对数参数”。如果X是NULL,则返回NULL。mysql> SELECT LOG2(65536); -> 16 mysql> SELECT LOG2(-100); -> NULLLOG2()对于确定数字需要多少位存储非常有用。该函数等同于表达式LOG(。X) / LOG(2) -
返回
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,则返回NULL。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.5MOD(返回N,0)NULL。 -
返回 π(pi)的值。默认情况下,显示七位小数,但 MySQL 在内部使用完整的双精度值。
由于该函数的返回值是一个双精度值,因此其精确表示可能会因平台或实现而异。同样,这也适用于使用
PI()的任何表达式。请参阅 第 13.1.4 节,“浮点数类型(近似值)- FLOAT, DOUBLE”。mysql> SELECT PI(); -> 3.141593 mysql> SELECT PI()+0.000000000000000000; -> 3.141592653589793000 -
返回
X的Y次幂的值。如果X或Y是NULL,则返回NULL。mysql> SELECT POW(2,2); -> 4 mysql> SELECT POW(2,-2); -> 0.25 -
这是
幂运算()的同义词。 -
将参数
X从度转换为弧度。(注意 π 弧度等于 180 度)。如果X是NULL,则返回NULL。mysql> SELECT RADIANS(90); -> 1.5707963267949 -
返回一个随机浮点数
v,范围在0<=v<1.0。要获取随机整数R,范围在i<=R<j,使用表达式FLOOR(−i+ 随机数() * (j。例如,要获取随机整数在范围i))7<=R<12,使用以下语句:SELECT FLOOR(7 + (RAND() * 5));如果指定了整数参数
N,它将用作种子值:-
使用常量初始化器参数时,种子将在语句准备时初始化一次,执行之前。
-
使用非常量初始化器参数(例如列名),种子将在每次调用
随机数()时初始化。
这种行为的一个结果是,对于相同的参数值,
随机数(将返回相同的值,每次产生相同的列值序列。在以下示例中,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子句中对每行(从一个表中选择)或行组合(从多个表中选择)进行评估。因此,对于优化器来说,随机数()不是一个常量值,不能用于索引优化。有关更多信息,请参阅 第 10.2.1.20 节,“函数调用优化”。使用
随机数()值的列在ORDER BY或GROUP BY子句中可能会产生意外的结果,因为对于每行,随机数()表达式可能会被多次评估,每次返回不同的结果。如果目标是从行集中随机选择行,可以使用以下语句:SELECT * FROM tbl_name ORDER BY RAND();要从行集中随机选择样本,可以将
ORDER BY 随机数()与LIMIT结合使用:SELECT * FROM table1, table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000;随机数()并不是一个完美的随机数生成器。它是一个快速生成随机数的便捷方式,适用于不同平台的相同 MySQL 版本。该函数在基于语句的复制中是不安全的。如果将
binlog_format设置为STATEMENT,将记录警告。 -
-
将参数
X四舍五入到D小数位。舍入算法取决于X的数据类型。D如果未指定,默认为 0。D可以是负数,以使X的小数点左侧的D位变为零。D的最大绝对值为 30;超过 30(或 -30)的位将被截断。如果X或D是NULL,函数返回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()使用以下规则,取决于第一个参数的类型:以下示例显示了舍入规则的差异:
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情况下,第二个参数是常量值时。当所需的小数位数少于参数的刻度时,结果的刻度和精度将相应调整。
此外,对于
ROUND()(但不是TRUNCATE()函数),精度将增加一个位来容纳舍入增加的有效数字。如果第二个参数是负数,返回类型将调整,使其刻度为 0,具有相应的精度。例如,ROUND(99.999, 2)返回100.00—第一个参数是DECIMAL(5, 3),返回类型是DECIMAL(5, 2)。如果第二个参数是负数,返回类型将具有刻度 0 和相应的精度;
ROUND(99.999, -1)返回100,它是DECIMAL(3, 0)。
-
-
返回参数的符号作为
-1、0或1,取决于X是否为负数、零或正数。如果X是NULL,则返回NULL。mysql> SELECT SIGN(-32); -> -1 mysql> SELECT SIGN(0); -> 0 mysql> SELECT SIGN(234); -> 1 -
返回
X的正弦值,其中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的正切。如果X是NULL,则返回NULL。mysql> SELECT TAN(PI()); -> -1.2246063538224e-16 mysql> SELECT TAN(PI()+1); -> 1.5574077246549 -
返回数字
X,截断到D位小数。如果D是0,结果没有小数点或小数部分。D可以是负数,以使D位左侧的X的小数点变为零。如果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()的描述。