1. 算数运算符
- 数学运算
- 对数值或者表达式进行
+,-,*,/或div,%或mod运算

1.1 加法与减法运算符
MySQL中+只表示数值相加
- 整数+整数=整数
- 浮点数+整数/浮点数 = 浮点数
- 加减优先级相同
mysql
mysql> SELECT 100 , 100 + 0, 100 + 0.0, 100 + 50 - 30, 100 - 0.5
-> FROM DUAL;
+-----+---------+-----------+---------------+-----------+
| 100 | 100 + 0 | 100 + 0.0 | 100 + 50 - 30 | 100 - 0.5 |
+-----+---------+-----------+---------------+-----------+
| 100 | 100 | 100.0 | 120 | 99.5 |
+-----+---------+-----------+---------------+-----------+
1 row in set (0.00 sec)
- 数 + 字符串 = 数本身
- 若浮点数小数部分为零,则会输出整数
- 遇到非数值类型,先尝试转成数值(隐式转换),如果转失败,就按0计算
mysql
mysql> SELECT 100 + 'A', 100.0 + 'A', 100.1 + 'A',100 + 'NULL'
-> FROM DUAL;
+-----------+-------------+-------------+--------------+
| 100 + 'A' | 100.0 + 'A' | 100.1 + 'A' | 100 + 'NULL' |
+-----------+-------------+-------------+--------------+
| 100 | 100 | 100.1 | 100 |
+-----------+-------------+-------------+--------------+
1 row in set, 3 warnings (0.00 sec)
- 若字符串是数,则会按数的正常数的方式运算
mysql
mysql> SELECT 100 + '1', '100' + '1'
-> FROM DUAL;
+-----------+-------------+
| 100 + '1' | '100' + '1' |
+-----------+-------------+
| 101 | 101 |
+-----------+-------------+
1 row in set (0.00 sec)
- 只要有NULL参与运算,结果就为NULL
mysql
mysql> SELECT 100 + NULL
-> FROM DUAL;
+------------+
| 100 + NULL |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)
1.2 乘法与除法运算符
- 整 * 整 = 整
- 浮点 * 整 = 浮点
- 浮点 * 浮点 = 浮点
- 整 / 整 = 浮点
- 整 / 浮点 = 浮点
- 浮点 / 浮点 = 浮点
总结:
- 有浮点参与运算,结果就是浮点数
- 除法运算的结果一定是浮点数
mysql
mysql> SELECT
-> 100*1, 100*1.0,1 00.0*1.0, 100 / 1, 100 / 1.0, 100.0 / 1.0
-> FROM
-> DUAL
-> ;
+-------+---------+-----------+----------+----------+-----------+
| 100*1 | 100*1.0 | 100.0*1.0 | 100/ 1 | 100/ 1.0 | 100.0/ 1.0|
+-------+---------+-----------+----------+----------+-----------+
| 100 | 100.0 | 100.00 | 100.0000 | 100.0000 | 100.00000 |
+-------+---------+-----------+----------+----------+-----------+
1 row in set (0.00 sec)
- 数 / 0 = NULL
- 分母为零,结果为NULL
mysql
mysql> SELECT
-> 100 / 0
-> FROM
-> DUAL;
+---------+
| 100 / 0 |
+---------+
| NULL |
+---------+
1 row in set, 1 warning (0.00 sec)
- 除法用
/或div都可以 - 但注意,
/结果为浮点数,div结果向下取整
mysql
mysql> SELECT
-> 100 / 2, 100 div 2
-> FROM
-> DUAL;
+---------+-----------+
| 100 / 2 | 100 div 2 |
+---------+-----------+
| 50.0000 | 50 |
+---------+-----------+
1 row in set (0.00 sec)
1.3 求模(求余)运算符
%与mod均可
mysql
mysql> SELECT
-> 100 % 3 , 100 mod 2
-> FROM
-> DUAL;
+---------+-----------+
| 100 % 3 | 100 mod 2 |
+---------+-----------+
| 1 | 0 |
+---------+-----------+
1 row in set (0.00 sec)
- 模的结果正负 = 被取模数的正负
mysql
mysql> SELECT
-> -5 % 2, 5 % -2, -5 % -2, 5 % 2
-> FROM
-> DUAL;
+--------+--------+---------+-------+
| -5 % 2 | 5 % -2 | -5 % -2 | 5 % 2 |
+--------+--------+---------+-------+
| -1 | 1 | -1 | 1 |
+--------+--------+---------+-------+
1 row in set (0.00 sec)
2. 比较运算符
-
左右表达式比较
-
结果为真,返回1
-
结果为假,返回0
-
其他情况,返回NULL
-
常用做SELECT查询语句的条件
2.1 符号类型的运算符

