1. 算术运算符
用于数学运算,连接两个数值或表达式进行加、减、乘、除、取模操作。
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
+ | 加法运算符 | 计算和 | SELECT A + B |
- | 减法运算符 | 计算差 | SELECT A - B |
* | 乘法运算符 | 计算乘积 | SELECT A * B |
/ 或 DIV | 除法运算符 | 计算商 | SELECT A / B 或 SELECT A DIV B |
% 或 MOD | 求模运算符 | 计算余数 | SELECT A % B 或 SELECT A MOD B |
注意事项:
- 整数与整数运算结果为整数,整数与浮点数运算结果为浮点数。
- 加法和减法优先级相同,乘法和除法优先级相同(高于加减)。
- MySQL 中
+
仅表示数值相加,非数值类型会尝试转数值(失败则按 0 计算),字符串拼接需用CONCAT()
。 - 除法结果为浮点数,除以 0 返回
NULL
。 - 求模运算可用于筛选奇偶性,如
WHERE employee_id MOD 2 = 0
筛选偶数 ID。
2. 比较运算符
用于比较两个值或表达式,结果为 1(真)、0(假)或NULL
,常作为查询条件。
基础比较运算符
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
= | 等于运算符 | 判断是否相等 | WHERE A = B |
<=> | 安全等于运算符 | 判断是否相等(支持 NULL) | WHERE A <=> B |
<> 或 != | 不等于运算符 | 判断是否不相等 | WHERE A <> B 或 WHERE A != B |
< | 小于运算符 | 判断前者是否小于后者 | WHERE A < B |
<= | 小于等于运算符 | 判断前者是否小于等于后者 | WHERE A <= B |
> | 大于运算符 | 判断前者是否大于后者 | WHERE A > B |
>= | 大于等于运算符 | 判断前者是否大于等于后者 | WHERE A >= B |
关键说明:
=
与<=>
的区别:=
对NULL
比较返回NULL
,<=>
对两个NULL
比较返回 1,一个NULL
返回 0。- 字符串与整数比较时,字符串会转为数字。
特殊比较运算符
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
IS NULL | 为空运算符 | 判断是否为 NULL | WHERE A IS NULL |
IS NOT NULL | 非空运算符 | 判断是否不为 NULL | WHERE A IS NOT NULL |
LEAST() | 最小值运算符 | 返回多个值中的最小值 | LEAST(1, 0, 2) 返回 0 |
GREATEST() | 最大值运算符 | 返回多个值中的最大值 | GREATEST(1, 0, 2) 返回 2 |
BETWEEN A AND B | 两值之间运算符 | 判断值是否在 [A, B] 范围内 | WHERE C BETWEEN 10 AND 20 |
IN() | 属于运算符 | 判断值是否在列表中 | WHERE C IN (1, 2, 3) |
NOT IN() | 不属于运算符 | 判断值是否不在列表中 | WHERE C NOT IN (1, 2, 3) |
LIKE | 模糊匹配运算符 | 按通配符匹配字符串 | WHERE A LIKE 'S%' |
REGEXP /RLIKE | 正则匹配运算符 | 按正则规则匹配字符串 | WHERE A REGEXP '^s' |
关键说明:
LEAST()
/GREATEST()
中包含NULL
时,结果为NULL
。BETWEEN A AND B
等价于A <= C <= B
,包含边界值。LIKE
通配符:%
匹配 0 个或多个字符,_
匹配 1 个字符;需转义特殊符号时,用ESCAPE
指定转义符(如LIKE 'IT$_%' ESCAPE '$'
)。REGEXP
常用模式:^
匹配开头,$
匹配结尾,.
匹配任意单字符,[...]
匹配集合内字符,*
匹配 0 个或多个前置字符。
3. 逻辑运算符
用于判断表达式真假,返回 1(真)、0(假)或NULL
。
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
NOT 或 ! | 逻辑非 | 取反(0→1,非 0→0,NULL→NULL) | WHERE NOT A |
AND 或 && | 逻辑与 | 全为非 0 且非 NULL 时返回 1,否则 0 或 NULL | WHERE A AND B |
OR 或 || | 逻辑或 | 任一非 0 且非 NULL 时返回 1,否则 0 或 NULL | WHERE A OR B |
XOR | 逻辑异或 | 两个非 NULL 值一个为 0 一个非 0 时返回 1,否则 0 或 NULL | WHERE A XOR B |

