MySQL:运算符
MySQL和其它编程语言一样,也有自己用于数值操作的运算符(如大于、小于等)。本文介绍MySQL中常见的运算符。
基本知识
在MySQL中,主要有四种不同类别的运算符:算术运算符、比较运算符、逻辑运算符、位运算符。使用运算符的时候每一边至少需要有一个数值以进行数值操作,所以我们把运算符两边被操作的数值叫做操作数。
MySQL中的每一种运算符都有其不同的职能:
- 算术运算符:负责实现对两个操作数的加、减、乘、除、取余、取商操作。
- 比较运算符:负责实现对两个操作数的数值大小、文本内容、是否空值等属性的互相比较。
- 逻辑运算符:负责判断表达式的真(
TRUE
)假(FALSE
)。 - 位运算符:负责实现对二进制数值的运算(先将十进制数转换为二进制数)。
下面依次介绍每种运算符和运算符的优先级。
算术运算符
算术运算符负责实现对两个操作数的加、减、乘、除、取余、取商操作。
MySQL中有如下算术运算符:
运算符 | 介绍 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算 |
DIV | 除法运算,返回商 |
MOD | 取余运算 |
加法运算
在MySQL中,可以使用 +
运算符进行两个以上数值的相加操作。例如:
/* 对多个数值进行加法运算 */
SELECT 1+7; # 8
SELECT 78+14; # 92
SELECT 95+120+114+156+48; # 533
减法运算
在MySQL中,还可以使用 -
运算符对两个以上的数值进行减法运算,例如:
/* 对多个数值进行减法运算 */
SELECT 89-52; # 37
SELECT 12-14-23; # -25
SELECT (-12)-(-95)-3-5; # 75
乘法运算
在MySQL中,可以使用 *
运算符对多个数值进行乘法运算,例如:
/* 对多个数值进行乘法运算 */
SELECT 5*3; # 15
SELECT 2.4*1.58; # 3.792
SELECT (-3)*2.56 # -7.68
除法运算
在MySQL中,可以使用 /
运算符对多个数值进行除法运算,保留小数。
/* 对多个数值进行除法运算 */
SELECT 3/5; # 0.6000
SELECT 96/3/2; # 16.00000000
SELECT (-35)/5; # -7.00000
求商、求余运算
在MySQL中,可以使用DIV
运算符进行求商运算,使用MOD
运算符进行求余运算。
/* 对多个数值进行求商、求余运算 */
SELECT 5 DIV 3; # 1
SELECT 20 MOD 9; # 2
SELECT 36 DIV 5 MOD 2 # 1
比较运算符
在MySQL中,比较运算符负责实现对两个操作数的数值大小、文本内容、是否空值等属性的互相比较,最常用的有
>
、<
、=
、!=
等众多运算符。
下面列出MySQL中常用的比较运算符:
运算符 | 用途 | 描述 |
---|---|---|
> | 数值大小比较 | 是否大于 |
< | 数值大小比较 | 是否小于 |
= | 数值大小比较 | 是否等于 |
!= | 数值大小比较 | 是否不等于 |
>= | 数值大小比较 | 是否大于等于 |
<= | 数值大小比较 | 是否小于等于 |
BETWEEN AND | 数值大小比较 | 是否在两个数值之间 |
IS NULL | 空值判断 | 字段是否为空 |
IS NOT NULL | 空值判断 | 字段是否不为空 |
IN | 数组判断 | 字段值是否在数组中 |
NOT IN | 数组判断 | 字段值是否不在数组中 |
LIKE | 文本模式(正则)匹配 | 字段值是否符合指定模式 |
NOT LIKE | 文本模式(正则)匹配 | 字段值是否不符合指定模式 |
REGEXP | 文本模式(正则)匹配 | 字段值是否符合指定正则式 |
注:如果表达式为真,则返回1;否则返回0。
数值大小比较
在MySQL中,最常用的比较运算符就是用于比较数值大小的各种“数学符号”。下面介绍用于数值大小比较的运算符的使用方法:
/* 比较运算符 - 数值大小比较 */
SELECT 5>3; # 真
SELECT 12<6; # 假
SELECT 1=1; # 真
SELECT 8!=8; # 假
SELECT 7<=1; # 假
SELECT 8>=6; # 真
SELECT 23 BETWEEN 10 AND 65; # 真
# 将结果合并到一行
SELECT 5>3,12<6,1=1,8!=8,7<=1,8>=6,23 BETWEEN 10 AND 65;
空值判断
在MySQL中,还可以通过 IS NULL
运算符来判断字段值是否为空值;如果要判断字段值是否不为空值,只需要使用 IS NOT NULL
运算符即可。
下面演示使用该运算符查询出region_dirtbl
表中regionDir
字段为NULL的记录:
/* 比较运算符 - 空值判断 */
SELECT * FROM `region_dirtbl` WHERE regionDir IS NULL; # 查询出表region_dirtbl中regionDir字段为空值的记录
SELECT * FROM `region_dirtbl` WHERE regionDir IS NOT NULL; # 查询出表region_dirtbl中regionDir字段为非空值的记录
由于表中记录较多,查询非空值记录时加上了LIMIT
子句,用于限制展示的行数为10行。
特别注意:不能使用
=
号来指定查找NULL值!(那样会查找字符串'NULL'
)
数组判断
在MySQL中,使用运算符IN
可以判断字段值是否在用户指定的数组中,如果想查询字段值不在数组中的记录,只需要使用NOT IN
运算符即可。
下面用一个小例子介绍IN
运算符的使用:
查询
army_region
表,查出一级地址为珉林、璃沙郊、碧水原的记录和相反条件的记录。
根据题目要求,条件可以这样写:
WHERE region_L1 IN ('珉林','璃沙郊','碧水原');
WHERE region_L1 NOT IN ('珉林','璃沙郊','碧水原');
/* 比较运算符 - 数组判断 */
SELECT * FROM `army_region` WHERE region_L1 IN ('珉林','璃沙郊','碧水原');
SELECT * FROM `army_region` WHERE region_L1 NOT IN ('珉林','璃沙郊','碧水原');
第一小题结果:
第二小题结果:
文本模式(正则)匹配
在MySQL中,我们还可以使用LIKE
运算符判断文本内容是否符合指定的模式,用REGEXP
运算符判断文本是否匹配正则表达式。(即俗称的模糊匹配)
注:使用
LIKE
运算符只能使用MySQL自带的两个通配符,而使用REGEXP
运算符可以使用正则表达式。
LIKE
运算符使用的两个通配符:%
和_
;其中%
用于匹配0个或多个字符(即任意长度字符和空白),_
用于匹配单个字符。例如:
A%
:匹配用A开头的字符串。__B%
:匹配第三个字符为B的字符串。%C%
:匹配中间有C的字符串。__D__%
:匹配开头有五个字符,其中第三个字符为D的字符串。__%E
:匹配开头有两个字符,用E结尾的字符串。
有关正则表达式的内容,请参阅正则表达式教程 - 菜鸟教程,本文不予介绍。除了手动编写,您还可以使用在线生成工具生成正则表达式。
下面使用几个小例子来讲解MySQL的模糊匹配:
1.查询二级地址中有“南”字的记录
本题要求在army_region
表中查询出千岩军驻扎地的二级地名中有“南”这个字的记录。因为条件并不复杂,所以选用LIKE
运算符,其条件可以这样写:%南%
。
/* 模糊查询 - 在army_region表中查询二级地址有“南”字的记录 */
SELECT * FROM `army_region` WHERE region_L2 LIKE '%南%';
如图,我们已经成功查出region_L2
字段中含有“南”字的记录。
2.查询二级地址以“谷”结尾的记录
本题要求查出千岩军驻扎地的二级地名中以“谷”字结尾的记录,条件可以这样写:%谷
。
/* 模糊查询 - 在army_region表中查询二级地址以“谷”字结尾的记录 */
SELECT * FROM `army_region` WHERE region_L2 LIKE '%谷';
如图,我们已经成功查出了region_L2
字段中以“谷”字结尾的记录。
3.查询一级地址以“璃”字开头的记录
本题要求查询一级地址以“璃”字开头的记录,条件可以这样写:璃%
。
/* 模糊查询 - 在army_region表中查询一级地址以“璃”字开头的记录 */
SELECT * FROM `army_region` WHERE region_L1 LIKE '璃%';
如图,我们已经成功查出region_L1
中以“璃”字开头的记录。
在实际生产环境中,我们可以按实际需求编写文本模式通配符或者正则表达式,来更好地完成工作。
逻辑运算符
在MySQL中,逻辑运算符用于判断表达式的真与假,返回值为
0
、1
或NULL
。
MySQL有四种运算符:AND
、OR
、NOT
、XOR
,它们的作用如下所示:
AND
逻辑与:当所有表达式都为真时,才返回真,否则返回假。该运算符可以写作&&
。OR
逻辑或:当所有参与判断的表达式中的一个及以上为真,就返回真;如果所有表达式都为假,就返回假。该运算符可以写作||
。NOT
逻辑非:当所有表达式都为假,才返回真,否则返回假。该运算符可以写作!
。XOR
逻辑异或:当两边的表达式真假属性相同时返回假,不同返回真;如果两边的表达式有一边真假属性为NULL
时,返回NULL
。
注意:在MySQL中,0为假,1为真。
逻辑与(AND或&&)
逻辑与:当所有表达式都为真时,才返回真,否则返回假。
/* 逻辑与运算符 */
SELECT 0 AND 0; # 返回假
SELECT 1 AND 0; # 返回假
SELECT 1 AND 1; # 返回真
实际运用:查询army_info
表中人数大于1000且查询权限大于等于3的千岩军支队信息。
本题条件可以这样写:numOfPol > 1000 AND queryPri >=3;
/* 逻辑运算符实战 - AND运算符 */
SELECT * FROM `army_info` WHERE numOfPol > 1000 AND queryPri >=3;
逻辑或(OR或||)
逻辑或:当所有参与判断的表达式中的一个及以上为真,就返回真;如果所有表达式都为假,就返回假。
/* 逻辑或运算符 */
SELECT 0 OR 0; # 返回假
SELECT 0 OR 1; # 返回真
SELECT 1 OR 1; # 返回真
SELECT 1 OR 0 OR 1; # 返回真
实际运用:查询army_info
表中查询权限小于3或者建立日期在2018-01-17之前的千岩军支队信息。
本题条件可以这样写:queryPri < 3 OR Date(birthday) < '2018-01-17'
/* 逻辑运算符实战 - OR运算符 */
SELECT * FROM `army_info` WHERE queryPri < 3 OR Date(birthday) < '2018-01-17';
逻辑非(NOT或!)
逻辑非:当所有表达式都为假,才返回真,否则返回假。
/* 逻辑非运算符 */
SELECT NOT 0; # 返回真
SELECT NOT 1; # 返回假
实际运用:在army_region
表中查询出一级地区不在珉林、须弥、云来海三地且二级地址不为拒绝访问的记录。
本题条件可以这样写:region_L1 NOT IN('珉林','须弥','云来海') AND region_L2 != 'Permission Denied'
。
(由于本题要求查出一级地址不在珉林、须弥、云来海三地的记录,所以可以将其看作一个“黑名单”,使用IN
运算符)
/* 逻辑运算符实战 - NOT运算符 */
SELECT * FROM `army_region` WHERE region_L1 NOT IN('珉林','须弥','云来海') AND region_L2 != 'Permission Denied';
逻辑异或(XOR)
逻辑异或:当两边的表达式真假属性相同时返回假,不同返回真;如果两边的表达式有一边真假属性为
NULL
时,返回NULL
。
用人话说就是:当表达式一个为真一个为假时,返回真,否则返回假。
/* 逻辑异或运算符 */
SELECT 0 XOR 0; # 返回假
SELECT 0 XOR 1; # 返回真
SELECT 1 XOR 1; # 返回假
SELECT 0 XOR 0 XOR 0; # 返回假,因为0 XOR 0返回0,第二个表达式为0 XOR 0
SELECT 1 XOR 1 XOR 1; # 返回真,因为1 XOR 1返回0,第二个表达式为0 XOR 1
下面用一个例子帮助大家理解XOR
运算符追求的“异”:查询army_info
表,两个条件如下:
- 查询权限等级小于2,
queryPri < 2
。 - 人数小于1000,
numOfPol < 1000
。
将两个查询条件使用XOR
运算符连接起来,就是:
/* 逻辑运算符实战 - XOR运算符 */
SELECT * FROM `army_info` WHERE queryPri < 2 XOR numOfPol < 1000;
可以看出,当使用XOR
运算符时,只有表中符合两个查询条件之一的记录才会被查询出来;符合全部条件和全部条件都不符合的记录没有被查询出来。
注:
XOR
运算符在实际开发环境中不常用。
位运算符
位运算符是基于二进制数进行逻辑运算操作的运算符。位运算符先将操作数转换为二进制数,然后对二进制数进行逻辑运算后,将二进制结果转换为十进制数。
在MySQL中,有以下六种位运算符:
运算符 | 名称 | 作用 |
---|---|---|
& | 按位与 | 将两个操作数的对应 二进制位进行逻辑与运算 |
| | 按位或 | 将两个操作数的对应 二进制位进行逻辑或运算 |
^ | 按位异或 | 将两个操作数的对应 二进制位进行逻辑异或运算 |
~ | 按位取反 | 将一个目标操作数的 二进制位进行取反操作 |
<< | 按位左移 | 将第一个操作数的二进制 值左移指定位数 |
>> | 按位右移 | 将第一个操作数的二进制 值右移指定位数 |
按位与运算符
按位与运算符:将两个操作数的对应二进制位进行逻辑与运算。
对两个操作数使用按位与运算符(&
)时,如果两个操作数二进制值的对应位都为1时,该位结果返回1,否则该位结果返回0。原理图如下:
下面演示在MySQL中使用按位与运算符:
/* 按位与运算符 */
SELECT 5 & 9; # 1
SELECT 3 & 2; # 2
SELECT 7 & 3; # 3
SELECT 12 & 6; # 4
按位或运算符
按位或运算符:将两个操作数的对应二进制位进行逻辑或运算。
对两个操作数使用按位或运算符(|
)时,如果两个操作数二进制值的对应位有一个或以上值为1,则该位结果返回1,否则该位结果返回0。原理图如下:
下面演示在MySQL中演示按位或运算符:
/* 按位或运算符 */
SELECT 5 | 9; # 13
SELECT 3 | 2; # 3
SELECT 7 | 3; # 7
SELECT 12 | 6; # 14
按位异或运算符
按位异或运算符:将两个操作数的对应二进制位进行逻辑异或运算。
对两个操作数使用按位异或运算符(^
)时,如果两个操作数二进制值的对应位数值相反,则该位结果返回1,否则该位结果返回0。原理图如下:
下面在MySQL中演示使用按位异或运算符:
/* 按位异或运算符 */
SELECT 5 ^ 9; # 12
SELECT 3 ^ 2; # 1
SELECT 7 ^ 3; # 4
SELECT 12 ^ 6; # 10
按位取反运算符
按位取反运算符:将一个目标操作数的二进制位进行取反操作。
对目标操作数使用按位取反运算符(~
)时,将该操作数的所有二进制数位进行取反(人话:0转1,1转0)。原理图如下:
下面演示在MySQL中使用按位取反运算符:
/* 按位取反运算符 */
SELECT ~ 5; # 18446744073709551610
SELECT ~ 3; # 18446744073709551612
SELECT ~ 7; # 18446744073709551608
SELECT ~ 12; # 18446744073709551603
按位左移、右移运算符
按位左移运算符:将第一个操作数的二进制值左移指定位数。同理,按位右移运算符的作用为将操作数的二进制值右移指定位数。
原理图如下:
下面演示在MySQL中使用按位左移运算符(<<
)和按位右移运算符(>>
):
/* 按位左移、按位右移运算符 */
SELECT 5 << 3; # 5左移3位,00000101 -> 00101000,结果40
SELECT 7 << 2; # 7左移2位,00000111 -> 00011100,结果28
SELECT 12 >> 1; # 12右移1位,00001100 -> 00000110,结果6
SELECT 19 >> 3; # 19右移3位,00010011 -> 00000010,结果2