2.1.1 等号运算符
- 这下真是判断等号两边的表达式的值是否相等了,而不是赋值
- 如果相等则返回1,不相等则返回 0
- 两边都是数。正常比较
mysql
mysql> SELECT
-> 1 = 2, 1 != 2
-> FROM DUAL;
+-------+--------+
| 1 = 2 | 1 != 2 |
+-------+--------+
| 0 | 1 |
+-------+--------+
1 row in set (0.00 sec)
- 一边数,一边字符串。字符串隐式转换,若转换数值不成功,则看作为0
mysql
mysql> SELECT
-> 1 = '1', 1 = 'A', 'A' = 'a','1' = 'A'
-> FROM DUAL;
+---------+---------+-----------+-----------+
| 1 = '1' | 1 = 'A' | 'A' = 'a' | '1' = 'A' |
+---------+---------+-----------+-----------+
| 1 | 0 | 1 | 0 |
+---------+---------+-----------+-----------+
1 row in set, 1 warning (0.00 sec)
- 若两边都是字符串。则按照ANSI的比较规则比较
mysql
mysql> SELECT
-> 'AB' = 'AB','ab' = 'AB'
-> FROM DUAL;
+-------------+-------------+
| 'AB' = 'AB' | 'ab' = 'AB' |
+-------------+-------------+
| 1 | 1 |
+-------------+-------------+
1 row in set (0.00 sec)
mysql> SELECT
-> 'AB' = '0'
-> FROM DUAL;
+------------+
| 'AB' = '0' |
+------------+
| 0 |
+------------+
1 row in set (0.00 sec)
mysql> SELECT
-> 'AB' = 'A'
-> FROM DUAL;
+------------+
| 'AB' = 'A' |
+------------+
| 0 |
+------------+
1 row in set (0.00 sec)
- 只要有NULL就是NULL
mysql
mysql> SELECT
-> 1 = NULL, NULL = NULL
-> FROM DUAL;
+----------+-------------+
| 1 = NULL | NULL = NULL |
+----------+-------------+
| NULL | NULL |
+----------+-------------+
1 row in set (0.00 sec)
所以说要查询为NULL的,用=就查不出
2.1.2 安全等于运算符
<=>- 与等于相似
- 唯一区别:可以对NULL进行判断(tips:<=>,为NULL而生)
mysql
mysql> SELECT
-> 'NULL' <=> 'NULL', 1 <=> 'NULL'
-> FROM DUAL;
+-------------------+--------------+
| 'NULL' <=> 'NULL' | 1 <=> 'NULL' |
+-------------------+--------------+
| 1 | 0 |
+-------------------+--------------+
1 row in set, 1 warning (0.00 sec)
2.1.3 不等运算符
!=或<>
mysql
mysql> SELECT 1 <> 1, 1 != 2, 'a' != 'b', (3+4) <> (2+6), 'a' != NULL, NULL <> NULL;
+--------+--------+------------+----------------+-------------+--------------+
| 1 <> 1 | 1 != 2 | 'a' != 'b' | (3+4) <> (2+6) | 'a' != NULL | NULL <> NULL |
+--------+--------+------------+----------------+-------------+--------------+
| 0 | 1 | 1 | 1 | NULL | NULL |
+--------+--------+------------+----------------+-------------+--------------+
1 row in set (0.00 sec)
2.2 非符号类型的运算符

