0 序言
本文围绕MySQL中的运算符展开,重点讲解算术、比较、逻辑、位运算符的定义、规则、示例及优先级并介绍正则表达式查询的相关内容。
通过本文的学习,你能初步掌握各类运算符的用法,理解其背后逻辑,解决实际查询中的运算问题,提升SQL语句编写能力。
1 算术运算符
算术运算符用于数学运算
,连接两个数值或表达式,进行加
、减
、乘
、除
、取模
操作。
1.1 加法与减法运算符
计算两个值或表达式的和(+)、差(-)。
sql
SELECT 100, 100 + 0, 100 - 0, 100 + 50, 100 + 50 -30, 100 + 35.5, 100 - 35.5 FROM dual;
结果如下:

就跟正常的运算是一样的,这里就不过多解释了。
牢记以下几点规则:
- 整数间加减,结果为
整数
;整数与浮点数加减,结果为浮点数
。 - 加法和减法优先级相同,运算顺序不影响结果。
- MySQL中"+"仅表数值相加,遇
非数值先转数值
,失败则按0计算,字符串拼接用CONCAT()。
1.2 乘法与除法运算符
计算两个值或表达式的乘积(*)、商(/或DIV)。
sql
SELECT 2*5/2, 100*1, 100*1.0, 100/1.0, 100/2, 100+2*5/2, 100/3, 100 DIV 0 FROM dual;
结果如下:

同理,牢记以下规则:
- 乘1或除1(整数)结果为原数;乘1.0或除1.0结果为浮点数,值与原数相等。
- 除法结果为浮点数,除不尽时保留4位小数。
- 乘除优先级相同,顺序不影响结果;除数为0时结果为NULL。
1.3 求模(求余)运算符
计算两个值或表达式的余数(%或MOD)。
sql
SELECT 12%3, 12 MOD 5 FROM dual;
结果如下:

又比如说,我要筛选employee_id为偶数的员工:
sql
SELECT * FROM employees WHERE employee_id MOD 2 = 0;

这里id号为偶数的员工就全被选择出来了。
2 比较运算符
用于比较左右操作数,结果为1(真)、0(假)或NULL,常用于SELECT查询的条件。
2.1 等号运算符(=)
判断两边值、字符串或表达式是否相等。
规则如下:
- 均为字符串:比较ANSI编码;
- 均为整数:比较大小;一整数一字符串:字符串转数字比较。
- 含NULL时结果为NULL。
sql
SELECT 1=1, 1='1', 1=0, 'a'='a', (5+3)=(2+6), ''=NULL, NULL=NULL FROM dual;
结果如下:

2.2 安全等于运算符(<=>)
与=类似,但两边均为NULL时返回1,而非NULL。
sql
SELECT 1<=>'1', 1<=>0, 'a'<=>'a', (5+3)<=>(2+6), ''<=>NULL, NULL<=>NULL FROM dual;
结果如下:

2.3 不等于运算符(<>或!=)
判断两边值是否不相等,不相等返回1,相等返回0;含NULL时结果为NULL。
sql
SELECT 1<>1, 1!=2, 'a'!='b', (3+4)<>(2+6), 'a'!=NULL, NULL<>NULL FROM dual;
结果如下:

2.4 空运算符(IS NULL或ISNULL)
判断值是否为NULL,是则返回1,否则返回0。
sql
SELECT NULL IS NULL, ISNULL(NULL), ISNULL('a'), 1 IS NULL FROM dual;
结果如下:

2.5 非空运算符(IS NOT NULL)
判断值是否不为NULL,是则返回1,否则返回0。
sql
SELECT NULL IS NOT NULL, 'a' IS NOT NULL, 1 IS NOT NULL FROM dual;
结果如下:
逻辑跟上一节相反,这里注意区分!

2.6 最小值运算符(LEAST)
返回多个值中的最小值,含NULL时结果为NULL。
sql
SELECT LEAST(1,0,2), LEAST('b','a','c'), LEAST(1,NULL,2) FROM dual;
结果如下:

2.7 最大值运算符(GREATEST)
返回多个值中的最大值,含NULL时结果为NULL。
sql
SELECT GREATEST(1,0,2), GREATEST('b','a','c'), GREATEST(1,NULL,2) FROM dual;
结果如下:

2.8 BETWEEN AND运算符
判断值是否在两值之间(含边界),是则返回1,否则返回0。
sql
SELECT 1 BETWEEN 0 AND 1, 10 BETWEEN 11 AND 12, 'b' BETWEEN 'a' AND 'c' FROM dual;
结果如下:

2.9 IN运算符
判断值是否为列表中的一个,是则返回1,否则返回0;含NULL时结果为NULL。
sql
SELECT 'a' IN ('a','b','c'), 1 IN (2,3), NULL IN ('a','b'), 'a' IN ('a',NULL) FROM dual;
结果如下:

2.10 NOT IN运算符
判断值是否不是列表中的一个,不是则返回1,否则返回0。
sql
SELECT 'a' NOT IN ('a','b','c'), 1 NOT IN (2,3) FROM dual;
结果如下:

