首页 > 数据库 > > 12.6 数值函数和操作符
参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/numeric-functions.html
12.6.1 参数操作符
通常的算术运算符可用。 结果根据以下规则确定:
这些规则适用于每个操作,因此嵌套计算意味着每个组件的精度。 因此,(14620/9432456)/(24250/9432456)首先解析为(0.0014)/(0.0026),最终结果为小数点后8位(0.60288653)。
由于这些规则及其应用方式,应注意确保计算的组件和子组件使用适当的精度级别。
算术运算符适用于数字。 对于其他类型的值,可能会有替代操作。 例如,要添加日期值,请使用DATE_ADD();
整数划分。 从除法结果中舍弃小数点右侧的小数部分。
如果任一操作数具有非整数类型,则在将结果转换为BIGINT之前,操作数将转换为DECIMAL并使用DECIMAL算术进行分割。 如果结果超出BIGINT范围,则会发生错误。
mysql> SELECT 5 DIV 2, -5 DIV 2, 5 DIV -2, -5 DIV -2;
-> 2, -2, -2, 2
模数操作。 返回N除以M的余数。
12.6.2 数学函数
所有数学函数在发生错误时返回NULL。
返回X的绝对值。
mysql> SELECT ABS(2);
-> 2
mysql> SELECT ABS(-32);
-> 32
该功能可以安全地用于BIGINT值。
返回X的反余弦值,即余弦值为X的值。如果X不在-1到1的范围内,则返回NULL。
mysql> SELECT ACOS(1);
-> 0
mysql> SELECT ACOS(1.0001);
-> NULL
mysql> SELECT ACOS(0);
-> 1.5707963267949
返回X的反正弦值,即正弦为X的值。如果X不在-1到1的范围内,则返回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' |
+---------+------+-----------------------------------------+
返回X的反正切值,即正切值为X的值。
mysql> SELECT ATAN(2);
-> 1.1071487177941
mysql> SELECT ATAN(-2);
-> -1.1071487177941
返回两个变量X和Y的反正切值。它类似于计算Y/X的反正切值。
mysql> SELECT ATAN(-2,2);
-> -0.78539816339745
mysql> SELECT ATAN2(PI(),0);
-> 1.5707963267949
CEIL()是CEILING()的同义词。
返回不小于X的最小整数值。
mysql> SELECT CEILING(1.23);
-> 2
mysql> SELECT CEILING(-1.23);
-> -1
对于精确值数字参数,返回值具有精确值数字类型。 对于字符串或浮点参数,返回值具有浮点类型。
在不同的数字基础之间转换数字。 返回数字N的字符串表示形式,从基本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'
--进制转换
返回X的余弦,其中X以弧度给出。
mysql> SELECT COS(PI());
-> -1
返回X的余切值。
mysql> SELECT COT(12);
-> -1.5726734063977
mysql> SELECT COT(0);
-> out-of-range error
计算循环冗余校验值并返回一个32位无符号值。 如果参数为NULL,则结果为NULL。 该参数预计是一个字符串,并且(如果可能的话)被视为一个。
mysql> SELECT CRC32('MySQL'); -> 3259397556
mysql> SELECT CRC32('mysql'); -> 2501908538
返回参数X,从弧度转换为度数。
mysql> SELECT DEGREES(PI());
-> 180
mysql> SELECT DEGREES(PI() / 2);
-> 90
返回引起X的幂的e(自然对数的底数)的值。此函数的反函数是LOG()(仅使用单个参数)或LN()。
mysql> SELECT EXP(2);
-> 7.3890560989307
mysql> SELECT EXP(-2);
-> 0.13533528323661
mysql> SELECT EXP(0);
-> 1
返回不大于X的最大整数值。
mysql> SELECT FLOOR(1.23), FLOOR(-1.23);
-> 1, -2
对于精确值数字参数,返回值具有精确值数字类型。 对于字符串或浮点参数,返回值具有浮点类型。
将数字X格式化为像'#,###,###。##'这样的格式,四舍五入为D小数位,并将结果作为字符串返回。 有关细节,请参见第12.5节“字符串函数”。
该函数可用于获取十进制数或字符串的十六进制表示形式; 它的表现方式因论证的类型而异。 有关详细信息,请参见第12.5节“字符串函数”中的该函数的描述。
返回X的自然对数; 即X的基数e对数。如果X小于或等于0.0E0,则该函数返回NULL,并且(从MySQL 5.7.4起)会出现“ Invalid argument for logarithm”警告。
mysql> SELECT LN(2);
-> 0.69314718055995
mysql> SELECT LN(-2);
-> NULL
该函数与LOG(X)同义。 这个函数的反函数是EXP()函数。
如果使用一个参数调用,则此函数返回X的自然对数。如果X小于或等于0.0E0,则函数将返回NULL,并且(从MySQL 5.7.4开始)会出现“ Invalid argument for logarithm”警告。
这个函数的反函数(当用一个参数调用时)是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)。
返回X的基数为2的对数。如果X小于或等于0.0E0,则函数返回NULL,并且(从MySQL 5.7.4开始)会报告“Invalid argument for logarithm”警告。
mysql> SELECT LOG2(65536);
-> 16
mysql> SELECT LOG2(-100);
-> NULL
LOG2()对于查明数字要存储多少位有用。 这个函数等价于表达式LOG(X)/ LOG(2)。
返回X的基数为10的对数。如果X小于或等于0.0E0,则函数返回NULL,并且(从MySQL 5.7.4开始)会报告“ Invalid argument for logarithm”警告。
mysql> SELECT LOG10(2);
-> 0.30102999566398
mysql> SELECT LOG10(100);
-> 2
mysql> SELECT LOG10(-100);
-> NULL
LOG10(X)相当于LOG(10,X)。
模数操作。 返回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)的值。 显示的默认小数位数是7,但MySQL在内部使用完整的双精度值。
mysql> SELECT PI();
-> 3.141593
mysql> SELECT PI()+0.000000000000000000;
-> 3.141592653589793116
返回X的值增加到Y的幂。
mysql> SELECT POW(2,2);
-> 4
mysql> SELECT POW(2,-2);
-> 0.25
这是POW()的同义词。
返回从度数转换为弧度的参数X. (注意π弧度等于180度。)
mysql> SELECT RADIANS(90);
-> 1.5707963267949
返回0 <= v <1.0范围内的随机浮点值v。 要获得范围为i <= R <j的随机整数R,请使用表达式FLOOR(i + RAND()*(j-i))。 例如,要获取7 <= R <12范围内的随机整数,请使用以下语句:
SELECT FLOOR(7 + (RAND() * 5));
如果指定了整数参数N,则将其用作seed值:
这种行为的一个含义是,对于相等的参数值,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()不是一个常数值,不能用于索引优化。 有关更多信息,请参见第8.2.1.17节“函数调用优化”。
在ORDER BY或GROUP 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时使用此函数,则会记录一条警告。 (BUG#49222)
将参数X舍入到D小数位。 舍入算法取决于X的数据类型。如果未指定,则D默认为0。 D可能是负数,导致值X的小数点左边的D数字变为零。
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(150.000,2), ROUND(150,2);
+------------------+--------------+
| ROUND(150.000,2) | ROUND(150,2)
| +------------------+--------------+
| 150.00 | 150 |
+------------------+--------------+
根据第一个参数的类型,ROUND()使用以下规则:
以下示例显示了精确值和近似值的舍入方式不同:
mysql> SELECT ROUND(2.5), ROUND(25E-1);
+------------+--------------+
| ROUND(2.5) | ROUND(25E-1) |
+------------+--------------+
| 3 | 2 |
+------------+--------------+
根据X是负数,零还是正数,将参数的符号返回为-1,0或1。
mysql> SELECT SIGN(-32);
-> -1
mysql> SELECT SIGN(0);
-> 0
mysql> SELECT SIGN(234);
-> 1
返回X的正弦值,其中X以弧度给出。
mysql> SELECT SIN(PI());
-> 1.2246063538224e-16
mysql> SELECT ROUND(SIN(PI()));
-> 0
返回非负数X的平方根。
mysql> SELECT SQRT(4);
-> 2
mysql> SELECT SQRT(20);
-> 4.4721359549996
mysql> SELECT SQRT(-16);
-> NULL
返回X的正切值,其中X以弧度给出。
mysql> SELECT TAN(PI());
-> -1.2246063538224e-16
mysql> SELECT TAN(PI()+1);
-> 1.5574077246549
返回数字X,截断到D小数位。 如果D为0,结果没有小数点或小数部分。 D可能是负数,导致值X的小数点左边的D数字变为零
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
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3162391/ ,如需转载,请注明出处,否则将追究法律责任。