2.2.1 NULL 相关
- IS NULL 或 ISNULL( ) :为空运算符
- IS NOT NULL :不为空运算符
mysql
mysql> SELECT
-> 1 IS NULL, ISNULL(NULL), 1 IS NOT NULL
-> FROM DUAL;
+-----------+--------------+---------------+
| 1 IS NULL | ISNULL(NULL) | 1 IS NOT NULL |
+-----------+--------------+---------------+
| 0 | 1 | 1 |
+-----------+--------------+---------------+
1 row in set (0.00 sec)
2.2.2 最小,最大
- LEAST(A,B,...)
- GREATEST(A,B,...)
mysql
mysql> SELECT
-> LEAST(1,2),GREATEST(1,2),LEAST('A','B','C')
-> FROM DUAL;
+------------+---------------+--------------------+
| LEAST(1,2) | GREATEST(1,2) | LEAST('A','B','C') |
+------------+---------------+--------------------+
| 1 | 2 | A |
+------------+---------------+--------------------+
1 row in set (0.00 sec)
- 字符串,从第一个字母开始比,字典序
- 注意不是比长度
mysql
mysql> SELECT
-> LEAST('APPLE','A')
-> FROM DUAL;
+--------------------+
| LEAST('APPLE','A') |
+--------------------+
| A |
+--------------------+
1 row in set (0.00 sec)
mysql> SELECT
-> LEAST('APPLE','A'),GREATEST('APPLE','A')
-> FROM DUAL;
+--------------------+-----------------------+
| LEAST('APPLE','A') | GREATEST('APPLE','A') |
+--------------------+-----------------------+
| A | APPLE |
+--------------------+-----------------------+
1 row in set (0.00 sec)
2.2.3 BETWEEN ... AND ... 运算符
- A BETWEEN B AND C;
- B ≤ A ≤ C , 返回1
- A ≤ B || A ≥ C , 返回0
- 注意,包含边界
mysql
mysql> SELECT 1 BETWEEN 0 AND 1, 10 BETWEEN 11 AND 12, 'b' BETWEEN 'a' AND 'c';
+-------------------+----------------------+-------------------------+
| 1 BETWEEN 0 AND 1 | 10 BETWEEN 11 AND 12 | 'b' BETWEEN 'a' AND 'c' |
+-------------------+----------------------+-------------------------+
| 1 | 0 | 1 |
+-------------------+----------------------+-------------------------+
1 row in set (0.00 sec)
2.2.4 IN(set) 、NOT IN(set)
- 元素 IN/NOT IN(集合)
- 返回1、2
mysql
mysql> SELECT 'a' NOT IN ('a','b','c'), 1 NOT IN (2,3);
+--------------------------+----------------+
| 'a' NOT IN ('a','b','c') | 1 NOT IN (2,3) |
+--------------------------+----------------+
| 0 | 1 |
+--------------------------+----------------+
1 row in set (0.00 sec)
2.2.5 LIKE :模糊查询
-
主要用来匹配字符串
-
通常用于模糊匹配
-
如果满足条件则返回1,否则返回 0
-
如果给定的值或者匹配条件为NULL,则返回结果为NULL
-
但是只用LIKE和=也差不多,需要搭配以下通配符使用
"%":匹配0个或多个字符
"_":只能匹配一个字符 -
是否包含'a'
mysql
mysql> SELECT
-> 'abc' LIKE '%a%'
-> FROM DUAL;
+------------------+
| 'abc' LIKE '%a%' |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
- 是否以'a' 开头
mysql
mysql> SELECT
-> 'abc' LIKE 'a%'
-> FROM DUAL;
+-----------------+
| 'abc' LIKE 'a%' |
+-----------------+
| 1 |
+-----------------+
1 row in set (0.00 sec)
- 是否以'a'结尾
mysql
mysql> SELECT
-> 'abc' LIKE '%a'
-> FROM DUAL;
+-----------------+
| 'abc' LIKE '%a' |
+-----------------+
| 0 |
+-----------------+
1 row in set (0.00 sec)
- 包含'a'且包含'b' 的两种写法
mysql
mysql> SELECT
-> 'abc' LIKE '%a%b%' OR 'abc' LIKE '%b%a%'
-> FROM DUAL;
+------------------------------------------+
| 'abc' LIKE '%a%b%' OR 'abc' LIKE '%b%a%' |
+------------------------------------------+
| 1 |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT
-> 'abc' LIKE '%a%' AND 'abc' LIKE '%b%'
-> FROM DUAL;
+---------------------------------------+
| 'abc' LIKE '%a%' AND 'abc' LIKE '%b%' |
+---------------------------------------+
| 1 |
+---------------------------------------+
1 row in set (0.00 sec)
- 第二个字符是否是'a'
- 一个下划线表示一个字符
mysql
mysql> SELECT
-> 'abc' LIKE '_a%'
-> FROM DUAL;
+------------------+
| 'abc' LIKE '_a%' |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)
- 第二个字符是否是下划线
- 使用转义字符
\
- 使用转义字符
mysql
mysql> SELECT
-> 'a_c' LIKE '_\_%'
-> FROM DUAL;
+-------------------+
| 'a_c' LIKE '_\_%' |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
2.2.6 REGEXP运算符
-
较复杂,这里仅做简单了解
-
REGEXP运算符用来匹配字符串,语法格式为:
expr REGEXP 匹配条件 -
如果expr满足匹配条件,返回 1;如果不满足,则返回0
-
若expr或匹配条件任意一个为NULL,则结果为NULL
-
REGEXP运算符在进行匹配时,常用的有下面几种通配符:
(1)'
^'匹配以该字符后面的字符开头的字符串(2)'
$'匹配以该字符前面的字符结尾的字符串(3)'
.'匹配任何一个单字符(4)"
[...]"匹配在方括号内的任何字符例如,"
[abc]"匹配"a"或"b"或"c"。为了命名字符的范围,使用一个'-'"
[a-z]"匹配任何字母,而"[0-9]"匹配任何数字(5)'
*'匹配零个或多个在它前面的字符例如,"
x*"匹配任何数量的'x'字符,"[0-9]*"匹配任何数量的数字, 而"*"匹配任何数量的任何字符
mysql
mysql> SELECT 'shkstart' REGEXP '^s', 'shkstart' REGEXP 't$', 'shkstart' REGEXP 'hk';
+------------------------+------------------------+------------------------+
| 'shkstart' REGEXP '^s' | 'shkstart' REGEXP 't$' | 'shkstart' REGEXP 'hk' |
+------------------------+------------------------+------------------------+
| 1 | 1 | 1 |
+------------------------+------------------------+------------------------+
1 row in set (0.01 sec)
mysql> SELECT 'atguigu' REGEXP 'gu.gu', 'atguigu' REGEXP '[abc]', 'atguigu' REGEXP '[a-c]';
+--------------------------+--------------------------+--------------------------+
| 'atguigu' REGEXP 'gu.gu' | 'atguigu' REGEXP '[abc]' | 'atguigu' REGEXP '[a-c]' |
+--------------------------+--------------------------+--------------------------+
| 1 | 1 | 1 |
+--------------------------+--------------------------+--------------------------+
1 row in set (0.00 sec)
3. 逻辑运算符
逻辑运算符主要用来判断表达式的真假,在MySQL中,逻辑运算符的返回结果为1、0或者NULL

