您好,欢迎访问一九零五行业门户网

MySQL基础教程5 — 操作符

1. 操作符优先级以下列表显示了操作符优先级的由低到高的顺序。排列在同一行的操作符具有相同的优先级。
:=
||, or, xor
&&, and
not
between, case, when, then, else
=, 96b4fef55684b9312718d5de63fb7121, >=, >, 59ed3ba4284a0a81c059290362cbdd58, !=, is, like, regexp, in
|
&
071af19a55f4da1989e8c02b755ba052>
-, +
*, /, p, %, mod
^
- (一元减号), ~ (一元比特反转)
!
binary, collate
注释:假如 high_not_precedence sql 模式被激活,则 not 的优先级同 the  ! 操作符相同。
2. 圆括号( ... )使用括弧来规定表达式的运算顺序,例如:
mysql> select 1+2*3; -> 7 mysql> select (1+2)*3; -> 9
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字符串。
在其它情况下,参数作为浮点数进行比较。
在默认状态下,字符串比较不区分大小写,并使用现有字符集(默认为cp1252 latin1,同时对英语也适合)。
为了进行比较,可使用cast()函数将某个值转为另外一种类型。 使用convert()将字符串值转为不同的字符集。
以下例子说明了比较运算中将字符串转为数字的过程:
mysql> select 1 > '6x'; -> 0 mysql> select 7 > '6x'; -> 1 mysql> select 0 > 'x6'; -> 0 mysql> select 0 = 'x6'; -> 1
注意,在将一个字符串列同一个数字进行比较时, mysql 不能使用列中的索引进行快速查找。假如str_col 是一个编入索引的字符串列,则在以下语句中,索引不能执行查找功能:
select * from tbl_name where str_col=1;
其原因是许多不同的字符串都可被转换为数值 1: '1'、 ' 1'、 '1a'、 ……
=
等于:
mysql> select 1 = 0; -> 0 mysql> select '0' = 0; -> 1 mysql> select '0.0' = 0; -> 1 mysql> select '0.01' = 0; -> 0 mysql> select '.01' = 0.01; -> 1
<=>
null-safe equal.这个操作符和=操作符执行相同的比较操作,不过在两个操作码均为null时,其所得值为1而不为null,而当一个操作码为null时,其所得值为0而不为null。
mysql> select 1 <=> 1, null <=> null, 1 <=> null; -> 1, 1, 0 mysql> select 1 = 1, null = null, 1 = null; -> 1, null, null
<> !=
不等于:
mysql> select '.01' <> '0.01'; -> 1 mysql> select .01 <> '0.01'; -> 0 mysql> select 'zapp' <> 'zappp'; -> 1
<=
小于或等于:
mysql> select 0.1 <= 2; -> 1
<
小于:
mysql> select 2 < 2; -> 0
>=
大于或等于:
mysql> select 2 >= 2; -> 1
>
大于:
mysql> select 2 > 2; -> 0
is boolean_value is not boolean_value
根据一个布尔值来检验一个值,在这里,布尔值可以是true、false或unknown。
mysql> select 1 is true, 0 is false, null is unknown; -> 1, 1, 1 mysql> select 1 is not unknown, 0 is not unknown, null is not unknown; -> 1, 1, 0
is null is not null
检验一个值是否为 null。
mysql> select 1 is null, 0 is null, null is null; -> 0, 0, 1 mysql> select 1 is not null, 0 is not null, null is not null; -> 1, 1, 0
为了能够顺利的使用odbc 程序工作,在使用is null时,mysql支持一下额外特性:
在一个值产生后,立即运行一个以下格式的语句,从而找到最新auto_increment 值的所在行:
o select * from tbl_name where auto_col is null
当设置sql_auto_is_null=0时,这项操作无法运行。
对于命名为not null 的date 和datetime列,可通过使用如下的 语句找到特定日期 '0000-00-00':
o select * from tbl_name where date_column is null
运行这一步需要使用一些 odbc 应用软件,因为 odbc本身不支持 一个 '0000-00-00'的时间值。
expr between min and max
假如expr大于或等于 min 且expr 小于或等于max, 则between 的返回值为1,或是0。若所有参数都是同一类型,则上述关系相当于表达式 (min <= expr and expr <= max)。其它类型的转换根据本章开篇所述规律进行,且适用于3种参数中任意一种。
mysql> select 1 between 2 and 3; -> 0 mysql> select 'b' between 'a' and 'c'; -> 1 mysql> select 2 between 2 and '3'; -> 1 mysql> select 2 between 2 and 'x-3'; -> 0
expr not between min and max
这相当于not(expr between min and max)。
· coalesce(value,...)
返回值为列表当中的第一个非 null值,在没有非null 值得情况下返回值为 null 。
mysql> select coalesce(null,1); -> 1 mysql> select coalesce(null,null,null); -> null · greatest(value1,value2,...)
当有2或多个参数时,返回值为最大(最大值的)参数。比较参数所依据的规律同least()相同。
mysql> select greatest(2,0); -> 2 mysql> select greatest(34.0,3.0,5.0,767.0); -> 767.0 mysql> select greatest('b','a','c'); -> 'c'
在没有自变量为null的情况下,greatest()的返回值为null。
· expr in (value,...)
若expr 为in列表中的任意一个值,则其返回值为 1 , 否则返回值为0。假如所有的值都是常数,则其计算和分类根据 expr 的类型进行。这时,使用二分搜索来搜索信息。如in值列表全部由常数组成,则意味着in 的速度非常之快。如expr 是一个区分大小写的字符串表达式,则字符串比较也按照区分大小写的方式进行。
mysql> select 2 in (0,3,5,'wefwf'); -> 0 mysql> select 'wefwf' in (0,3,5,'wefwf'); -> 1
in 列表中所列值的个数仅受限于 max_allowed_packet 值。
为了同sql 标准相一致,在左侧表达式为null的情况下,或是表中找不到匹配项或是表中一个表达式为null 的情况下,in的返回值均为null。
in() 语构也可用书写某些类型的子查询。
· expr not in (value,...)
这与not (expr in (value,...))相同。
isnull(expr)
如expr 为null,那么isnull() 的返回值为 1,否则返回值为 0。
mysql> select isnull(1+1); -> 0 mysql> select isnull(1/0); -> 1
使用= 的null 值对比通常是错误的。
isnull() 函数同 is null比较操作符具有一些相同的特性。请参见有关is null 的说明。
· interval(n,n1,n2,n3,...)
假如n < n1,则返回值为0;假如n < n2 等等,则返回值为1;假如n 为null,则返回值为 -1 。所有的参数均按照整数处理。为了这个函数的正确运行,必须满足 n1 < n2 < n3 < ……< nn 。其原因是使用了二分查找(极快速)。
mysql> select interval(23, 1, 15, 17, 30, 44, 200); -> 3 mysql> select interval(10, 1, 10, 100, 1000); -> 2 mysql> select interval(22, 23, 30, 44, 200); -> 0 · least(value1,value2,...)
在有两个或多个参数的情况下, 返回值为最小 (最小值) 参数。用一下规则将自变量进行对比:
假如返回值被用在一个 integer 语境中,或是所有参数均为整数值,则将其作为整数值进行比较。
假如返回值被用在一个 real语境中,或所有参数均为实值,则 将其作为实值进行比较。
假如任意一个参数是一个区分大小写的字符串,则将参数按照区分大小写的字符串进行比较。
在其它情况下,将参数作为区分大小写的字符串进行比较。
假如任意一个自变量为null,则 least()的返回值为null 。
mysql> select least(2,0); -> 0 mysql> select least(34.0,3.0,5.0,767.0); -> 3.0 mysql> select least('b','a','c'); -> 'a'
注意,上面的转换规则在一些边界情形中会产生一些奇特的结果:
mysql> select cast(least(3600, 9223372036854775808.0) as signed); -> -9223372036854775808
发生这种情况的原因是mysql在整数语境中读取9223372036854775808.0。整数表示法不利于保存数值,因此它包括一个带符号整数。
4. 逻辑操作符在sql中,所有逻辑 操作符的求值所得结果均为 true、false或 null (unknown)。在 mysql中,它们体现为 1 (true)、 0 (false)和 null。其大多数都与不同的数据库sql通用,然而一些服务器对true的返回值可能是任意一个非零值。
not !
逻辑 not。当操作数为0 时,所得值为 1 ;当操作数为非零值时,所得值为 0 ,而当操作数为not null时,所得的返回值为 null。
mysql> select not 10; -> 0 mysql> select not 0; -> 1 mysql> select not null; -> null mysql> select ! (1+1); -> 0 mysql> select ! 1+1; -> 1
最后一个例子产生的结果为 1,原因是表达式的计算方式和(!1)+1相同。
and &&
逻辑and。当所有操作数均为非零值、并且不为null时,计算所得结果为 1 ,当一个或多个操作数为0 时,所得结果为0 ,其余情况返回值为 null 。
mysql> select 1 && 1; -> 1 mysql> select 1 && 0; -> 0 mysql> select 1 && null; -> null mysql> select 0 && null; -> 0 mysql> select null && 0; -> 0
or ||
逻辑 or。当两个操作数均为非 null值时,如有任意一个操作数为非零值,则结果为1,否则结果为0。当有一个操作数为null时,如另一个操作数为非零值,则结果为1,否则结果为 null 。假如两个操作数均为 null,则所得结果为null。
mysql> select 1 || 1; -> 1 mysql> select 1 || 0; -> 1 mysql> select 0 || 0; -> 0 mysql> select 0 || null; -> null mysql> select 1 || null; -> 1
xor
逻辑xor。当任意一个操作数为 null时,返回值为null。对于非 null 的操作数,假如一个奇数操作数为非零值,则计算所得结果为 1 ,否则为 0 。
mysql> select 1 xor 1; -> 0 mysql> select 1 xor 0; -> 1 mysql> select 1 xor null; -> null mysql> select 1 xor 1 xor 1; -> 1
a xor b 的计算等同于  (a and (not b)) or ((not a)和 b)。
以上就是mysql基础教程5 —— 操作符的内容。
其它类似信息

推荐信息