文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (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() 计算 e 的幂
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 次幂的值。此函数的反函数是 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 的自然对数;即以 e 为底的 X 的对数。如果 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

    如果使用两个参数调用,此函数将返回以 B 为底的 X 的对数。如果 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 % MN 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
  • 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)

    WHERE 子句中的 RAND() 将针对每一行(从一个表中选择时)或行的组合(从多表连接中选择时)进行计算。因此,出于优化器的目的,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() 使用 远离零舍入向最近值舍入 规则:如果小数部分大于或等于 .5,则向上舍入到下一个整数(如果为正)或向下舍入到下一个整数(如果为负)。(换句话说,它是远离零舍入的。)如果小数部分小于 .5,则向下舍入到下一个整数(如果为正)或向上舍入到下一个整数(如果为负)。

    • 对于近似值数字,结果取决于 C 库。在许多系统上,这意味着 ROUND() 使用 舍入到最接近的偶数 规则:如果小数部分恰好位于两个整数的中间,则舍入到最接近的偶数。

    以下示例显示了精确值和近似值的舍入方式不同

    mysql> SELECT ROUND(2.5), ROUND(25E-1);
    +------------+--------------+
    | ROUND(2.5) | ROUND(25E-1) |
    +------------+--------------+
    | 3          |            2 |
    +------------+--------------+

    有关详细信息,请参阅 第 14.25 节“精确数学”

    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)

    根据 X 是负数、零还是正数,返回参数的符号,分别为 -101。如果 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() 的说明。