# 12.6.2 数学函数

表 12.10 数学函数

姓名 描述
ABS() 返回绝对值
ACOS() 返回反余弦
ASIN() 返回反正弦
晒黑() 返回反正切
ATAN2(), 晒黑() 返回两个参数的反正切
CEIL() 返回不小于参数的最小整数值
天花板() 返回不小于参数的最小整数值
转换() 在不同数字基数之间转换数字
COS() 返回余弦
婴儿床() 返回余切
CRC32() 计算循环冗余校验值
度数() 将弧度转换为度
经验() 提升到权力
地面() 返回不大于参数的最大整数值
LN() 返回参数的自然对数
日志() 返回第一个参数的自然对数
日志10() 返回参数的以 10 为底的对数
LOG2() 返回参数的以 2 为底的对数
模组() 返回剩余部分
PI() 返回 pi 的值
战俘() 将引发的参数返回到指定的幂
力量() 将引发的参数返回到指定的幂
弧度() 返回参数转换为弧度
兰德() 返回一个随机浮点值
圆形的() 围绕论点
标志() 返回参数的符号
罪() 返回参数的正弦
平方根() 返回参数的平方根
谭() 返回参数的正切
截短() 截断到指定的小数位数

所有数学函数返回空值如果发生错误。

  • ABS(*X*)

    返回的绝对值*X, 要么空值如果X*是空值.

    结果类型派生自参数类型。这意味着ABS(-9223372036854775808)产生错误,因为结果不能存储在有符号的大整数价值。

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

    此功能可以安全使用大整数价值观。

  • ACOS(*X*)

    返回反余弦值*X,即余弦为X.退货空值如果X*不在范围内-11.

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

    返回的反正弦*X,即正弦值为X.退货空值如果X*不在范围内-11.

    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*.

    mysql> SELECT ATAN(2);
            -> 1.1071487177941
    mysql> SELECT ATAN(-2);
            -> -1.1071487177941
    
  • 晒黑(**,*X*),ATAN2(**,*X*)

    返回两个变量的反正切*X*.类似于计算反正切** / *X*,除了两个参数的符号用于确定结果的象限。

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

    CEIL()是同义词天花板().

  • 天花板(*X*)

    返回不小于的最小整数值*X*.

    mysql> SELECT CEILING(1.23);
            -> 2
    mysql> SELECT CEILING(-1.23);
            -> -1
    

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

  • 转化率(*ñ*,*from_base*,*to_base*)

    在不同的数字基数之间转换数字。返回数字的字符串表示形式*ñ, 从基数转换from_base基地to_base.退货空值如果有任何论据空值.论据ñ被解释为整数,但可以指定为整数或字符串。最小基数是2最大基数是36.如果from_base是负数,ñ被视为有符号数。否则,ñ*被视为无符号。转换()以 64 位精度工作。

    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*以弧度表示。

    mysql> SELECT COS(PI());
            -> -1
    
  • 婴儿床(*X*)

    返回的余切*X*.

    mysql> SELECT COT(12);
            -> -1.5726734063977
    mysql> SELECT COT(0);
            -> out-of-range error
    
  • CRC32(*表达式*)

    计算循环冗余校验值并返回 32 位无符号值。结果是空值如果参数是空值.该参数应为字符串,如果不是,则(如果可能)被视为一个。

    mysql> SELECT CRC32('MySQL');
            -> 3259397556
    mysql> SELECT CRC32('mysql');
            -> 2501908538
    
  • 度数(*X*)

    返回参数*X*,从弧度转换为度数。

    mysql> SELECT DEGREES(PI());
            -> 180
    mysql> SELECT DEGREES(PI() / 2);
            -> 90
    
  • 经验(*X*)

    返回值e(自然对数的底)的幂次方*X*.这个函数的逆函数是日志()(仅使用单个参数)或LN().

    mysql> SELECT EXP(2);
            -> 7.3890560989307
    mysql> SELECT EXP(-2);
            -> 0.13533528323661
    mysql> SELECT EXP(0);
            -> 1
    
  • 地面(*X*)

    返回不大于的最大整数值*X*.

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

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

  • 格式(*X*,*D*)

    格式化数字*X像这样的格式'#,###,###.##',四舍五入为D*小数位,并将结果作为字符串返回。有关详细信息,请参阅第 12.8 节,“字符串函数和运算符”.

  • 十六进制(N_or_S)

    该函数可用于获取十进制数或字符串的十六进制表示;它这样做的方式因参数的类型而异。请参阅此函数的说明第 12.8 节,“字符串函数和运算符”, 了解详情。

  • 液氮(*X*)

    返回的自然对数*X;也就是说,基e的对数X.如果X*小于或等于 0.0E0,函数返回空值并报告警告“对数的参数无效”。

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

    这个功能是同义词日志(*X*).这个函数的逆函数是经验()功能。

  • 日志(*X*),日志(**,*X*)

    如果使用一个参数调用,此函数返回的自然对数*X.如果X*小于或等于 0.0E0,函数返回空值并报告警告“对数的参数无效”。

    此函数的逆函数(使用单个参数调用时)是经验()功能。

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

    如果使用两个参数调用,此函数返回的对数*X到基地.如果X小于或等于 0,或者如果*小于或等于 1,则空值被退回。

    mysql> SELECT LOG(2,65536);
            -> 16
    mysql> SELECT LOG(10,100);
            -> 2
    mysql> SELECT LOG(1,100);
            -> NULL
    

    日志(**,*X*)相当于日志(*X*) / 日志(**).

  • 日志2(*X*)

    返回以 2 为底的对数*X*.如果*X*小于或等于 0.0E0,函数返回空值并报告警告“对数的参数无效”。

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

    LOG2()对于找出一个数字需要多少位来存储很有用。这个函数等价于表达式日志(*X*) / 日志(2).

  • 日志10(*X*)

    返回以 10 为底的对数*X.如果X*小于或等于 0.0E0,函数返回空值并报告警告“对数的参数无效”。

    mysql> SELECT LOG10(2);
            -> 0.30102999566398
    mysql> SELECT LOG10(100);
            -> 2
    mysql> SELECT LOG10(-100);
            -> NULL
    

    日志10(*X*)相当于日志(10,*X*).

  • 模组(*ñ*,**),*ñ* % **,*ñ* 模组 **

    模运算。返回剩余的*ñ除以*.

    mysql> SELECT MOD(234, 10);
            -> 4
    mysql> SELECT 253 % 7;
            -> 1
    mysql> SELECT MOD(29,9);
            -> 2
    mysql> SELECT 29 MOD 9;
            -> 2
    

    此功能可以安全使用大整数价值观。

    模组()也适用于具有小数部分并在除法后返回精确余数的值:

    mysql> SELECT MOD(34.5,3);
            -> 1.5
    

    模组(*ñ*,0)返回空值.

  • PI()

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

    mysql> SELECT PI();
            -> 3.141593
    mysql> SELECT PI()+0.000000000000000000;
            -> 3.141592653589793116
    
  • 战俘(*X*,**)

    返回值*X提升到权力*.

    mysql> SELECT POW(2,2);
            -> 4
    mysql> SELECT POW(2,-2);
            -> 0.25
    
  • 力量(*X*,**)

    这是的同义词战俘().

  • 弧度(*X*)

    返回参数*X*,从度数转换为弧度。(请注意,π 弧度等于 180 度。)

    mysql> SELECT RADIANS(90);
            -> 1.5707963267949
    
  • 兰德([*ñ*])

    返回一个随机浮点值*v范围中0\<=v\<1.0.获取随机整数R范围中一世\<=R\<j, 使用表达式地面(*一世* + 兰德() * (*j*-*一世*)).例如,要获取范围内的随机整数范围7\<=R*\<12,使用以下语句:

    SELECT FLOOR(7 + (RAND() * 5));
    

    如果一个整数参数*ñ*被指定,它被用作种子值:

    • 使用常量初始化器参数,种子在语句准备好时初始化一次,然后再执行。

    • 使用非常量初始值设定项参数(例如列名),种子使用每次调用的值进行初始化兰德().

      这种行为的一个含义是,对于相等的参数值,兰德(*ñ*)每次返回相同的值,从而产生可重复的列值序列。在以下示例中,生成的值序列由兰德(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)
    

    兰德()在一个在哪里为每一行(从一个表中选择时)或行组合(从多表连接中选择时)评估子句。因此,出于优化器的目的,兰德()不是一个常数值,不能用于索引优化。有关详细信息,请参阅第 8.2.1.20 节,“函数调用优化”.

    使用一列兰德()中的值订购方式要么通过...分组子句可能会产生意想不到的结果,因为对于任何一个子句兰德()可以对同一行多次计算表达式,每次返回不同的结果。如果目标是以随机顺序检索行,则可以使用如下语句:

    SELECT * FROM tbl_name ORDER BY RAND();
    

    要从一组行中选择一个随机样本,请结合兰德订购()限制

    SELECT * FROM table1, table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000;
    

    兰德()并不意味着是一个完美的随机生成器。这是一种按需生成随机数的快速方法,可在同一 MySQL 版本的平台之间移植。

    此函数对于基于语句的复制是不安全的。如果您在以下情况下使用此功能,则会记录警告binlog_format被设定为陈述.

  • 圆形的(*X*),圆形的(*X*,*D*)

    四舍五入的论点*XD小数位。舍入算法取决于数据类型X.D如果未指定,则默认为 0。D可能是负面的D数值小数点左边的数字X变成零。最大绝对值D*是 30;任何超过 30(或 -30)的数字都会被截断。

    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 |
    +------------------+--------------+
    

    圆形的()根据第一个参数的类型使用以下规则:

    • 对于精确值数字,圆形的()使用“从零舍入一半”或“向最近舍入”规则:小数部分为 0.5 或更大的值如果为正则向上舍入到下一个整数,如果为负则向下舍入到下一个整数。(换句话说,它从零四舍五入。)小数部分小于 0.5 的值如果为正则向下舍入到下一个整数,如果为负则向上舍入到下一个整数。

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

      以下示例显示了精确值和近似值的舍入有何不同:

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

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

    在 MySQL 8.0.21 及更高版本中,返回的数据类型圆形的()(和截短()) 根据此处列出的规则确定:

    • 当第一个参数是任何整数类型时,返回类型总是大整数.

    • 当第一个参数是任何浮点类型或任何非数字类型时,返回类型总是双倍的.

    • 当第一个参数是十进制value,返回类型也是十进制.

    • 返回值的类型属性也从第一个参数中复制,除非是十进制,当第二个参数是一个常数值时。

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

      此外,对于圆形的()(但不是为了截短()函数),精度扩展了一位,以适应增加有效位数的舍入。如果第二个参数为负,则调整返回类型,使其比例为 0,并具​​有相应的精度。例如,圆 (99.999, 2)返回100.00——第一个论点是十进制(5, 3),返回类型为十进制(5, 2).

      如果第二个参数为负数,则返回类型的比例为 0 和相应的精度;圆形(99.999,-1)返回100,即十进制(3, 0).

  • 标志(*X*)

    返回参数的符号为-1, 0, 要么1, 取决于是否*X*是负数、零或正数。

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

    返回正弦值*X, 在哪里X*以弧度表示。

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

    返回非负数的平方根*X*.

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

    返回正切*X, 在哪里X*以弧度表示。

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

    返回数字*X, 截断为D小数位。如果D0,结果没有小数点或小数部分。D可能是负面的D数值小数点左边的数字X*变成零。

    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
    

    所有数字都向零舍入。

    在 MySQL 8.0.21 及更高版本中,返回的数据类型截短()遵循确定返回类型的相同规则圆形的()功能;有关详细信息,请参阅说明圆形的().