mysql函数和操作符Word文档格式.docx
《mysql函数和操作符Word文档格式.docx》由会员分享,可在线阅读,更多相关《mysql函数和操作符Word文档格式.docx(124页珍藏版)》请在冰点文库上搜索。
![mysql函数和操作符Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/4a435f44-24f1-46c0-a680-ccb841aebf14/4a435f44-24f1-46c0-a680-ccb841aebf141.gif)
这能帮助
MySQL分析程序区分一些同函数名相同的函数调用以及表或列。
不过,函数自变量周围允许有空格出现。
可以通过选择--sql-mode=IGNORE_SPACE来打开MySQL服务器的方法使服务器接受函数名后的空格。
个人客户端程序可通过选择mysql_real_connect()的CLIENT_IGNORE_SPACE实现这一状态。
在以上两种情况中,所有的函数名都成为保留字。
请参见5.3.2节,“SQL服务器模式”.
为节省时间,本章中对大多数例子使用简写形式展示了mysql程序的输出结果。
对于以下格式的举例展示:
mysql>
SELECTMOD(29,9);
+-----------+
|mod(29,9)|
|
2|
1rowsinset(0.00秒)
使用如下格式进行代替:
->
2
12.1.
操作符
12.1.1.
操作符优先级
以下列表显示了操作符优先级的由低到高的顺序。
排列在同一行的操作符具有相同的优先级。
:
=
||,OR,XOR
&
AND
NOT
BETWEEN,CASE,WHEN,THEN,ELSE
=,<
=>
>
=,>
<
>
!
=,IS,LIKE,REGEXP,IN
|
<
-,+
*,/,DIV,%,MOD
^
-(一元减号),~(一元比特反转)
!
BINARY,COLLATE
假如HIGH_NOT_PRECEDENCESQL模式被激活,则NOT的优先级同the
!
操作符相同。
请参见5.3.2节,“SQL服务器模式”。
12.1.2.
圆括号
∙(...)
使用括弧来规定表达式的运算顺序,例如:
SELECT1+2*3;
7
SELECT(1+2)*3;
9
12.1.3.
比较函数和操作符
比较运算产生的结果为1(TRUE)、0(FALSE)或NULL。
这些运算可用于数字和字符串。
根据需要,字符串可自动转换为数字,而数字也可自动转换为字符串。
本章中的一些函数(如LEAST()和GREATEST())的所得值不包括1(TRUE)、0(FALSE)和NULL。
然而,其所得值乃是基于按照下述规则运行的比较运算:
MySQL按照以下规则进行数值比较:
∙若有一个或两个参数为NULL,除非NULL-safe<
等算符,则比较运算的结果为NULL。
∙若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。
∙若两个参数均为整数,则按照整数进行比较。
∙十六进制值在不需要作为数字进行比较时,则按照二进制字符串进行处理。
∙假如参数中的一个为TIMESTAMP或DATETIME列,而其它参数均为常数,则在进行比较前将常数转为timestamp。
这样做的目的是为了使ODBC的进行更加顺利。
注意,这不适合IN()中的参数!
为了更加可靠,在进行对比时通常使用完整的datetime/date/time字符串。
∙在其它情况下,参数作为浮点数进行比较。
在默认状态下,字符串比较不区分大小写,并使用现有字符集(默认为cp1252Latin1,同时对英语也适合)。
为了进行比较,可使用CAST()函数将某个值转为另外一种类型。
使用CONVERT()将字符串值转为不同的字符集。
请参见12.8节,“Cast函数和操作符”。
以下例子说明了比较运算中将字符串转为数字的过程:
SELECT1>
'
6x'
;
0
SELECT7>
1
SELECT0>
x6'
SELECT0='
注意,在将一个字符串列同一个数字进行比较时,MySQL不能使用列中的索引进行快速查找。
假如str_col是一个编入索引的字符串列,则在以下语句中,索引不能执行查找功能:
SELECT*FROMtbl_nameWHEREstr_col=1;
其原因是许多不同的字符串都可被转换为数值1:
1'
、'
1'
1a'
、……
∙=
等于:
SELECT1=0;
SELECT'
0'
=0;
0.0'
0.01'
.01'
=0.01;
∙<
NULL-safeequal.这个操作符和=操作符执行相同的比较操作,不过在两个操作码均为NULL时,其所得值为1而不为NULL,而当一个操作码为NULL时,其所得值为0而不为NULL。
SELECT1<
1,NULL<
NULL,1<
NULL;
1,1,0
SELECT1=1,NULL=NULL,1=NULL;
1,NULL,NULL
=
不等于:
<
SELECT.01<
zapp'
zappp'
小于或等于:
SELECT0.1<
=2;
小于:
SELECT2<
2;
∙>
大于或等于:
SELECT2>
大于:
∙ISboolean_valueISNOTboolean_value
根据一个布尔值来检验一个值,在这里,布尔值可以是TRUE、FALSE或UNKNOWN。
SELECT1ISTRUE,0ISFALSE,NULLISUNKNOWN;
1,1,1
SELECT1ISNOTUNKNOWN,0ISNOTUNKNOWN,NULLISNOTUNKNOWN;
∙ISNULLISNOTNULL
检验一个值是否为NULL。
SELECT1ISNULL,0ISNULL,NULLISNULL;
0,0,1
SELECT1ISNOTNULL,0ISNOTNULL,NULLISNOTNULL;
为了能够顺利的使用ODBC程序工作,在使用ISNULL时,MySQL支持一下额外特性:
o在一个值产生后,立即运行一个以下格式的语句,从而找到最新AUTO_INCREMENT值的所在行:
o
SELECT*FROMtbl_nameWHEREauto_colISNULL
当设置SQL_AUTO_IS_NULL=0时,这项操作无法运行。
请参见13.5.3节,“SET语法”。
o对于命名为NOTNULL的DATE和DATETIME列,可通过使用如下的语句找到特定日期'
0000-00-00'
:
SELECT*FROMtbl_nameWHEREdate_columnISNULL
运行这一步需要使用一些ODBC应用软件,因为ODBC本身不支持一个'
的时间值。
∙exprBETWEENminANDmax
假如expr大于或等于min且expr小于或等于max,则BETWEEN的返回值为1,或是0。
若所有参数都是同一类型,则上述关系相当于表达式
(min<
=exprANDexpr<
=max)。
其它类型的转换根据本章开篇所述规律进行,且适用于3种参数中任意一种。
SELECT1BETWEEN2AND3;
b'
BETWEEN'
a'
AND'
c'
SELECT2BETWEEN2AND'
3'
x-3'
∙exprNOTBETWEENminANDmax
这相当于NOT(exprBETWEENminANDmax)。
·
COALESCE(value,...)
返回值为列表当中的第一个非NULL值,在没有非NULL值得情况下返回值为NULL。
SELECTCOALESCE(NULL,1);
SELECTCOALESCE(NULL,NULL,NULL);
NULL
GREATEST(value1,value2,...)
当有2或多个参数时,返回值为最大(最大值的)参数。
比较参数所依据的规律同LEAST()相同。
SELECTGREATEST(2,0);
SELECTGREATEST(34.0,3.0,5.0,767.0);
767.0
SELECTGREATEST('
B'
'
A'
C'
);
在没有自变量为NULL的情况下,GREATEST()的返回值为NULL。
exprIN(value,...)
∙若expr为IN列表中的任意一个值,则其返回值为1,否则返回值为0。
假如所有的值都是常数,则其计算和分类根据expr的类型进行。
这时,使用二分搜索来搜索信息。
如IN值列表全部由常数组成,则意味着IN的速度非常之快。
如expr是一个区分大小写的字符串表达式,则字符串比较也按照区分大小写的方式进行。
SELECT2IN(0,3,5,'
wefwf'
IN(0,3,5,'
IN列表中所列值的个数仅受限于max_allowed_packet值。
为了同SQL标准相一致,在左侧表达式为NULL的情况下,或是表中找不到匹配项或是表中一个表达式为NULL的情况下,IN的返回值均为NULL。
IN()语构也可用书写某些类型的子查询。
请参见13.2.8.3节,“使用ANY、IN和SOME进行子查询”。
exprNOTIN(value,...)
这与NOT(exprIN(value,...))相同。
∙ISNULL(expr)
如expr为NULL,那么ISNULL()的返回值为1,否则返回值为0。
SELECTISNULL(1+1);
SELECTISNULL(1/0);
使用=的NULL值对比通常是错误的。
ISNULL()函数同ISNULL比较操作符具有一些相同的特性。
请参见有关ISNULL的说明。
INTERVAL(N,N1,N2,N3,...)
假如N<
N1,则返回值为0;
N2等等,则返回值为1;
假如N为NULL,则返回值为-1。
所有的参数均按照整数处理。
为了这个函数的正确运行,必须满足N1<
N2<
N3<
……<
Nn。
其原因是使用了二分查找(极快速)。
SELECTINTERVAL(23,1,15,17,30,44,200);
3
SELECTINTERVAL(10,1,10,100,1000);
SELECTINTERVAL(22,23,30,44,200);
LEAST(value1,value2,...)
在有两个或多个参数的情况下,返回值为最小(最小值)参数。
用一下规则将自变量进行对比:
o假如返回值被用在一个INTEGER语境中,或是所有参数均为整数值,则将其作为整数值进行比较。
o假如返回值被用在一个REAL语境中,或所有参数均为实值,则将其作为实值进行比较。
o假如任意一个参数是一个区分大小写的字符串,则将参数按照区分大小写的字符串进行比较。
o在其它情况下,将参数作为区分大小写的字符串进行比较。
假如任意一个自变量为NULL,则LEAST()的返回值为NULL。
SELECTLEAST(2,0);
SELECTLEAST(34.0,3.0,5.0,767.0);
3.0
SELECTLEAST('
注意,上面的转换规则在一些边界情形中会产生一些奇特的结果:
SELECTCAST(LEAST(3600,9223372036854775808.0)asSIGNED);
-9223372036854775808
发生这种情况的原因是MySQL在整数语境中读取9223372036854775808.0。
整数表示法不利于保存数值,因此它包括一个带符号整数。
12.1.4.
逻辑操作符
在SQL中,所有逻辑操作符的求值所得结果均为TRUE、FALSE或NULL(UNKNOWN)。
在MySQL中,它们体现为
1(TRUE)、0(FALSE)和NULL。
其大多数都与不同的数据库SQL通用,然而一些服务器对TRUE的返回值可能是任意一个非零值。
∙NOT!
逻辑NOT。
当操作数为0时,所得值为1;
当操作数为非零值时,所得值为
0,而当操作数为NOTNULL时,所得的返回值为NULL。
SELECTNOT10;
SELECTNOT0;
SELECTNOTNULL;
SELECT!
(1+1);
->
1+1;
最后一个例子产生的结果为1,原因是表达式的计算方式和(!
1)+1相同。
∙AND&
逻辑AND。
当所有操作数均为非零值、并且不为NULL时,计算所得结果为
1,当一个或多个操作数为0时,所得结果为0,其余情况返回值为NULL。
SELECT1&
1;
0;
SELECT0&
SELECTNULL&
∙OR||
逻辑OR。
当两个操作数均为非NULL值时,如有任意一个操作数为非零值,则结果为1,否则结果为0。
当有一个操作数为NULL时,如另一个操作数为非零值,则结果为1,否则结果为NULL。
假如两个操作数均为
NULL,则所得结果为NULL。
SELECT1||1;
SELECT1||0;
SELECT0||0;
SELECT0||NULL;
SELECT1||NULL;
∙XOR
逻辑XOR。
当任意一个操作数为NULL时,返回值为NULL。
对于非
NULL的操作数,假如一个奇数操作数为非零值,则计算所得结果为
1,否则为
0。
SELECT1XOR1;
SELECT1XOR0;
SELECT1XORNULL;
SELECT1XOR1XOR1;
aXORb的计算等同于
(aAND(NOTb))OR((NOTa)和b)。
同样见12.1.1节,“操作符优先级”。
12.2.
控制流程函数
∙CASEvalueWHEN[compare-value]THENresult[WHEN[compare-value]THENresult...][ELSEresult]ENDCASEWHEN[condition]THENresult[WHEN[condition]THENresult...][ELSEresult]END
在第一个方案的返回结果中,value=compare-value。
而第二个方案的返回结果是第一种情况的真实结果。
如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE部分,则返回值为NULL。
SELECTCASE1WHEN1THEN'
one'
WHEN2THEN'
two'
ELSE'
more'
END;
SELECTCASEWHEN1>
0THEN'
true'
false'
SELECTCASEBINARY'
WHEN'
THEN1WHEN'
THEN2END;
一个CASE表达式的默认返回值类型是任何返回值的相容集合类型,但具体情况视其所在语境而定。
如果用在字符串语境中,则返回结果味字符串。
如果用在数字语境中,则返回结果为十进制值、实值或整数值。
∙IF(expr1,expr2,expr3)
如果expr1是TRUE(expr1<
0andexpr1<
NULL),则IF()的返回值为expr2;
否则返回值则为expr3。
IF()的返回值为数字值或字符串值,具体情况视其所在语境而定。
SELECTIF(1>
2,2,3);
SELECTIF(1<
2,'
yes'
no'
yes'
SELECTIF(STRCMP('
test'
test1'
),'
如果expr2或expr3中只有一个明确是NULL,则IF()函数的结果类型为非NULL表达式的结果类型。
expr1作为一个整数值进行计算,就是说,假如你正在验证浮点值或字符串值,
那么应该使用比较运算进行检验。
SELECTIF(0.1,1,0);
SELECTIF(0.1<
0,1,0);
在所示的第一个例子中,IF(0.1)的返回值为0,原因是0.1被转化为整数值,从而引起一个对IF(0)的检验。
这或许不是你想要的情况。
在第二个例子中,比较检验了原始浮点值,目的是为了了解是否其为非零值。
比较结果使用整数。
IF()(这一点在其被储存到临时表时很重要)的默认返回值类型按照以下方式计算:
表达式
返回值
expr2或expr3返回值为一个字符串。
字