2.11 LIKE运算符
模糊匹配字符串,用%(匹配0+字符)和_(匹配1字符),含NULL时结果为NULL。
sql
SELECT first_name FROM employees WHERE first_name LIKE 'S%';
SELECT last_name FROM employees WHERE last_name LIKE '_o%';

2.12 REGEXP运算符
用正则表达式匹配字符串,满足则返回1,否则返回0,含NULL时结果为NULL。
常用匹配规则如下:
- ^:匹配开头;
- $:匹配结尾;
- .:匹配任一字符;
- *****:匹配前一字符0+次;
- +:匹配前一字符1+次;
- []:匹配集合中任一字符等。
sql
SELECT 'shkstart' REGEXP '^s', 'shkstart' REGEXP 't$', 'shkstart' REGEXP 'hk' FROM dual;
结果如下:

从结果看出,第一个就是找到以s
为开头的,
第二个则是找到以t
为结尾的,
最后一个就是找到中间包含hk
的。
3 逻辑运算符
用于判断表达式真假,返回1、0或NULL。
3.1 逻辑非(NOT或!)
值为0返回1,非0返回0,NULL返回NULL。
sql
SELECT NOT 1, NOT 0, NOT(1+1), NOT !1, NOT NULL FROM dual;
结果如下;

3.2 逻辑与(AND或&&)
所有值非0且非NULL返回1;任一值为0返回0;否则返回NULL。
sql
SELECT 1 AND -1, 0 AND 1, 0 AND NULL, 1 AND NULL FROM dual;
结果如下:

3.3 逻辑或(OR或||)
非NULL且任一非0返回1;一为NULL另一非0返回1;均为NULL返回NULL;否则返回0。
sql
SELECT 1 OR -1, 1 OR 0, 1 OR NULL, 0 || NULL, NULL || NULL FROM dual;
结果如下:

其实这里,不管是与还是或,基本的判断逻辑都不变的,
记住NULL
这个特殊情况就好了。
3.4 逻辑异或(XOR)
任一为NULL返回NULL;两非NULL值均为0或均非0返回0;一为0一非0返回1。
sql
SELECT 1 XOR -1, 1 XOR 0, 0 XOR 0, 1 XOR NULL FROM dual;
结果如下:

不同为1,相同为0,有NULL
就返回NULL
。
4 位运算符
对二进制数操作,先转二进制运算,再转十进制返回。
4.1 按位与(&)
二进制位均为1则返回1,否则返回0。
sql
SELECT 1&10, 20&30 FROM dual;
结果:0、20(1二进制0001,10二进制1010,与为0000=0;20二进制10100,30二进制11110,与为10100=20)

这里难度稍微大一点,但也不难理解。
比如这个1&10,你可以把10换成二进制表示,如:
sql
00001 & 01010 → 00000 → 十进制0
10100 & 11110 → 10100 → 十进制20
就是这个原理。
4.2 按位或(|)
二进制位任一为1则返回1,否则返回0。
sql
SELECT 1|10, 20|30 FROM dual;
结果:11、30(1|10二进制1011=11;20|30二进制11110=30)

这个也是同样的道理,把两个数转换成二进制表达出来,
然后再进行操作,最后再转成十进制,
就是输出结果了。
4.3 按位异或(^)
二进制位不同返回1,相同返回0。
sql
SELECT 1^10, 20^30 FROM dual;
结果:11、10(110二进制1011=11;2030二进制01010=10)

sql
00001 & 01010 → 01011 → 十进制11
10100 & 11110 → 01010 → 十进制10
原理不难。
4.4 按位取反(~)
二进制位1变0,0变1。
sql
SELECT 10 & ~1 FROM dual;
结果:10

4.5 按位右移(>>)
二进制位右移指定位数,低位丢弃,高位补0。
sql
SELECT 1>>2, 4>>2 FROM dual;
结果:0、1

1二进制0001右移2位为0000=0;4二进制0100右移2位为0001=1
4.6 按位左移(<<)
二进制位左移指定位数,高位丢弃,低位补0。
sql
SELECT 1<<2, 4<<2 FROM dual;
结果:4、16

1二进制0001左移2位为0100=4;4二进制0100左移2位为10000=16
5 运算符的优先级
数字越大优先级越高,优先级高的先运算。核心优先级(从高到低):
- ()最高
- 按位取反(~)、负号(-)
- *、/、DIV、%、MOD
- +、-
- 按位左移(<<)、右移(>>)
- 比较运算符(=、<=>、>等)
- NOT
- AND、&&
- OR、||、XOR
- 赋值运算符(=)最低
6 小结
本文详细介绍了MySQL中算术、比较、逻辑、位运算符的定义、规则、示例及优先级,还涵盖正则表达式查询。
希望通过本文的学习,可以初步掌握这些运算符,帮助构建准确的SQL查询,理解优先级可避免运算顺序错误。