数学函数和算术运算符
数值函数和运算符
名称 | 描述 |
---|---|
% ,MOD | 模运算符 |
* | 乘法运算符 |
+ | 加法运算符 |
- | 减号 |
- | 更改参数的符号 |
/ | 部门运营商 |
ABS() | 返回绝对值 |
ACOS() | 返回反余弦 |
ASIN() | 返回反正弦 |
ATAN() | 返回反正切 |
ATAN2() ,ATAN() | 返回两个参数的反正切 |
CEIL() | 返回不小于参数的最小整数值 |
CEILING() | 返回不小于参数的最小整数值 |
CONV() | 在不同的基数之间转换数字 |
COS() | 返回余弦 |
COT() | 返回余切 |
CRC32() | 计算循环冗余校验值 |
DEGREES() | 将弧度转换为度 |
DIV | 整数除法 |
EXP() | 提升力量 |
FLOOR() | 返回不大于参数的最大整数值 |
LN() | 返回参数的自然对数 |
LOG() | 返回第一个参数的自然对数 |
LOG10() | 返回参数的以10为底的对数 |
LOG2() | 返回参数的以2为底的对数 |
MOD() | 退还剩余 |
PI() | 返回pi的值 |
POW() | 将自变量提高到指定的幂 |
POWER() | 将自变量提高到指定的幂 |
RADIANS() | 返回参数转换为弧度 |
RAND() | 返回一个随机浮点值 |
ROUND() | 围绕论点 |
SIGN() | 返回参数的符号 |
SIN() | 返回参数的正弦 |
SQRT() | 返回参数的平方根 |
TAN() | 返回参数的正切值 |
TRUNCATE() | 截断为指定的小数位数 |
算术运算符
表算术运算符
名称 | 描述 |
---|---|
% ,MOD | 模运算符 |
* | 乘法运算符 |
+ | 加法运算符 |
- | 减号 |
- | 更改参数的符号 |
/ | 部门运营商 |
DIV | 整数除法 |
可以使用常规的算术运算符。根据以下规则确定结果:
- 在,,和的情况下
-
,如果两个操作数均为整数,则以(64位)精度计算结果。+
*
BIGINT
- 如果两个操作数都是整数,并且它们中的任何一个都是无符号的,则结果是无符号的整数。对于减法,如果
NO_UNSIGNED_SUBTRACTION
启用了 SQL模式,则即使对任何操作数都未签名,结果也会被签名。 - 如果任何一个操作数
+
,-
,/
,*
,%
是一个真正的或字符串值,其结果的精度与最大精度运算的精度。 - 在使用进行除法
/
时,使用两个精确值操作数时结果的小数位数是第一个操作数的小数位数加上div_precision_increment
系统变量的值(默认为4)。例如,表达式的结果的5.05 / 0.014
小数位数为六个小数位(360.714286
)。
这些规则适用于每个操作,因此嵌套计算意味着每个组件的精度。因此,(14620 / 9432456)/(24250 / 9432456)
首先解析为(0.0014)/(0.0026)
,最终结果具有8个小数位(0.60288653
)。
由于存在这些规则及其应用方式,因此应注意确保计算的组件和子组件使用适当的精度级别。请参见“信息函数”。
有关在数值表达式求值中处理溢出的信息,请参见“超出范围和溢出处理”。
算术运算符适用于数字。对于其他类型的值,可以使用替代操作。例如,要添加日期值,请使用DATE_ADD()
;请参见“日期和时间函数”。
+
加成:
mysql>
SELECT 3+5; -> 8-
减法:
mysql>
SELECT 3-5; -> -2-
一元减。该运算符更改操作数的符号。
mysql>
SELECT - 2; -> -2注意
如果将此运算符与a一起使用
BIGINT
,则返回值也是aBIGINT
。这意味着您应避免使用-
可能具有−2 63值的整数。*
乘法:
mysql>
SELECT 3*5; -> 15 mysql>SELECT 18014398509481984*18014398509481984.0; -> 324518553658426726783156020576256.0 mysql>SELECT 18014398509481984*18014398509481984; ->out -of -range error 最后一个表达式产生错误,因为整数乘法的结果超出了64位
BIGINT
计算范围。(请参见“数值数据类型”。)/
师:
mysql>
SELECT 3/5; -> 0.60除以零会产生
NULL
结果:mysql>
SELECT 102/(1-1); -> NULLBIGINT
仅当在将结果转换为整数的上下文中执行除法时,才使用算术计算。DIV
整数除法。从除法运算中丢弃的结果是小数点右边的任何小数部分。
如果两个操作数都具有非整数类型,则在将结果转换为之前,将这些操作数转换为
DECIMAL
并使用DECIMAL
算术除法BIGINT
。如果结果超出BIGINT
范围,则会发生错误。mysql>
SELECT 5 DIV 2, -5 DIV 2, 5 DIV -2, -5 DIV -2; -> 2, -2, -2, 2N%M
,N MOD M
模运算。返回
N
除以的余数M
。有关更多信息,请中对该MOD()
函数的描述。
数学函数
表数学函数
名称 | 描述 |
---|---|
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() | 截断为指定的小数位数 |
NULL
发生错误时,所有数学函数都会返回。
ABS(X)
返回的绝对值
X
。mysql>
SELECT ABS(2); -> 2 mysql>SELECT ABS(-32); -> 32此函数可以安全地与
BIGINT
值一起使用。ACOS(X)
返回的反余弦值
X
,即其余弦值为的值X
。NULL
如果X
不在的范围内-1
,则返回1
。mysql>
SELECT ACOS(1); -> 0 mysql>SELECT ACOS(1.0001); -> NULL mysql>SELECT ACOS(0); -> 1.5707963267949ASIN(X)
返回的反正弦
X
值,即正弦值为的值X
。NULL
如果X
不在的范围内-1
,则返回1
。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.1071487177941ATAN(Y,X)
,ATAN2(Y,X)
返回两个变量
X
和的反正切Y
。它与计算的反正切相似,不同之处在于,两个参数的符号都用于确定结果的象限。Y/X
mysql>
SELECT ATAN(-2,2); -> -0.78539816339745 mysql>SELECT ATAN2(PI(),0); -> 1.5707963267949CEIL(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
,从base转换from_base
为baseto_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()); -> -1COT(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'); -> 2501908538DEGREES(X)
返回参数
X
,从弧度转换为度。mysql>
SELECT DEGREES(PI()); -> 180 mysql>SELECT DEGREES(PI() / 2); -> 90EXP(X)
返回e的值(自然对数的底数),其乘幂为
X
。此函数的反函数是LOG()
(仅使用单个参数)或LN()
。mysql>
SELECT EXP(2); -> 7.3890560989307 mysql>SELECT EXP(-2); -> 0.13533528323661 mysql>SELECT EXP(0); -> 1FLOOR(X)
返回不大于的最大整数值
X
。mysql>
SELECT FLOOR(1.23), FLOOR(-1.23); -> 1, -2对于精确值数字参数,返回值具有精确值数字类型。对于字符串或浮点参数,返回值具有浮点类型。
FORMAT(X,D)
将数字
X
格式化为'#,###,###.##'
,将其舍入为D
小数位,然后将结果作为字符串返回。有关详细信息,请参见“字符串函数和运算符”。HEX(N_or_S)
此函数可用于获取十进制数字或字符串的十六进制表示形式;这样做的方式因参数的类型而异。有关详细信息,请参见“字符串函数和运算符”中对该函数的描述。
LN(X)
返回的自然对数
X
;也就是碱基ê的对数X
。如果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
到baseB
。如果X
小于或等于0,或者B
小于或等于1,则NULL
返回。mysql>
SELECT LOG(2,65536); -> 16 mysql>SELECT LOG(10,100); -> 2 mysql>SELECT LOG(1,100); -> NULLLOG(B,X)
等同于。LOG(X)/ LOG(B)
LOG2(X)
返回的以2为底的对数
X
。如果X
小于或等于0.0E0,函数将返回NULL
并报告警告“对数的无效参数”。mysql>
SELECT LOG2(65536); -> 16 mysql>SELECT LOG2(-100); -> NULLLOG2()
对于找出一个数字需要存储多少位很有用。此函数等效于表达式。LOG(X)/ LOG(2)
LOG10(X)
返回的以10为底的对数
X
。如果X
小于或等于0.0E0,函数将返回NULL
并报告警告“对数的无效参数”。mysql>
SELECT LOG10(2); -> 0.30102999566398 mysql>SELECT LOG10(100); -> 2 mysql>SELECT LOG10(-100); -> NULLLOG10(X)
等同于。LOG(10,X)
MOD(N,M)
,,N%M
N MOD 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.5MOD(N,0)
返回NULL
。PI()
返回π(pi)的值。默认显示的小数位数为七个,但MySQL内部使用完整的双精度值。
mysql>
SELECT PI(); -> 3.141593 mysql>SELECT PI()+0.000000000000000000; -> 3.141592653589793116POW(X,Y)
返回
X
提高到的幂的值Y
。mysql>
SELECT POW(2,2); -> 4 mysql>SELECT POW(2,-2); -> 0.25POWER(X,Y)
这是的同义词
POW()
。RADIANS(X)
返回参数
X
,从度转换为弧度。(请注意,π弧度等于180度。)mysql>
SELECT RADIANS(90); -> 1.5707963267949RAND([N])
返回
v
范围为0
<=v
<的随机浮点值1.0
。要获得<=<R
范围内的随机整数,请使用表达式−。例如,要获取范围<=<范围内的随机整数,请使用以下语句:i
R
j
FLOOR(i+ RAND()*(j
i))
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 tVALUES (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()
它不是常数,因此不能用于索引优化。有关更多信息,请参见“函数调用优化”。RAND()
在ORDER BY
orGROUP BY
子句中使用带有值的列可能会产生意外的结果,因为对于任一子句RAND()
,同一行的表达式可以多次求值,每次返回不同的结果。如果目标是按随机顺序检索行,则可以使用如下语句:SELECT *FROM tbl_nameORDER BY RAND();要从一组行中选择一个随机样本,请结合
ORDER BY RAND()
使用LIMIT
:SELECT *FROM table1, table2WHERE a=b AND c<dORDER BY RAND()LIMIT 1000;RAND()
并不意味着是一个完美的随机生成器。这是一种按需生成随机数的快速方法,该随机数可在同一MySQL版本的平台之间移植。此功能对于基于语句的复制不安全。设置为时,如果使用此功能,
binlog_format
将记录警告STATEMENT
。ROUND(X)
,ROUND(X,D)
将参数舍入
X
到D
小数位。舍入算法取决于的数据类型X
。D
如果未指定,则默认为0。D
可以为负数,从而导致D
该值的小数点左边的数字X
变为零。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()
根据第一个参数的类型使用以下规则:- 对于精确值数字,请
ROUND()
使用“从零开始舍入一半”或“向最接近的舍入”规则:小数部分为.5或更大的值将四舍五入到下一个整数(如果为正数,则四舍五入)负。(换句话说,四舍五入到零。)小数部分小于.5的值如果为正则四舍五入到下一个整数,如果为负则四舍五入到下一个整数。 - 对于近似值数字,结果取决于C库。在许多系统上,这意味着
ROUND()
使用“四舍五入到最接近的偶数”规则:小数部分恰好位于两个整数中间的值将四舍五入为最接近的偶数整数。
以下示例显示了精确值和近似值的舍入差异:
mysql>
SELECT ROUND(2.5), ROUND(25E-1); +------------ +-------------- + | ROUND(2.5) | ROUND(25E -1) | +------------ +-------------- + | 3 | 2 | +------------ +-------------- +有关更多信息,请参见“整数类型(精确值)”。
- 对于精确值数字,请
SIGN(X)
返回参数作为标志
-1
,0
或者1
,根据是否X
是负数,零或正。mysql>
SELECT SIGN(-32); -> -1 mysql>SELECT SIGN(0); -> 0 mysql>SELECT SIGN(234); -> 1SIN(X)
返回的正弦值
X
,其中X
以弧度表示。mysql>
SELECT SIN(PI()); -> 1.2246063538224e-16 mysql>SELECT ROUND(SIN(PI())); -> 0SQRT(X)
返回非负数的平方根
X
。mysql>
SELECT SQRT(4); -> 2 mysql>SELECT SQRT(20); -> 4.4721359549996 mysql>SELECT SQRT(-16); -> NULLTAN(X)
返回的切线
X
,其中X
以弧度给出。mysql>
SELECT TAN(PI()); -> -1.2246063538224e-16 mysql>SELECT TAN(PI()+1); -> 1.5574077246549TRUNCATE(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所有数字均四舍五入。