文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


14.6.2 数学函数

表 14.10 数学函数

名称 描述
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 不在 -1 到 1 的范围内,或者 XNULL,则返回 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 的范围内,或者 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 次幂的值。此函数的逆函数是 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 节“字符串函数和运算符”

  • HEX(N_or_S)

    此函数可用于获取十进制数或字符串的十六进制表示形式;它执行此操作的方式根据参数类型而有所不同。有关详细信息,请参阅 第 14.8 节“字符串函数和运算符” 中对此函数的说明。

  • LN(X)

    返回 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

    如果使用两个参数调用,则此函数返回 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)

    返回 X 的以 2 为底的对数。如果 X 小于或等于 0.0E0,则函数返回 NULL,并报告警告 对数参数无效。如果 XNULL,则返回 NULL

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

    LOG2() 有助于确定数字需要多少位存储空间。此函数等效于表达式 LOG(X) / LOG(2)

  • LOG10(X)

    返回 X 的以 10 为底的对数。如果 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()

    返回 π(圆周率)的值。默认显示的小数位数为七位,但 MySQL 在内部使用完整的双精度值。

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

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

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

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

    这是 POW() 的同义词。

  • RADIANS(X)

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

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

    返回范围 0 <= v < 1.0 内的随机浮点值 v。要获取范围 i <= R < j 内的随机整数 R,请使用表达式 FLOOR(i + RAND() * (ji))。例如,要获取范围 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 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 可以为负数,导致值 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() 使用 四舍五入 规则:分数部分大于等于 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 的情况下,第二个参数是常量值。

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

      此外,对于 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 以弧度给出。如果 XNULL,则返回 NULL

    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 的正切值,其中 X 以弧度给出。如果 XNULL,则返回 NULL

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

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