MySQL篇(运算符)(持续更新迭代)
目录
一、简介
二、运算符使用
1. 算术运算符
1.1. 加法运算符
1.2. 减法运算符
1.3. 乘法与除法运算符
1.4. 求模(求余)运算符
2. 比较运算符
2.1. 等号运算符
2.2. 安全等于运算符
2.3. 不等于运算符
2.4. 空运算符
2.5. 非空运算符
2.6. 最小值运算符
2.7. 最大值运算符
2.8. BETWEEN AND运算符
2.9. IN运算符
2.10. NOT IN运算符
2.11. LIKE运算符
2.12. REGEXP运算符
3. 逻辑运算符
3.1. 逻辑非运算符
3.2. 逻辑与运算符
3.3. 逻辑或运算符
3.4. 逻辑异或运算符
4. 位运算符
4.1. 按位与运算符
4.2. 按位或运算符
4.3. 按位异或运算符
4.4. 按位取反运算符
4.5. 按位右移运算符
4.6. 按位左移运算符
三、运算符的优先级
一、简介
运算符连接表达式中各个操作数,其作用是用来指明对操作数所进行的运算。
MySQL 支持 4 种运算符,分别是算术运算符、比较运算
符、逻辑运算符、位运算符:
- 算术运算包括加、减、乘、除等。
- 比较运算符包括大于、小于、等于或不等于。比较运算符用于数值的比较、字符串的匹配等方面。
- 逻辑运算符包括与、或、非、异或等。逻辑运算符返回值为布尔型,真值(1 或 true)和假值(0 或 false)。
- 位运算符包括按位与、按位或、按位取反、按位异或、按位左移和按位右移等位运算符。位运算先将数据转换为补码,然后在根据数据的补码进行操作。运算完成后,将得到的值转换为十进制数。
二、运算符使用
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 |
1.1. 加法运算符
SELECT 100, 100 + 50, 100 + 35.5 FROM `user`;
注意:两个整数类型值进行加法操作,结果是整数;一个整数类型的值和浮点数进行加法操作,结果是浮点数。
1.2. 减法运算符
SELECT 100, 100 - 50, 100 - 35.5 FROM `user`;
注意:两个整数类型值进行减法操作,结果是整数;一个整数类型的值和浮点数进行减法操作,结果是浮点数。
1.3. 乘法与除法运算符
SELECT 100 * 1, 100 * 1.0, 100 / 1.0, 100 / 2, 100 DIV 0 FROM `user`;
注意:一个数除以整数后,不管是否能除尽,结果为浮点数;一个数除以另一个数,除不尽时,结果为浮点数,
并保留到小数点后4位;在MySQL中,一个数除以0为NULL。
1.4. 求模(求余)运算符
SELECT 10 % 3, 12 MOD 5 FROM `user`;
2. 比较运算符
比较运算符对表达式左边的值和右边的值进行比较,比较的结果为真则返回1,比较的结果为假则返回0,其他情
况则返回NULL。
运算符 | 名称 | 作用 | 例子 |
= | 等于运算符 | 判断两个值、字符串或表达式是否相等 | SELECT * FROM TABLE WHERE A=B |
<=> | 安全等于运算符 | 安全地判断两个值、字符串或表达式是否相等 | SELECT * FROM TABLE WHERE A<=>B |
<> 或者 != | 不等于运算符 | 判断两个值、字符串或表达式是否不相等 | SELECT * FROM TABLE WHERE A<>B 或者 SELECT * FROM TABLE WHERE A!=B |
< | 小于运算符 | 判断前面的值、字符串或表达式是否小于后面的值、字符串或表达式 | SELECT * FROM TABLE WHERE A<B |
<= | 小于等于运算符 | 判断前面的值、字符串或表达式是否小于等于后面的值、字符串或表达式 | SELECT * FROM TABLE WHERE A<=B |
> | 大于运算符 | 判断前面的值、字符串或表达式是否大于后面的值、字符串或表达式 | SELECT * FROM TABLE WHERE A>B |
>= | 大于等于运算符 | 判断前面的值、字符串或表达式是否大于等于后面的值、字符串或表达式 | SELECT * FROM TABLE WHERE A>=B |
2.1. 等号运算符
SELECT 3 = 3, 2 = '2', 3 = 4, 'a' = 'a', (4 + 6) = (2 + 8), '' = NULL , NULL = NULL;
总结:
- 等号运算符判断等号两边的值、字符串或表达式是否相等,如果相等则返回1,不相等则返回0。
- 如果等号两边的值、字符串或表达式都为字符串,则会按照字符串进行比较,比较每个字符串中字符的ANSI编码是否相等。
- 如果等号两边的值都是整数,则会按照整数来比较两个值的大小。
- 如果等号一边是整数,另一边是字符串,则将字符串转化为数字进行比较。
- 如果等号两边的值、字符串或表达式中有一个为NULL,则比较结果为NULL。
2.2. 安全等于运算符
- 安全等于运算符与等于运算符的作用是相似的, 唯一的区别 安全等于运算符是用来对NULL进行判断。
- 当两个操作数都为 NULL 时,其返回值为1;当一个操作数为 NULL 时,其返回值为 0。
SELECT 1 <=> '1', 1 <=> 0, 'a' <=> 'a', (3 + 3) <=> (1 + 2), '' <=> NULL,NULL <=> NULL FROM `user`;
2.3. 不等于运算符
- 不等于运算符用于判断两边操作数的值是否不相等,如果不相等则返回1,相等则返回0。
- 如果两边的值有任意一个为NULL,或两边都为NULL,则结果为NULL。
非符号类型的运算符:
运算符 | 名称 | 作用 | 例子 |
IS NULL | 为空运算符 | 判断值、字符串或表达式是否为空 | SELECT * FROM TABLE WHERE A IS NULL |
IS NOT NULL | 不为空运算符 | 判断值、字符串或表达式是否不为空 | SELECT * FROM TABLE WHERE A IS NOT NULL |
LEAST | 最小值运算符 | 在多个值中返回最小值 | SELECT * FROM TABLE WHERE C LEAST(A,B) |
GREATEST | 最大值运算符 | 在多个值中返回最大值 | SELECT * FROM TABLE WHERE C GREATEST(A,B) |
BETWEEN AND | 两个数值之间的运算符 | 判断数值是否在两个值之间 | SELECT * FROM TABLE WHERE C BETWEEN AND(A,B) |
IN | 属于运算符 | 判断数值是否在列表中的任意值 | SELECT * FROM TABLE WHERE C IN (A,B) |
NOT IN | 不属于运算符 | 判断数值是否不是在列表中的任意值 | SELECT * FROM TABLE WHERE C NOT IN (A,B) |
LIKE | 模糊匹配运算符 | 判断数值是否符合模糊匹配规则 | SELECT * FROM TABLE WHERE C LIKE B |
REGEXP | 正则表达式运算符 | 判断数值是否符合正则表达式 | SELECT * FROM TABLE WHERE C REGEXP B |
RLIKE | 正则表达式运算符 | 判断数值是否符合正则表达式 | SELECT * FROM TABLE WHERE C RLIKE B |
2.4. 空运算符
空运算符判断一个值是否为NULL,如果为NULL则返回1,否则返回0。
SELECT NULL IS NULL, ISNULL(NULL), ISNULL('a'), 1 IS NULL;
2.5. 非空运算符
非空运算符判断一个值是否不为NULL,如果不为NULL则返回1,否则返回0。
SELECT NULL IS NOT NULL;
SELECT 'a' IS NOT NULL;
SELECT 1 IS NOT NULL ;
2.6. 最小值运算符
在有两个或多个参数的情况下,返回最小值。
SELECT LEAST (1,0,2), LEAST('b','a','c'), LEAST(1,NULL,2);
- 当参数是整数或者浮点数时,LEAST将返回其中最小的值;
- 当参数为字符串时,返回字母表中顺序最靠前的字符;
- 当比较值列表中有NULL时,不能判断大小,返回值为NULL。
2.7. 最大值运算符
当有两个或多个参数时,返回值为最大值。假如任意一个自变量为NULL,则GREATEST()的返回值为NULL。
SELECT GREATEST(1,0,2), GREATEST('b','a','c'), GREATEST(1,NULL,2);
- 当参数中是整数或者浮点数时,GREATEST将返回其中最大的值;
- 当参数为字符串时,返回字母表中顺序最靠后的字符;
- 当比较值列表中有NULL时,不能判断大小,返回值为NULL。
2.8. BETWEEN AND运算符
SELECT D FROM TABLE WHERE C BETWEEN A AND B,此时,当C大于或等于A,并且C小于或等于B时,结果为1,否则结果为0。
SELECT 1 BETWEEN 0 AND 1, 10 BETWEEN 11 AND 12, 'b' BETWEEN 'a' AND 'c';
2.9. IN运算符
- IN运算符用于判断给定的值是否是IN列表中的一个值,如果是则返回1,否则返回0;
- 如果给定的值为NULL,或者IN列表中存在NULL,则结果为NULL。
SELECT 'a' IN ('a','b','c'), 1 IN (2,3), NULL IN ('a','b'), 'a' IN ('a', NULL);
2.10. NOT IN运算符
NOT IN运算符用于判断给定的值是否不是IN列表中的一个值,如果不是IN列表中的一个值,则返回1,否则返回0。
SELECT 'a' NOT IN ('a','b','c'), 1 NOT IN (2,3);
2.11. LIKE运算符
LIKE运算符主要用来匹配字符串,通常用于模糊匹配,如果满足条件则返回1,否则返回0;
如果给定的值或者匹配条件为NULL,则返回结果为NULL。
LIKE运算符通常使用如下通配符:
- "%":匹配0个或多个字符。
- "_":只能匹配一个字符。
SELECT NULL LIKE 'abc', 'abc' LIKE NULL;
ESCAPE:关键字的主要作用就是指定一个字符替代“\”的作用。
- 回避特殊符号的:使用转义符。例如:将[%]转为[],然后再加上[ESCAPE‘$’]即可。
- 如果使用\表示转义,要省略ESCAPE。如果不是\,则要加上ESCAPE。
2.12. REGEXP运算符
REGEXP运算符用来匹配字符串,满足匹配条件返回1;不满足则返回0。
若expr或匹配条件任意一个为NULL,则结果为NULL。
REGEXP运算符常用的通配符:
- ‘^’匹配以该字符后面的字符开头的字符串。
- ‘$’匹配以该字符前面的字符结尾的字符串。
- ‘.’匹配任何一个单字符。
- “[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”或“b”或“c”。为了命名字符的范围,使用一个‘-’。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
- ‘ * ’匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的‘x’字符,“[0-9]”匹配任何数量的数字,而“”匹配任何数量的任何字符。
SELECT 'shkstart' REGEXP '^s', 'shkstart' REGEXP 't$', 'shkstart' REGEXP 'hk';
3. 逻辑运算符
逻辑运算符用来判断表达式的真假,逻辑运算符的返回结果为1、0或者NULL。
运算符 | 作用 | 例子 |
NOT 或 ! | 逻辑非 | SELECT NOT A |
AND 或&& | 逻辑与 | SELECT A AND B或者 SELECT A && B |
OR 或 || | 逻辑或 | SELECT A OR B或者 SELECT A || B |
XOR | 逻辑异或 | SELECT A XOR B |
3.1. 逻辑非运算符
- 逻辑非运算符表示当给定的值为0时返回1;
- 当给定的值为非0值时返回0;
- 当给定的值为NULL时,返回NULL。
SELECT NOT 1, NOT 0, NOT(1+1), NOT !1, NOT NULL;
3.2. 逻辑与运算符
- 逻辑与运算符是当给定的所有值均为非0值,并且都不为NULL时,返回1;
- 当给定的一个值或者多个值为0时则返回0,否则返回NULL。
SELECT 1 AND -1, 0 AND 1, 0 AND NULL, 1 AND NULL;
3.3. 逻辑或运算符
- 逻辑或运算符是当给定的值都不为NULL,并且任何一个值为非0值时,则返回1,否则返回0;
- 当一个值为NULL,并且另一个值为非0值时,返回1,否则返回NULL;
- 当两个值都为NULL时,返回NULL。
SELECT 1 OR -1, 1 OR 0, 1 OR NULL, 0 || NULL, NULL || NULL;
3.4. 逻辑异或运算符
- 逻辑异或运算符是当给定的值中任意一个值为NULL时,则返回NULL;
- 如果两个非NULL的值都是0或者都不等于0时,则返回0;
- 如果一个值为0,另一个值不为0时,则返回1。
SELECT 1 XOR -1, 1 XOR 0, 0 XOR 0, 1 XOR NULL, 1 XOR 1 XOR 1, 0 XOR 0 XOR 0;
4. 位运算符
- 位运算符是在二进制数上进行计算的运算符。
- 位运算符会先将操作数变成二进制数,然后进行位运算,最后将计算结果从二进制变回十进制数。
运算符 | 作用 | 例子 |
& | 按位与 | SELECT A & B |
| | 按位或 | SELECT A | B |
^ | 按位异或 | SELECT A ^ B |
~ | 按位取反 | SELECT A ~ B |
>> | 按位右移 | SELECT A >> B |
<< | 按位左移 | SELECT A << B |
4.1. 按位与运算符
- 按位与运算符将给定值对应的二进制数逐位进行逻辑与运算。
- 当给定值对应的二进制位的数值都为1时,则该位返回1,否则返回0。
SELECT 1 & 10, 20 & 30;
- 1的二进制数为0001,10的二进制数为1010,所以1 & 10的结果为0000,对应的十进制数为0。
- 20的二进制数为10100,30的二进制数为11110,所以20 & 30的结果为10100,对应的十进制数为20。
4.2. 按位或运算符
- 按位或运算符将给定的值对应的二进制数逐位进行逻辑或运算。
- 当给定值对应的二进制位的数值有一个或两个为1时,则该位返回1,否则返回0。
SELECT 1 | 10, 20 | 30;
- 1的二进制数为0001,10的二进制数为1010,所以1 | 10的结果为1011,对应的十进制数为11。
- 20的二进制数为10100,30的二进制数为11110,所以20 | 30的结果为11110,对应的十进制数为30。
4.3. 按位异或运算符
- 按位异或运算符将给定的值对应的二进制数逐位进行逻辑异或运算。
- 当给定值对应的二进制位的数值不同时,则该位返回1,否则返回0。
SELECT 1 ^ 10, 20 ^ 30;
- 1的二进制数为0001,10的二进制数为1010,所以1 ^ 10的结果为1011,对应的十进制数为11。
- 20的二进制数为10100,30的二进制数为11110,所以20 ^ 30的结果为01010,对应的十进制数为10。
4.4. 按位取反运算符
按位取反运算符将给定的值的二进制数逐位进行取反操作,即将1变为0,将0变为1。
SELECT 10 & ~1;
- 由于按位取反运算符的优先级高于按位与运算符的优先级;
- 10 & ~1,首先,对数字1进行按位取反操作,结果除了最低位为0;
- 其他位都为1,然后与10进行按位与操作,结果为10。
4.5. 按位右移运算符
- 按位右移运算符将给定的值的二进制数的所有位右移指定的位数。
- 右移指定的位数后,右边低位的数值被移出并丢弃,左边高位空出的位置用0补齐。
SELECT 1 >> 2, 4 >> 2;
1的二进制数为0000 0001,右移2位为0000 0000,对应的十进制数为0。
4的二进制数为0000 0100,右移2位为0000 0001,对应的十进制数为1。
4.6. 按位左移运算符
- 按位左移运算符将给定的值的二进制数的所有位左移指定的位数。
- 左移指定的位数后,左边高位的数值被移出并丢弃,右边低位空出的位置用0补齐。
SELECT 1 << 2, 4 << 2;
1的二进制数为0000 0001,左移两位为0000 0100,对应的十进制数为4。
4的二进制数为0000 0100,左移两位为0001 0000,对应的十进制数为16。
三、运算符的优先级
优先级 | 运算符 |
1 | : = , = |
2 | || , OR, XOR |
3 | &&, AND |
4 | NOT |
5 | BETWEEN, CASE, WHEN, THEN, ELSE |
6 | =, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN |
7 | | |
8 | & |
9 | << , >> |
10 | -, + |
11 | * , /, DIV, %, MOD |
12 | ^ |
13 | - , ~ |
14 | ! |
15 | () |
数字编号越大优先级越高,优先级高的运算符先进行计算。
赋值运算符的优先级最低,使用“()”括起来的表达式的优先级最高。