3.1 逻辑非运算符
- NOT 或 !
- !0 = 1
- !1 = 0
- !NULL = NULL
mysql
mysql> SELECT NOT 1, NOT 0, NOT(1+1), NOT !1, NOT NULL;
+-------+-------+----------+--------+----------+
| NOT 1 | NOT 0 | NOT(1+1) | NOT !1 | NOT NULL |
+-------+-------+----------+--------+----------+
| 0 | 1 | 0 | 1 | NULL |
+-------+-------+----------+--------+----------+
1 row in set, 1 warning (0.00 sec)
3.2 逻辑与运算符
- AND 或 &&
- 均非0非NULL 返回1
- 有0 返回0
- 其余情况返回NULL
mysql
mysql> SELECT 1 AND -1, 0 AND 1, 0 AND NULL, 1 AND NULL;
+----------+---------+------------+------------+
| 1 AND -1 | 0 AND 1 | 0 AND NULL | 1 AND NULL |
+----------+---------+------------+------------+
| 1 | 0 | 0 | NULL |
+----------+---------+------------+------------+
1 row in set (0.00 sec)
3.3 逻辑或运算符
- OR 或 ||
- 有非0值 返回1 否则返回0
- 有NULL 若另一值为非0 返回1 否则返回NULL
- 两个值都是NULL 返回NULL
mysql
mysql> SELECT 1 OR -1, 1 OR 0, 1 OR NULL, 0 || NULL, NULL || NULL;
+---------+--------+-----------+-----------+--------------+
| 1 OR -1 | 1 OR 0 | 1 OR NULL | 0 || NULL | NULL || NULL |
+---------+--------+-----------+-----------+--------------+
| 1 | 1 | 1 | NULL | NULL |
+---------+--------+-----------+-----------+--------------+
1 row in set, 2 warnings (0.00 sec)
- AND 的优先级高于 OR
3.4 逻辑异或运算符
- XOR
- 有NULL返回NULL
- 两个非NULL的值都是0或者都不等于0时,则返回0
- 一个值为0,另一个值不为0时,则返回1
mysql
mysql> SELECT 1 XOR -1, 1 XOR 0, 0 XOR 0, 1 XOR NULL, 1 XOR 1 XOR 1, 0 XOR 0 XOR 0;
+----------+---------+---------+------------+---------------+---------------+
| 1 XOR -1 | 1 XOR 0 | 0 XOR 0 | 1 XOR NULL | 1 XOR 1 XOR 1 | 0 XOR 0 XOR 0 |
+----------+---------+---------+------------+---------------+---------------+
| 0 | 1 | 0 | NULL | 1 | 0 |
+----------+---------+---------+------------+---------------+---------------+
1 row in set (0.00 sec)
4. 位运算符
(了解)
位运算符是在二进制数上进行计算的运算符
位运算符会先将操作数变成二进制数,然后进行位运算, 最后将计算结果从二进制变回十进制数
使用频率不高

