12.5.2 math 函数

table12.9math 函数

NameDescription
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()截断为指定的小数位数

发生错误时,所有 math 函数均返回NULL

ABS(X)

返回* X *的绝对值。

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

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

ACOS(X)

返回* X 的反余弦,即余弦为 X 的值。如果 X *不在-11范围内,则返回NULL

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

ASIN(X)

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

mysql> SELECT ATAN(2);
        -> 1.1071487177941
mysql> SELECT ATAN(-2);
        -> -1.1071487177941

ATAN(Y,X), ATAN2(Y,X)

返回两个变量* X Y *的反正切。它与计算Y / X的反正切相似,不同之处在于,两个参数的符号均用于确定结果的象限。

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

CEIL(X)

CEIL()CEILING()的同义词。

CEILING(X)

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

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

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

CONV(N,from_base,to_base)

在不同的数字基数之间转换数字。返回数字* N 的字符串 table 示形式,从基数 from_base 转换为基数 to_base 。如果任何参数为NULL,则返回NULL。参数 N 被解释为整数,但可以指定为整数或字符串。最小底数是2,最大底数是36。如果 from_base 为负数,则 N 被视为带符号的数字。否则, N *被视为未签名。 CONV()以 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

COT(X)

返回* X *的余切。

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 *,从弧度转换为度。

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

EXP(X)

返回提高到* X 的幂的 e *(自然对数的底)的值。此函数的反函数是LOG()(仅使用单个参数)或LN()

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

FLOOR(X)

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

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

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

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

此函数可用于获取十进制数字或字符串的十六进制 table 示形式;这样做的方式会根据参数的类型而有所不同。有关详细信息,请参见第 12.7 节“字符串函数和运算符”中此功能的描述。

LN(X)

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

此函数的反函数(当使用单个参数调用时)是EXP()函数。

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

如果使用两个参数调用,则此函数将* X *的对数返回到基数B2 。如果 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)等效于对数(X)/对数(B)

LOG2(X)

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

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

LOG2()对于找出一个数字需要存储多少位很有用。该函数等效于 table 达式LOG(X)/ LOG(2)

LOG10(X)

返回* X 的以 10 为底的对数。如果 X *小于或等于 0.0E0,则函数返回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 *的余数。

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)的值。默认显示的小数位数为 7,但 MySQL 内部使用完整的双精度值。

mysql> SELECT PI();
        -> 3.141593
mysql> SELECT PI()+0.000000000000000000;
        -> 3.141592653589793116

POW(X,Y)

返回* X 的值,提高到 Y *的幂。

mysql> SELECT POW(2,2);
        -> 4
mysql> SELECT POW(2,-2);
        -> 0.25

POWER(X,Y)

这是POW()的同义词。

RADIANS(X)

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

mysql> SELECT RADIANS(90);
        -> 1.5707963267949

RAND([N])

返回范围为0 <= * v * <1.0的随机浮点值* v 。要获得范围为i * <= * R * < j 的随机整数 R *,请使用 table 达式楼层(i RAND()*(j-i))。例如,要获得7 <= * R * <12范围内的随机整数,请使用以下语句:

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

如果指定整数参数* N *,它将用作种子值:

  • 使用恒定的初始值设定项参数,在准备执行语句之前,将种子初始化一次。

    • 使用非恒定的初始值设定项参数(例如列名),将使用每次RAND()调用的值来初始化种子。

此行为的一个暗示是,对于相等的参数值,RAND(N)每次都会返回相同的值,从而产生可重复的列值序列。在下面的示例中,由RAND(3)产生的值的 Sequences 在两个位置都相同。

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()被评估为每一行(从一个 table 中选择时)或行的组合(当从多 table 联接中选择时)。因此,出于优化目的,RAND()不是常数,因此不能用于索引优化。有关更多信息,请参见第 8.2.1.18 节,“函数调用优化”

ORDER BYGROUP BY子句中使用具有RAND()值的列可能会产生意外的结果,因为对于任一子句,同一行中的RAND()table 达式可以被求值多次,每次返回不同的结果。如果目标是按随机 Sequences 检索行,则可以使用如下语句:

SELECT * FROM tbl_name ORDER BY RAND();

要从一组行中选择一个随机 samples,请将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 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 |
+------------------+--------------+

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

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

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

以下示例显示了精确值和近似值的舍入差异:

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

有关更多信息,请参见第 12.22 节“精密 math”

SIGN(X)

根据* X *是负数,零还是正数,将参数的符号返回为-101

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

SIN(X)

返回* X 的正弦值,其中 X *以弧度给出。

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

SQRT(X)

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

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

TAN(X)

返回* X 的切线,其中 X *以弧度给出。

mysql> SELECT TAN(PI());
        -> -1.2246063538224e-16
mysql> SELECT TAN(PI()+1);
        -> 1.5574077246549

TRUNCATE(X,D)

返回数字* X ,截断为 D 小数位。如果 D *是0,则结果没有小数点或小数部分。 * 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

所有数字均四舍五入。