运算符是告诉MySQL执行特殊算术或逻辑操作的符号,主要用于在SQL语句的WHERE子句来执行,比较和算术运算等操作。运算符用于指定一个SQL语句中的条件,并作为连词多个条件在一份声明中。MySQL的内部运算符很丰富,主要有四大类:算术运算符、比较运算符、逻辑运算符、位操作运算符。
一、算术运算符
运算符 | 作用 |
---|---|
+ | 加法运算 |
– | 减法运算 |
* | 乘法运算 |
/ | 除法运算,返回商 |
% | 求余运算,返回余数 |
示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
mysql> select 10+20*2; +---------+ | 10+20*2 | +---------+ | 50 | +---------+ 1 row in set (0.00 sec) mysql> select 10 % 3; +--------+ | 10 % 3 | +--------+ | 1 | +--------+ 1 row in set (0.00 sec) |
二、比较操作符
一个比较运算符的结果总是1、0或者是NULL。比较运算符经常在SELECT的查询条件字句中使用,用来查询满足指定条件的记录。MySQL中比较运算符如表所示:
运算符 | 作用 |
---|---|
== | 等于 |
<=> | 安全的等于 |
<>(!=) | 不等于 |
<= | 小于等于 |
>= | 大于等于 |
> | 大于 |
IS NULL | 判断一个值是否为NULL |
IS NOT NULL | 判断一个值是否不为NULL |
LEAST | 在有两个或多个参数时,返回最小值 |
GREATEST | 当有2或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
ISNULL | 与IS NULL作用相同 |
IN | 判断一个值是否落在两个值之间 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
- =
运算符”=”用来判断数字、字符串和表达式是否相等。如果相等,返回值为1,否则返回值为0。但当两个参数至少有一个是NULL时,比较的结果也是NULL;另外是使用<=>(安全的等于)对两个NULL做比较时会返回1。
1 2 3 4 5 6 7 |
mysql> select 1=0, '2'=2, 2=2, NULL=NULL; +-----+-------+-----+-----------+ | 1=0 | '2'=2 | 2=2 | NULL=NULL | +-----+-------+-----+-----------+ | 0 | 1 | 1 | NULL | +-----+-------+-----+-----------+ 1 row in set (0.00 sec) |
- <=>
安全等于运算符‘<=>’,这个操作符与“=”操作符执行相同的比较操作,不过<=>可以用来判断NULL值,在两个操作数均为NULL时,其返回值为1而不为NULL,而当一个操作数为NULL时,其返回值为0而不为NULL。
1 2 3 4 5 6 7 |
mysql> select 1<=>0, '2'<=>2, NULL<=>NULL; +-------+---------+-------------+ | 1<=>0 | '2'<=>2 | NULL<=>NULL | +-------+---------+-------------+ | 0 | 1 | 1 | +-------+---------+-------------+ 1 row in set (0.00 sec) |
- <>或者!=
不等于运算符‘<>’或者’!=’用于判断数字、字符串、表达式不相等的判断。如果不相等,返回值为1;否则返回值为0。这两个运算符不能用于判断空值NULL。
1 2 3 4 5 6 7 |
mysql> select 'good'<>'good', 1<>2, 4!=5, 5.5!=5, (1+3)!=(2+1), NULL<>NULL; +----------------+------+------+--------+--------------+------------+ | 'good'<>'good' | 1<>2 | 4!=5 | 5.5!=5 | (1+3)!=(2+1) | NULL<>NULL | +----------------+------+------+--------+--------------+------------+ | 0 | 1 | 1 | 1 | 1 | NULL | +----------------+------+------+--------+--------------+------------+ 1 row in set (0.01 sec) |
- <=
小于或等于元素符‘<=’用来判断左边的操作数是否小于或者等于右边的操作数。如果小于或者等于,返回值为1,否则返回值为0,’<=’不能用于判断空值NULL。
1 2 3 4 5 6 7 |
mysql> select 'good'<>'good', 1<=2, NULL<=NULL; +----------------+------+------------+ | 'good'<>'good' | 1<=2 | NULL<=NULL | +----------------+------+------------+ | 0 | 1 | NULL | +----------------+------+------------+ 1 row in set (0.01 sec) |
- <
小于运算符‘<’运算符用来判断左边的操作数是否小于右边的操作数,如果小于,返回值为1,否则返回值为0.’<’不能用于判断空值NULL。
1 2 3 4 5 6 7 |
mysql> select 'good'<>'good', 1<2, NULL<NULL; +----------------+-----+-----------+ | 'good'<>'good' | 1<2 | NULL<NULL | +----------------+-----+-----------+ | 0 | 1 | NULL | +----------------+-----+-----------+ 1 row in set (0.00 sec) |
- >=
大于或等于运算符‘>=’运算符用来判断左边的操作数是否大于或者等于右边的操作数,如果大于或者等于,返回值为1;否则返回值为0。’>=’不能用于判断空值NULL。
1 2 3 4 5 6 7 |
mysql> select 'good'>='good', 100>=2, NULL>=NULL; +----------------+--------+------------+ | 'good'>='good' | 100>=2 | NULL>=NULL | +----------------+--------+------------+ | 1 | 1 | NULL | +----------------+--------+------------+ 1 row in set (0.00 sec) |
- >
大于运算符‘>’运算符用来判断左边的操作数是否大于右边的操作数,如果大于,返回值1;否则返回值为0。’>’进行比较判断,该运算符不能用于空值判断。
1 2 3 4 5 6 7 |
mysql> select 'good'>'good', 100>2, NULL>NULL; +---------------+-------+-----------+ | 'good'>'good' | 100>2 | NULL>NULL | +---------------+-------+-----------+ | 0 | 1 | NULL | +---------------+-------+-----------+ 1 row in set (0.00 sec) |
- IS NULL(ISNULL),IS NOT NULL
IS NULL和ISNULL检验一个值是否为NULL,如果为NULL,返回值为1,否则返回值为0。IS NOT NULL检验一个值是否为非NULL,如果非NULL,返回值为1;否则返回值为0。
1 2 3 4 5 6 7 |
mysql> select NULL IS NULL, ISNULL(NULL), ISNULL(10), 10 IS NOT NULL; +--------------+--------------+------------+----------------+ | NULL IS NULL | ISNULL(NULL) | ISNULL(10) | 10 IS NOT NULL | +--------------+--------------+------------+----------------+ | 1 | 1 | 0 | 1 | +--------------+--------------+------------+----------------+ 1 row in set (0.00 sec) |
- BETWEEN AND
语法格式为:expr BETWEEN min AND max。假如expr大于或等于min且小于或等于max,则BETWEEN的返回值为1,否则返回值为0。
1 2 3 4 5 6 7 |
mysql> select 4 BETWEEN 4 AND 6, 4 AND 6, 12 BETWEEN 9 AND 10; +-------------------+---------+---------------------+ | 4 BETWEEN 4 AND 6 | 4 AND 6 | 12 BETWEEN 9 AND 10 | +-------------------+---------+---------------------+ | 1 | 1 | 0 | +-------------------+---------+---------------------+ 1 row in set (0.01 sec) |
- LEAST
语法格式为:LEAST(值1,值2,…值n),其中值n表示参数列表中有n个值。在有两个或多个参数的情况下,返回最小值。假如任意一个自变量为NULL,则LEAST()的返回值为NULL。
1 2 3 4 5 6 7 |
mysql> select least(2,0), least(20.0,3.0,100.5), least(10,NULL); +------------+-----------------------+----------------+ | least(2,0) | least(20.0,3.0,100.5) | least(10,NULL) | +------------+-----------------------+----------------+ | 0 | 3.0 | NULL | +------------+-----------------------+----------------+ 1 row in set (0.01 sec) |
- GREATEST
语法格式为:GREATEST(值1,值2,…值n),其中n表示参数列表中有n个值。当有2个或多个参数时,返回值为最大值,假如任意一个自然变量为NULL,则GREATEST()的返回值为NULL。
1 2 3 4 5 6 7 |
mysql> select greatest(2,0), greatest(20.0,3.0,100.5), greatest(10,NULL); +---------------+--------------------------+-------------------+ | greatest(2,0) | greatest(20.0,3.0,100.5) | greatest(10,NULL) | +---------------+--------------------------+-------------------+ | 2 | 100.5 | NULL | +---------------+--------------------------+-------------------+ 1 row in set (0.00 sec) |
- IN,NOT IN
IN运算符用来判断操作数是否为IN列表中的其中一个值,如果是,返回值为1;否则返回值为0。
1 2 3 4 5 6 7 |
mysql> select 2 IN(1,3,5,'thks'), 'thks' IN(1,3,5,'thks'); +--------------------+-------------------------+ | 2 IN(1,3,5,'thks') | 'thks' IN(1,3,5,'thks') | +--------------------+-------------------------+ | 0 | 1 | +--------------------+-------------------------+ 1 row in set, 2 warnings (0.00 sec) |
- LIKE
LIKE运算符用来匹配字符串,语法格式为:expr LIKE 匹配条件,如果expr满足匹配条件,则返回值为1(TRUE);如果不匹配,则返回值为0(FALSE)。若expr或匹配条件中任何一个为NULL,则结果为NULL。
LIKE运算符在进行匹配时,可以使用下面两种通配符:
‘%’,匹配任何数目的字符,甚至包括0字符。
‘_’,只能匹配一个字符。
1 2 3 4 5 6 7 |
mysql> select 'stud' LIKE 'stud', 'stud' LIKE 'stu_', 'stud' LIKE '%d', 'stud' LIKE 't___', 's' LIKE NULL; +--------------------+--------------------+------------------+--------------------+---------------+ | 'stud' LIKE 'stud' | 'stud' LIKE 'stu_' | 'stud' LIKE '%d' | 'stud' LIKE 't___' | 's' LIKE NULL | +--------------------+--------------------+------------------+--------------------+---------------+ | 1 | 1 | 1 | 0 | NULL | +--------------------+--------------------+------------------+--------------------+---------------+ 1 row in set (0.00 sec) |
- REGEXP
REGEXP运算符用来匹配字符串,语法格式为:expr REGEXP 匹配条件,如果expr满足匹配条件,返回1;如果不满足,则返回0;若expr或匹配条件任意一个为NULL,则结果为NULL。
REGEXP运算符在进行匹配时,常用的有下面几种通配符:
‘^’匹配以该字符后面的字符开头的字符串。
‘$’匹配以该字符后面的字符结尾的字符串。
‘.’匹配任何一个单字符。
‘[…]’匹配在方括号内的任何字符。例如,”[abc]”匹配”a”、”b”或”c”。为了命名字符串的范围,使用一个’-‘。”[a-z]”匹配任何字母,而”[0-9]”匹配任何数字。
‘*’匹配0个或多个在它前面的字符。
1 2 3 4 5 6 7 |
mysql> select 'ssky' REGEXP '^s', 'ssky' REGEXP 'y$', 'ssky' REGEXP '.sky', 'ssky' REGEXP '[ab]'; +--------------------+--------------------+----------------------+----------------------+ | 'ssky' REGEXP '^s' | 'ssky' REGEXP 'y$' | 'ssky' REGEXP '.sky' | 'ssky' REGEXP '[ab]' | +--------------------+--------------------+----------------------+----------------------+ | 1 | 1 | 1 | 0 | +--------------------+--------------------+----------------------+----------------------+ 1 row in set (0.00 sec) |
三、逻辑运算符
在SQL中,所有逻辑运算符的求值所得结果均为TRUE、FALSE或NULL。在MySQL中,它们体现为1(TRUE)、0(FALSE)和NULL。其大多数都与不同的数据库SQL通用,MySQL中的逻辑运算符如表所示:
运算符 | 作用 |
---|---|
NOT或者! | 逻辑非 |
AND或者&& | 逻辑与 |
OR或者|| | 逻辑或 |
XOR | 逻辑异或 |
- NOT或者!
逻辑非运算符NOT或者!表示当操作数为0时,所得值为1;当操作数为非零值时,所得值为0,当操作数为NULL时,所得的返回值为NULL。
1 2 3 4 5 6 7 |
mysql> select NOT 10, NOT(1-1), NOT -5, NOT NULL, NOT 1+1; +--------+----------+--------+----------+---------+ | NOT 10 | NOT(1-1) | NOT -5 | NOT NULL | NOT 1+1 | +--------+----------+--------+----------+---------+ | 0 | 1 | 0 | NULL | 0 | +--------+----------+--------+----------+---------+ 1 row in set (0.00 sec) |
- AND或者&&
逻辑与运算符AND或者&&表示当所有操作数均为非零值、并且不为NULL时,计算所得结果为1;当一个或多个操作数为0时,所得结果为0,其余情况返回值为NULL。
1 2 3 4 5 6 7 |
mysql> select 1 AND -1, 1 AND 0, 1 AND NULL, 0 AND NULL; +----------+---------+------------+------------+ | 1 AND -1 | 1 AND 0 | 1 AND NULL | 0 AND NULL | +----------+---------+------------+------------+ | 1 | 0 | NULL | 0 | +----------+---------+------------+------------+ 1 row in set (0.00 sec) |
- OR或者||
逻辑与运算符OR或者||表示当两个操作数均为非NULL值,且任意一个操作数为非零值时,结果为1,否则结果为0;当有一个操作数为NULL,且另一个操作数为非零值时,则结果为1,否则结果为NULL;当两个操作数均为NULL时,则所得结果为NULL。
1 2 3 4 5 6 7 |
mysql> select 1 OR-1, 1 OR 0, 1 OR NULL, 0 OR NULL; +--------+--------+-----------+-----------+ | 1 OR-1 | 1 OR 0 | 1 OR NULL | 0 OR NULL | +--------+--------+-----------+-----------+ | 1 | 1 | 1 | NULL | +--------+--------+-----------+-----------+ 1 row in set (0.00 sec) |
- XOR
逻辑异或运算符XOR。当任意一个操作数为NULL时,返回值为NULL;对于非NULL的操作数,如果两个操作数都是非0值或者都是0值,则返回结果为0;如果一个为0值,另一个为非0值,返回结果为1。
1 2 3 4 5 6 7 |
mysql> select 1 XOR 1, 0 XOR 0, 1 XOR 0, 0 XOR 0, 1 XOR NULL, 1 XOR 1; +---------+---------+---------+---------+------------+---------+ | 1 XOR 1 | 0 XOR 0 | 1 XOR 0 | 0 XOR 0 | 1 XOR NULL | 1 XOR 1 | +---------+---------+---------+---------+------------+---------+ | 0 | 0 | 1 | 0 | NULL | 0 | +---------+---------+---------+---------+------------+---------+ 1 row in set (0.00 sec) |
四、位运算符
位运算符是用来对二进制字节中的位进行测试、位移或者测试处理,MySQL中提供的位运算符有按位或(|)、按位与(&)、按位异或(^)、按位左移(<<)、按位右移(>>)、按位取反(~),如下表所示:
运算符 | 作用 |
---|---|
| | 位或 |
& | 位与 |
^ | 位异或 |
<< | 位左移 |
>> | 位右移 |
~ | 位取反,反转所有比特 |
- |
位或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑或运算。对应的二进制有一个或两个为1则该位的运算结果为1,否则为0。
1 2 3 4 5 6 7 |
mysql> select 10|15, 9|4|2; +-------+-------+ | 10|15 | 9|4|2 | +-------+-------+ | 15 | 15 | +-------+-------+ 1 row in set (0.00 sec) |
10的二进制数值为1010,15的二进制数值为1111,按位或运算之后,结果为1111,即整数15。9的二进制位1001,4的二进制为0010,按位或运算之后,结果为1111,即整数15。其结果为一个64位无符号整数。
- &
位与运算的实质是将参与运算的两个操作数,按对应的二进制数逐位进行逻辑与运算。对应的二进制都为1,则该位的运算结果为1,否则为0。
1 2 3 4 5 6 7 |
mysql> select 10&15, 9&4&2; +-------+-------+ | 10&15 | 9&4&2 | +-------+-------+ | 10 | 0 | +-------+-------+ 1 row in set (0.00 sec) |
10的二进制位1010,15的二进制位1111,按位与运算结果为1010,即整数10。9的二进制为1001,4的二进制位0100,2的二进制为0010,按位与运算之后,结果为0000,即整数0。其结果为一个64位无符号整数。
^
位异或运算的实质是将参与运算的两个数据,按对应的二进制数逐位进行逻辑异或运算。对应的二进制数不同时,对应的结果才为1。如果两个对应位数都为0或者都为1,则对应位的结果为0。
1 2 3 4 5 6 7 |
mysql> select 10^15, 1^0, 1^1; +-------+-----+-----+ | 10^15 | 1^0 | 1^1 | +-------+-----+-----+ | 5 | 1 | 0 | +-------+-----+-----+ 1 row in set (0.00 sec) |
- <<
位左移运算符<<使指定的二进制值的所有位都左移指定的位数。左移指定位数之后,左边高位的数值被移出并丢弃,右边低位空出的位置用0补齐。语法格式为:expr<。
1 2 3 4 5 6 7 |
mysql> select 1<<2, 4<<2; +------+------+ | 1<<2 | 4<<2 | +------+------+ | 4 | 16 | +------+------+ 1 row in set (0.01 sec) |
1的二进制位0000 0001,左移两位之后0000 0100,即十进制整数4;十进制4左移两位之后变成0001 0000,即变成十进制的16。
- >>
位右移运算符>>使指定的二进制的所有位都右移指定的位数。右移指定位数之后,右边低位的数值将被丢弃移除,左边高位空出的位置用0补齐。语法格式为:expr>>n。这里n指定值expr要移除的位数。
1 2 3 4 5 6 7 |
mysql> select 1>>1, 16>>2; +------+-------+ | 1>>1 | 16>>2 | +------+-------+ | 0 | 4 | +------+-------+ 1 row in set (0.00 sec) |
1的二进制位0000 0001右移1位之后变成0000 0000,即十进制整数0,16的二进制数值为0001 0000右移两位之后变成十进制的4。
- ~
位取反运算的实质是将参与运算的数据,按对应的二进制数逐位反转,即1取反后变成0,0取反变成1。
1 2 3 4 5 6 7 |
mysql> select 5&~1; +------+ | 5&~1 | +------+ | 4 | +------+ 1 row in set (0.00 sec) |
五、MySQL运算符优先级
优先级 | 运算符 |
---|---|
最低 | =(赋值运算),:= |
XOR | |
&&,AND | |
NOT | |
BETWEEN、CASE、WHEN、THEN、ELSE | |
=,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN | |
& | |
<<,>> | |
-,+ | |
*,/,%, | |
^ | |
-,~ | |
最高 | ! |
在操作符比较中,可以看到当字符和数值比较时也会为真,这是因为MySQL内部自动做了隐式转换。关于隐式转换,详细可以看这篇文章“隐式转换详解”