注意事项:
AND
优先级高于OR
,建议用括号明确优先级。- 示例:
WHERE salary >= 10000 AND job_id LIKE '%MAN%'
筛选高薪且职位含 MAN 的员工。
4. 位运算符
对二进制数进行运算,先转二进制,运算后转回十进制。
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
& | 按位与 | 对应位均为 1 则返回 1,否则 0 | 1 & 10 返回 0 |
| | 按位或 | 对应位有一个为 1 则返回 1,否则 0 | 1|10 返回 11 |
^ | 按位异或 | 对应位不同则返回 1,相同则 0 | 1 ^ 10 返回 11 |
~ | 按位取反 | 1→0,0→1 | ~1 返回 -2(二进制补码) |
>> | 按位右移 | 二进制位右移指定位数,高位补 0 | 4 >> 2 返回 1 |
<< | 按位左移 | 二进制位左移指定位数,低位补 0 | 4 << 2 返回 16 |
![[Pasted image 20250725215806.png]]
示例:
20 & 30
:20 二进制为10100
,30 为11110
,按位与得10100
(十进制 20)。20 | 30
:按位或得11110
(十进制 30)。
5. 运算符优先级
数字越大,优先级越高,建议用()
明确运算顺序。
优先级 | 运算符(部分) |
---|---|
15 | () (括号内表达式) |
14 | ! |
13 | ~ (按位取反)、- (负号) |
12 | ^ |
11 | * 、/ 、DIV 、% 、MOD |
10 | + 、- (加减) |
9 | << 、>> (位移) |
8 | & |
7 | | |
6 | = (比较运算符), <=> , > , < , >= , <= , != , IS , LIKE , IN ,REGEXP |
5 | BETWEEN , CASE , WHEN , THEN , ELSE |
4 | NOT |
3 | AND , && |
2 | OR , XOR ,|| |
1 | = (赋值) |
6. 正则表达式拓展(REGEXP
)
用于复杂字符串匹配,常用模式如下:
模式 | 说明 | 示例 |
---|---|---|
^ | 匹配开头字符 | '^b' 匹配以b 开头的字符串(如book ) |
$ | 匹配结尾字符 | 'st$' 匹配以st 结尾的字符串(如test ) |
. | 匹配任意单字符 | 'b.t' 匹配bit 、bat 等 |
* | 匹配 0 个或多个前置字符 | 'f*n' 匹配fn 、fan 、faan 等 |
+ | 匹配 1 个或多个前置字符 | 'ba+' 匹配ba 、bay 、battle 等 |
[] | 匹配集合内任意字符 | '[ot]' 匹配含o 或t 的字符串 |
[^] | 匹配集合外任意字符 | '[^abc]' 匹配不含a 、b 、c 的字符串 |
{n,} | 匹配前置字符至少 n 次 | 'x{2,}' 匹配含至少 2 个x 的字符串 |
{n,m} | 匹配前置字符 n 到 m 次 | 'ba{1,3}' 匹配ba 、baa 、baaa |
- 查询以特定字符或字符串开头的记录
字符‘^’匹配以特定字符或者字符串开头的文本。
在 fruits 表中,查询 f_name 字段以字母‘b’开头的记录:mysql SELECT * FROM fruits WHERE f_name REGEXP '^b';
- 查询以特定字符或字符串结尾的记录
字符‘$’匹配以特定字符或者字符串结尾的文本。
在 fruits 表中,查询 f_name 字段以字母‘y’结尾的记录:mysql SELECT * FROM fruits WHERE f_name REGEXP 'y$';
- 用符号 “.” 替代任意单个字符
字符‘.’匹配任意一个字符。
在 fruits 表中,查询 f_name 字段值包含字母‘a’与‘g’且两字母间只有一个字符的记录:mysql SELECT * FROM fruits WHERE f_name REGEXP 'a.g';
- 使用 “*” 和 “+” 匹配多个字符
- 星号‘*’:匹配前面的字符任意多次(包括 0 次)。
- 加号‘+’:匹配前面的字符至少一次。
- 在 fruits 表中,查询 f_name 字段以‘b’开头且后面出现‘a’(0 次或多次)的记录:
SELECT * FROM fruits WHERE f_name REGEXP '^ba*';
- 在 fruits 表中,查询 f_name 字段以‘b’开头且后面出现‘a’(至少 1 次)的记录:
SELECT * FROM fruits WHERE f_name REGEXP '^ba+';
- 匹配指定字符串(单个或多个)
匹配文本中包含指定字符串,多个字符串用‘|’分隔。- 在 fruits 表中,查询 f_name 字段包含 “on” 的记录:
SELECT * FROM fruits WHERE f_name REGEXP 'on';
- 在 fruits 表中,查询 f_name 字段包含 “on” 或 “ap” 的记录:
SELECT * FROM fruits WHERE f_name REGEXP 'on|ap';
- 匹配指定字符集合中的任意一个
方括号 “[]” 指定字符集合,匹配其中任意一个字符。- 在 fruits 表中,查询 f_name 字段包含‘o’或‘t’的记录:
SELECT * FROM fruits WHERE f_name REGEXP '[ot]';
- 在 fruits 表中,查询 s_id 字段包含 4、5 或 6 的记录:
SELECT * FROM fruits WHERE s_id REGEXP '[456]';
- 匹配指定字符集合以外的字符
“[字符集合]” 匹配不在集合中的任意字符。
在 fruits 表中,查询 f_id 字段包含字母 a~e 和数字 1~2 以外字符的记录:mysql SELECT * FROM fruits WHERE f_id REGEXP '[^a-e1-2]';
- 指定字符串连续出现的次数
- “字符串 {n,}”:匹配前面的字符串至少 n 次。
- “字符串 {n,m}”:匹配前面的字符串不少于 n 次、不多于 m 次。
- 在 fruits 表中,查询 f_name 字段出现字母‘x’至少 2 次的记录:
SELECT * FROM fruits WHERE f_name REGEXP 'x{2,}';
- 在 fruits 表中,查询 f_name 字段出现 “ba” 最少 1 次、最多 3 次的记录:
SELECT * FROM fruits WHERE f_name REGEXP 'ba{1,3}';