目录
2.8 IS NULL(ISNULL)和IS NOT NULL运算符
运算符连接表达式中的各个操作数,起作用是用来对操作数所进行的运算。常见的运算符类型有算术运算符、比较运算符、逻辑运算符和位运算符。
一、算术运算符
运算符 | 作用 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算,返回商 |
% | 求余运算,返回余数 |
在数学运算中,除数为0的除法是没有意义的,因此除法运算中的除数不能为0,如果被0除,则返回结果NULL。
二、比较运算符
一个比较运算符的结果总是1、0或者是NULL。
运算符 | 作用 |
---|---|
= | 等于 |
<=> | 安全等于 |
<>(!=) | 不等于 |
<= | 小于等于 |
>= | 大于等于 |
> | 大于 |
IS NULL | 判断一个值是否为NULL |
IS NOT NULL | 判断一个值是否不为NULL |
LEAST | 在有两个或多个参数时,返回最小值 |
GREATEST | 当有两个或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
ISNULL | 与IS NULL作用相同 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
2.1 等于运算符(=)
等于(=)用来判断数字、字符串和表达式是否相等;如果相等,返回值为1;否则返回值为0。
数值比较时有如下规则:
(1)若有一个或两个参数为NULL,则比较运算的结果为NULL。
(2)若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。
(3)若两个参数均为整数,则按照整数进行比较。
(4)若用字符串和数字进行相等比较,则MySQL可以自动将字符串转换为数字。
2.2 安全等于运算符(<=>)
这个操作符和=操作符执行相同的比较操作,不过<=>可以用来判断NULL值。在两个操作数均为NULL时,其返回值为1,而不为NULL;当一个操作数为NULL时,其返回值为0,而不为NULL。
2.3 不等于运算符(<>或者!=)
'<>'或者'!='用于判断数字、字符串、表达式不相等的判断:如果不相等,返回值为1;否则返回值为0。这两个运算符不能用于判断空值NULL。
2.4 小于等于运算符(<=)
'<='用来判断左边的操作数是否小于等于右边的操作数:如果小于等于,则返回值为1,否则返回值为0。'<='不能用于判断空值NULL。
比较NULL时返回NULL。
2.5 小于运算符(<)
'<'运算符用来判断左边的操作数是否小于右边的操作数:如果小于,返回值为1,否则返回值为0。'<'不能用于判断空值NULL。
同样比较NULL时返回NULL。
2.6 大于等于运算符(>=)
'>='运算符用来判断左边的操作数是否大于等于右边的操作数:如果大于等于,则返回值为1,否则返回值为0。'>='不能用于判断空值NULL。
同样比较NULL时返回NULL。
2.7 大于运算符(>)
'>'运算符用来判断左边的操作数是否大于右边的操作数:如果大于,返回值为1;否则返回值为0。'>'不能用于判断空值NULL。
同样比较NULL值时返回NULL。
2.8 IS NULL(ISNULL)和IS NOT NULL运算符
IS NULL和ISNULL检验一个值是否为NULL:如果为NULL,返回值为1;否则返回值为0。IS NOT NULL检验一个值是否为非NULL:如果是非NULL,返回值为1,否则返回值为0。
2.9 BETWEEN AND运算符
语法格式为:expr BETWEEN min AND max。假如expr大于等于min且小于等于max,则BETWEEN的返回值为1,否则返回值为0。
2.10 LEAST运算符
语法格式:LEAST(值1,值2,...,值n)。其中,“值n”表示参数列表中有n个值。在有两个或多个参数的情况下,返回最小值。假如任意一个自变量为NULL,则LEAST()的返回值为NULL。
2.11 GREATEST运算符
语法格式为:GREATEST(值1,值2,...,值n)。其中,n表示参数列表有n个值。在有两个或多个参数的情况下,返回最大值。假如任意一个自变量为NULL,则GREATEST()的返回值为NULL。
2.12 IN、NOT IN运算符
IN运算符用来判断操作数是否为IN列表中的其中一个值:如果是,返回值为1;否则返回值为0。
NOT IN 运算符用来判断表达式是否为IN列表的其中一个值:如果不是,返回值为1;否则返回值为0。
在左侧表达式为NULL的情况下,或是表中找不到匹配项并且表中一个表达式为NULL的情况下,IN的返回值均为NULL。
2.13 LIKE运算符
LINK运算符用来匹配字符串,语法格式为:expr LIKE 匹配条件。如果expr满足匹配条件,则返回值为1(TRUE);如果不匹配,则返回值为0(FALSE)。expr或匹配条件中任何一个为NULL,则结果为NULL。
LIKE运算符在进行匹配时,可以使用下面的两种通配符:
(1)'%',匹配任何数目的字符,甚至包括零字符。
(2)'_',只能匹配一个字符。
2.14 REGEXP运算符
REGEXP运算符用来匹配字符串,语法格式为:expr REGEXP 匹配条件。如果expr满足匹配条件,则返回值为1;如果不匹配,则返回值为0。expr或匹配条件中任意一个为NULL,则结果为NULL。
REGEXP运算符在进行匹配时,常用的有下面几种通配符:
(1)'^',匹配以该字符后面的字符开头的字符串。(^s)
(2)'$',匹配以该字符后面的字符结尾的字符串。(y$)
(3)'.',匹配任何一个单字符。
(4)'[...]',匹配在方括号内的任何字符。例如,“[abc]”匹配“a” “b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
(5)'*',匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的’x‘字符,“[0-9]*”匹配任何数量的数字,而“*”匹配任何数量的任何字符。
三、逻辑运算符
在SQL中,所有逻辑运算符的求值所得的结果均为TRUE、FALSE或NULL。在MySQL中,它们体现为1(TRUE)、0(FALSE)和NULL。逻辑运算符大多数与不同的数据库SQL通用。
运算符 | 作用 |
---|---|
NOT 或者 ! | 逻辑非 |
AND 或者 && | 逻辑与 |
OR 或者 || | 逻辑或 |
XOR | 逻辑异或 |
3.1 NOT 或者 !
逻辑非运算符NOT或者!表示当操作数为0时,所得值为1;当操作数为非零值时,所得值为0;当操作数为NULL时,所得返回值为NULL。
“NOT 1+1”返回0;“! 1+1”返回1。原因是:“NOT”与“!”的优先级不同。“NOT”的优先级低于“+”,而“!”的优先级要高于“+”运算。
3.2 AND 或者 &&
逻辑与运算符AND或者&&表示当所有操作数均为非零值并且不为NULL时,计算所得结果为1;当一个或多个操作数为0时,所得结果为0;其余情况返回NULL。
“AND”运算符可以有多个操作数,需要注意的是:多个操作数运算时,AND两边一定要使用空格隔开,不然会影响结果的正确性。
3.3 OR 或者 ||
逻辑或运算符OR或者||表示两个操作数均为非NULL值且任意一个操作数为非零值时,结果为1,否则结果为0;当有一个操作数为NULL,且另一个操作数为非零值时,结果为1,否则结果为NULL;当两个操作数均为NULL时,则所得的结果为NULL。
3.4 XOR
逻辑异或运算符XOR表示当任意一个操作数为NULL时,返回值为NULL;对于非NULL的操作数,如果两个操作数都是非0值或者都是0值,则返回结果为0;如果一个为0值、另一个为非0值,返回结果为1。
a XOR b 的计算等同于 (a AND (NOT b)) 或者 ((NOT a) AND b)。
四、位运算符
位运算符是在二进制数上进行计算的运算符。位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。MySQL中提供的位运算符有按位或(|)、按位与(&)、按位异或(^)、按位左移(<<)、按位右移(>>)和按位取反(~)。
运算符 | 作用 |
---|---|
| | 位或 |
& | 位与 |
^ | 位异或 |
<< | 位左移 |
>> | 位右移 |
~ | 位取反,反转所有比特 |
4.1 位或运算符(|)
位或运算的实质是将参与运算的几个数据按照对应的二进制数逐位进行逻辑或运算。对饮的二进制位有一个或两个为1则该位的运算结果为1,否则为0。
10的二进制数值为1010,15的二进制数值为1111,按位或运算之后,结果为1111,即整数15;9的二进制数值为1001,4的二进制数值为0100,2的二进制数值为0010,按位或运算之后结果为1111,即整数15。其结果为一个64为无符号整数。
4.2 位与运算符(&)
位与运算的实质是将参与运算的几个操作数按照对应的二进制数逐位进行逻辑与运算。对应的二进制位都为1,则该位的运算结果位1,否则位0。
10的二进制数值为1010,15的二进制数值为1111,按位与运算之后,结果为1010,即生疏10;9的二进制数值位1001,4的二进制数值为0100,2的二进制数值为0010,按位与运算之后,结果为0000,即整数0。其结果一个64为无符号整数。
4.3 位异或运算符(^)
位异或运算的实质是将参与运算的两个数据按照对应的二进制数逐位进行逻辑异或运算。对应位的二进制数不同时,对应位的结果才为1.如果两个对应位数都为0或者1,则对应位的结果为0。
10的二进制数值为1010,15的二进制数值为1111,按位异或运算之后,结果为0101,即整数5;1的二进制数值为0001,0的二进制数值为0000,按位异或运算之后,结果为0001;1和1本身的二进制位完全相同,因此结果为0。
4.4 位左移运算符(<<)
位左移运算符<<使指定的二进制值的所有位都左移指定的位数。左移指定位数之后,左边高位的数值被移出并丢弃,右边低位空出的位置用0补齐。语法格式为:expr<<n。其中,n指定值expr要移位的位数。
1的二进制值为000000001,左移两位之后变成00000100,即十进制整数4;十进制4左移两位之后变成00010000,即变成十进制的16。
4.5 位右移运算符(>>)
位右移运算符>>指定的二进制值的所有位都右移指定的位数。右移指定位数之后,右边低位的数值将被丢弃,左边高位空出的位置用0补齐。语法格式为:expr>>n。其中,n指定expr要移位的位数。
1的二进制数值为00000001,右移1为之后变成00000000,即十进制整数0;16的二进制数值为00010000右移两位之后变成00000100,即变成十进制的4。
4.6 位取反运算符(~)
位取反运算的实质是将参与运算的数据按照对应的二进制数逐位反转,即1取反后变为0、0取反后变为1。
在逻辑运算 5&~1 中,由于位取反运算符’~‘的级别高于位与运算符’&‘,因此先对1进行取反操作,取反之后,除了最低位为0外其他位都为1,即1110,然后与十进制数值5进行与运算,结果为0100。
MySQL经过位运算之后的数值是一个64位的无符号整数,1的二进制数值表示为最右边位为1,其他位均为0,取反操作之后,除了最低位为0外,其他位均变为1。
五、运算符的优先级
优先级 | 运算符 |
---|---|
最低 | =(赋值运算),:= |
||,OR | |
XOR | |
&&,AND | |
NOT | |
BETWEEN,CASE,WHEN,THEN,ELSE | |
=(比较运算),<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN | |
| | |
& | |
<<,>> | |
-,+ | |
*,/(DIV),%(MOD) | |
^ | |
-(负号),~(位反转) | |
最高 | ! |