Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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() 返回π的值
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 的反余弦,即值的余弦是 X。如果 X 不在 -11 的范围内,或者 XNULL,则返回 NULL

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

    返回 X 的反正弦,即值的正弦是 X。如果 X 不在 -11 的范围内,或者 XNULL,则返回 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。如果 XNULL,则返回 NULL

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

    返回两个变量 XY 的反正切。它类似于计算 Y / X 的反正切,除了使用两个参数的符号来确定结果的象限。如果 XYNULL,则返回 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 被视为无符号数字。 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 的余弦,X 以弧度表示。如果 XNULL,则返回 NULL

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

    返回 X 的余切。如果 XNULL,则返回 NULL

    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 从弧度转换为度。如果 XNULL,则返回 NULL

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

    返回 e(自然对数的底数)提升到 X 的幂。如果 XNULL,则返回 NULL

    该函数的逆函数是 LOG()(使用单个参数)或 LN()

    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 节,“字符串函数和操作符”

  • HEX(N_or_S)

    该函数可以用于获取十进制数字或字符串的十六进制表示形式;根据参数的类型,处理方式不同。详见 第 14.8 节,“字符串函数和操作符” 中的函数描述。

  • LN(X)

    返回 X 的自然对数;即 e 的对数。如果 X 小于或等于 0.0E0,函数返回 NULL 并报告警告“无效的对数参数”。如果 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 并报告警告 无效的对数参数。如果 XBNULL,则返回 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

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

  • LOG2(X)

    返回 X 的二进制对数。如果 X 小于或等于 0.0E0,函数将返回 NULL 并报告警告 无效的对数参数。如果 XNULL,则返回 NULL

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

    LOG2() 对于确定数字需要多少位存储非常有用。该函数等同于表达式 LOG(X) / LOG(2)

  • LOG10(X)

    返回 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 的余数。如果 MNNULL,则返回 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.5

    MOD(N,0) 返回 NULL

  • PI()

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

    由于该函数的返回值是一个双精度值,因此其精确表示可能会因平台或实现而异。同样,这也适用于使用 PI() 的任何表达式。请参阅 第 13.1.4 节,“浮点数类型(近似值)- FLOAT, DOUBLE”

    mysql> SELECT PI();
            -> 3.141593
    mysql> SELECT PI()+0.000000000000000000;
            -> 3.141592653589793000
  • 幂运算(X,Y)

    返回 XY 次幂的值。如果 XYNULL,则返回 NULL

    mysql> SELECT POW(2,2);
            -> 4
    mysql> SELECT POW(2,-2);
            -> 0.25
  • 幂运算(X,Y)

    这是 幂运算() 的同义词。

  • 弧度(X)

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

    mysql> SELECT RADIANS(90);
            -> 1.5707963267949
  • 随机数([N])

    返回一个随机浮点数 v,范围在 0 <= v < 1.0。要获取随机整数 R,范围在 i <= R < j,使用表达式 FLOOR(i + 随机数() * (ji))。例如,要获取随机整数在范围 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 BYGROUP 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), 四舍五入(X,D)

    将参数 X 四舍五入到 D 小数位。舍入算法取决于 X 的数据类型。D 如果未指定,默认为 0。D 可以是负数,以使 X 的小数点左侧的 D 位变为零。 D 的最大绝对值为 30;超过 30(或 -30)的位将被截断。如果 XDNULL,函数返回 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() 使用“舍入远离零”或“舍入到最近”规则:具有小数部分的值 .5 或更高将被舍入到下一个整数,如果是正数,或者向下舍入到下一个整数,如果是负数。(换言之,它是远离零舍入的)。具有小数部分小于 .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 情况下,第二个参数是常量值时。

      当所需的小数位数少于参数的刻度时,结果的刻度和精度将相应调整。

      此外,对于 ROUND()(但不是 TRUNCATE() 函数),精度将增加一个位来容纳舍入增加的有效数字。如果第二个参数是负数,返回类型将调整,使其刻度为 0,具有相应的精度。例如,ROUND(99.999, 2) 返回 100.00—第一个参数是 DECIMAL(5, 3),返回类型是 DECIMAL(5, 2)

      如果第二个参数是负数,返回类型将具有刻度 0 和相应的精度;ROUND(99.999, -1) 返回 100,它是 DECIMAL(3, 0)

  • SIGN(X)

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

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

    返回 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 的正切。如果 XNULL,则返回 NULL

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

    返回数字 X,截断到 D 位小数。如果 D0,结果没有小数点或小数部分。D 可以是负数,以使 D 位左侧的 X 的小数点变为零。如果 XDNULL,函数返回 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() 的描述。