4.1 按位与运算符
- 按位与(&)运算符将给定值对应的二进制数逐位进行逻辑与运算
- 当给定值对应的二进制位的数值都为1时,则该位返回1,否则返回0

mysql
mysql> SELECT 1 & 10, 20 & 30;
+--------+---------+
| 1 & 10 | 20 & 30 |
+--------+---------+
| 0 | 20 |
+--------+---------+
1 row in set (0.00 sec)
- 1的二进制数为0001,10的二进制数为1010,所以1 & 10的结果为0000,对应的十进制数为0
- 20的二进制数为10100,30的二进制数为11110,所以20 & 30的结果为10100,对应的十进制数为20
4.2 按位或运算符
- 按位或(|)运算符将给定的值对应的二进制数逐位进行逻辑或运算
- 当给定值对应的二进制位的数值有一个或两个为1时,则该位返回1,否则返回0

mysql
mysql> SELECT 1 | 10, 20 | 30;
+--------+---------+
| 1 | 10 | 20 | 30 |
+--------+---------+
| 11 | 30 |
+--------+---------+
1 row in set (0.00 sec)
- 1的二进制数为0001,10的二进制数为1010,所以1 | 10的结果为1011,对应的十进制数为11
- 20的二进制数为10100,30的二进制数为11110,所以20 | 30的结果为11110,对应的十进制数为30
4.3 按位异或运算符
- 按位异或(^)运算符将给定的值对应的二进制数逐位进行逻辑异或运算
- 当给定值对应的二进制位的数值不同时,则该位返回1,否则返回0

mysql
mysql> SELECT 1 ^ 10, 20 ^ 30;
+--------+---------+
| 1 ^ 10 | 20 ^ 30 |
+--------+---------+
| 11 | 10 |
+--------+---------+
1 row in set (0.00 sec)
- 1的二进制数为0001,10的二进制数为1010,所以1 ^ 10的结果为1011,对应的十进制数为11
- 20的二进制数为10100,30的二进制数为11110,所以20 ^ 30的结果为01010,对应的十进制数为10
mysql
mysql> SELECT 12 & 5, 12 | 5,12 ^ 5 FROM DUAL;
+--------+--------+--------+
| 12 & 5 | 12 | 5 | 12 ^ 5 |
+--------+--------+--------+
| 4 | 13 | 9 |
+--------+--------+--------+
1 row in set (0.00 sec)
4.4 按位取反运算符
- 按位取反(~)运算符将给定的值的二进制数逐位进行取反操作,即将1变为0,将0变为1
mysql
mysql> SELECT 10 & ~1;
+---------+
| 10 & ~1 |
+---------+
| 10 |
+---------+
1 row in set (0.00 sec)
- 按位取反(~)运算符的优先级高于按位与(&)运算符的优先级
- 首先,对数字1进行按位取反操作,结果除了最低位为0,其他位都为1
- 然后与10进行按位与操作,结果为10
4.5 按位右移运算符
- 按位右移(>>)运算符将给定的值的二进制数的所有位右移指定的位数
- 右移指定的位数后,右边低位的数值被移出并丢弃,左边高位空出的位置用0补齐
mysql
mysql> SELECT 1 >> 2, 4 >> 2;
+--------+--------+
| 1 >> 2 | 4 >> 2 |
+--------+--------+
| 0 | 1 |
+--------+--------+
1 row in set (0.00 sec)
- 1的二进制数为0000 0001,右移2位为0000 0000,对应的十进制数为0
- 4的二进制数为0000 0100,右移2 位为0000 0001,对应的十进制数为1
4.6 按位左移运算符
- 按位左移(<<)运算符将给定的值的二进制数的所有位左移指定的位数
- 左移指定的位数后,左边高位的数值被移出并丢弃,右边低位空出的位置用0补齐
mysql
mysql> SELECT 1 << 2, 4 << 2;
+--------+--------+
| 1 << 2 | 4 << 2 |
+--------+--------+
| 4 | 16 |
+--------+--------+
1 row in set (0.00 sec)
- 1的二进制数为0000 0001,左移两位为0000 0100,对应的十进制数为4
- 4的二进制数为0000 0100,左移两位为0001 0000,对应的十进制数为16
5. 运算符的优先级
不用记, 实在不行用() 就行
