Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

  • ABS(X)

    返回 X 的绝对值,或者如果 XNULL 则返回 NULL

    结果类型来自于参数类型。这个结果的后果是ABS(-9223372036854775808) 会产生错误,因为结果无法存储在有符号 BIGINT 值中。

    mysql> SELECT ABS(2);
            -> 2
    mysql> SELECT ABS(-32);
            -> 32

    这个函数可以安全地与BIGINT 值一起使用。

  • ACOS(X)

    返回 X 的弧余正切值,即是 cosine 是 X 的值。返回 NULL 如果 X 不在范围 -11 之间,或者如果 XNULL

    mysql> SELECT ACOS(1);
            -> 0
    mysql> SELECT ACOS(1.0001);
            -> NULL
    mysql> SELECT ACOS(0);
            -> 1.5707963267949
  • ASIN(X)

    返回 X 的弧正切值,即是 sine 是 X 的值。返回 NULL 如果 X 不在范围 -11 之间,或者如果 XNULL

    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的正切值,即 tangent 的值为X。如果X,则返回NULL

    mysql> SELECT ATAN(2);
            -> 1.1071487177941
    mysql> SELECT ATAN(-2);
            -> -1.1071487177941
  • ATAN(Y,X)ATAN2(Y,X)

    返回两个变量XY的正切值。它类似于计算,则返回NULL

    mysql> SELECT ATAN(-2,2);
            -> -0.78539816339745
    mysql> SELECT ATAN2(PI(),0);
            -> 1.5707963267949
  • CEIL(X)

    CEIL()CEILING()的同义词。

  • CEILING(X)

    返回小于或等于X的最小整数值。如果XNULL,则返回NULL.

    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被 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'
  • COS(X)

    返回弧度为X的余弦值。返回NULL如果XNULL

    mysql> SELECT COS(PI());
            -> -1
  • COT(X)

    返回X的余切值。返回NULL如果XNULL

    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的值转换为角度,并返回该值。返回NULL如果XNULL

    mysql> SELECT DEGREES(PI());
            -> 180
    mysql> SELECT DEGREES(PI() / 2);
            -> 90
  • EXP(X)

    返回自然对数的底数eX次幂。该函数的反函数是LOG()(使用单个参数)或LN()

    如果XNULL,则该函数返回NULL

    mysql> SELECT EXP(2);
            -> 7.3890560989307
    mysql> SELECT EXP(-2);
            -> 0.13533528323661
    mysql> SELECT EXP(0);
            -> 1
  • FLOOR(X)

    返回不大于X的最大整数值。如果XNULL,则返回NULL

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

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

  • FORMAT(X,D)

    将数字X格式化为类似于'#,###,###.##'的格式,四舍五入到D位小数,并返回结果作为字符串。详细信息请见第14.8节,“String Functions and Operators”

  • HEX(N_or_S)

    该函数可以将十进制数字或字符串转换为十六进制表示形式;其行为取决于参数的类型。请查看第14.8节,“String Functions and Operators”中的该函数描述,以获取详细信息。

  • LN(X)

    返回X的自然对数,即以e为底的对数。如果X小于或等于0.0E0,该函数返回NULL,并报告警告Invalid argument for logarithm。如果XNULL,则返回NULL

    mysql> SELECT LN(2);
            -> 0.69314718055995
    mysql> SELECT LN(-2);
            -> NULL

    该函数与LOG(X)相同。该函数的逆函数是EXP()函数。

  • LOG(X)LOG(B,X)

    如果使用一个参数调用该函数,它将返回X的自然对数。如果X小于或等于0.0E0,该函数将返回NULL,并报告警告Invalid argument for logarithm。如果XBNULL,则返回NULL

    该函数的逆函数(当使用单个参数时)是EXP()函数。

    mysql> SELECT LOG(2);
            -> 0.69314718055995
    mysql> SELECT LOG(-2);
            -> NULL

    如果使用两个参数调用该函数,它将返回XB的对数。如果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)

    返回基于2的对数值X。如果X小于或等于0.0E0,该函数返回NULL,并报告警告对数无效参数。如果XNULL,该函数也返回NULL

    mysql> SELECT LOG2(65536);
            -> 16
    mysql> SELECT LOG2(-100);
            -> NULL

    LOG2()用于确定一个数字需要多少位来存储。这一函数等同于表达式LOG(X) / LOG(2)

  • LOG10(X)

    返回基于10的对数值X。如果X小于或等于0.0E0,该函数返回NULL,并报告警告对数无效参数。如果XNULL,该函数也返回NULL

    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 的余数。如果 MN,则返回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()

    返回π(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)

    返回值为XY次幂。返回NULL如果XYNULL

    mysql> SELECT POW(2,2);
            -> 4
    mysql> SELECT POW(2,-2);
            -> 0.25
  • POWER(X,Y)

    这是对POW()的同义词。

  • RADIANS(X)

    将参数X从度转换为弧度。注意,π弧度等于180度。返回NULL如果XNULL

    mysql> SELECT RADIANS(90);
            -> 1.5707963267949
  • RAND([N])

    返回一个随机的浮点值 v,范围在 0v < 1.0。要获得一个随机整数 R,范围在 iR < j,可以使用表达式:FLOOR(i + RAND() * (j - i))。例如,要获得一个随机整数在范围 7R < 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 BYGROUP 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 时使用这个函数,会记录警告。

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

    将参数X四舍五入到D位小数点。参数X的数据类型决定了四舍五入算法。如果未指定D,则默认为0。可以将D设置为负数,以使D位左侧的值变为0。最大绝对值为30;超过30(或-30)的数字将被截断。如果XD,函数将返回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)

  • SIGN(X)

    返回参数的符号为-101,取决于X是否为负、零或正。返回NULL如果XNULL

    mysql> SELECT SIGN(-32);
            -> -1
    mysql> SELECT SIGN(0);
            -> 0
    mysql> SELECT SIGN(234);
            -> 1
  • SIN(X)

    返回以弧度为单位的X的正弦值。返回NULL如果XNULL

    mysql> SELECT SIN(PI());
            -> 1.2246063538224e-16
    mysql> SELECT ROUND(SIN(PI()));
            -> 0
  • SQRT(X)

    返回非负数X的平方根。如果XNULL,函数返回NULL

    mysql> SELECT SQRT(4);
            -> 2
    mysql> SELECT SQRT(20);
            -> 4.4721359549996
    mysql> SELECT SQRT(-16);
            -> NULL
  • TAN(X)

    返回以弧度为单位的X的正切值。返回NULL如果XNULL

    mysql> SELECT TAN(PI());
            -> -1.2246063538224e-16
    mysql> SELECT TAN(PI()+1);
            -> 1.5574077246549
  • TRUNCATE(X,D)

    将值 X 截断到小数点后 D 位。如果 D 等于 0,结果将没有小数点或分数部分。D 可以为负值,以使值 X 的小数点左侧的 D 位变为零。如果 XD 等于 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() 的描述。