算术运算符

运算符作用
+加法
-减法
*乘法
/,DIV除法,返回商(div 只保留整数)
%,MOD除法,返回余数
1
2
3
4
5
6
7
select 0.1+0.3333,0.1-0.3333,0.1*0.3333,1/2,1/0,1%2,1 div 2,1 mod 2;
+------------+------------+------------+--------+------+------+---------+---------+
| 0.1+0.3333 | 0.1-0.3333 | 0.1*0.3333 | 1/2 | 1/0 | 1%2 | 1 div 2 | 1 mod 2 |
+------------+------------+------------+--------+------+------+---------+---------+
| 0.4333 | -0.2333 | 0.03333 | 0.5000 | NULL | 1 | 0 | 1 |
+------------+------------+------------+--------+------+------+---------+---------+
1 row in set, 1 warning (0.00 sec)

比较运算符

当时用 select 语句进行查询时,MySQL 允许用户对表达式的左边操作数和右边操作数进行比较,比较结果为真,则返回 1,为假则返回 0,结果不确定则会返回 NULL。

比较运算符可以用于比较数字、字符串和表达式。数字作为浮点数进行比较,而字符串可以不区分大小写的方式进行比较。

运算符作用
=等于
<>或!=不等于
<=>NULL 安全的等于(NULL-safe)
<小于
<=小于等于
>大于
>=大于等于
BETWEEN存在于指定范围
IN存在于指定集合
IS NULL为 NULL
IS NOT NULL非 NULL
LIKE通配符匹配
REGEXP 或 RLIKE正则表达式匹配

=

=运算符用于比较运算符两侧的操作数是否相等,如果两侧操作数相等返回 1,否则返回 0.NULL 不能用=比较。

1
2
3
4
5
6
7
select 1=1,1=0,NULL=NULL;
+-----+-----+-----------+
| 1=1 | 1=0 | NULL=NULL |
+-----+-----+-----------+
| 1 | 0 | NULL |
+-----+-----+-----------+
1 row in set (0.01 sec)

<> / !=

<>/!=运算符和=相反,如果两侧操作数不等,则值为 1,否则为 0,NULL 也不能用<>来比较。

1
2
3
4
5
6
7
select 1!=1,1<>0,NULL<>NULL;
+------+------+------------+
| 1!=1 | 1<>0 | NULL<>NULL |
+------+------+------------+
| 0 | 1 | NULL |
+------+------+------------+
1 row in set (0.00 sec)

<=>

<=> 运算符和=类似,在操作数相等时值为 1,不同之处在于及时操作数的值为 NULL 也可以正确的比较。

1
2
3
4
5
6
7
select 1<=>1,1<=>0,NULL<=>NULL;
+-------+-------+-------------+
| 1<=>1 | 1<=>0 | NULL<=>NULL |
+-------+-------+-------------+
| 1 | 0 | 1 |
+-------+-------+-------------+
1 row in set (0.00 sec)

<

<运算符,当左侧操作数小于右侧操作数时,其返回值为 1,否则值为 0.

1
2
3
4
5
6
7
select 'a'<'b','a'<'a','1'<'2.2',null<1,null>1;
+---------+---------+-----------+--------+--------+
| 'a'<'b' | 'a'<'a' | '1'<'2.2' | null<1 | null>1 |
+---------+---------+-----------+--------+--------+
| 1 | 0 | 1 | NULL | NULL |
+---------+---------+-----------+--------+--------+
1 row in set (0.00 sec)

<=

<=运算符,当左侧操作数小于等于右侧操作数时,其返回值为 1,否则值为 0.

1
2
3
4
5
6
7
select 'a'<='b','a'<='a','1'<='2.2',null<=1,null>=1;
+----------+----------+------------+---------+---------+
| 'a'<='b' | 'a'<='a' | '1'<='2.2' | null<=1 | null>=1 |
+----------+----------+------------+---------+---------+
| 1 | 1 | 1 | NULL | NULL |
+----------+----------+------------+---------+---------+
1 row in set (0.00 sec)

>

>运算符,当左侧操作数大于右侧操作数时,其返回值为 1,否则值为 0.

1
2
3
4
5
6
7
select 'a'>'b','a'>'a','1'>'2.2',null>1,null>=1;
+---------+---------+-----------+--------+---------+
| 'a'>'b' | 'a'>'a' | '1'>'2.2' | null>1 | null>=1 |
+---------+---------+-----------+--------+---------+
| 0 | 0 | 0 | NULL | NULL |
+---------+---------+-----------+--------+---------+
1 row in set (0.00 sec)

>=

>=运算符,当左侧操作数大于等于右侧操作数时,其返回值为 1,否则值为 0.

1
2
3
4
5
6
7
select 'a'>='b','a'>='a','1'>='2.2',null>=1,null>=1;
+----------+----------+------------+---------+---------+
| 'a'>='b' | 'a'>='a' | '1'>='2.2' | null>=1 | null>=1 |
+----------+----------+------------+---------+---------+
| 0 | 1 | 0 | NULL | NULL |
+----------+----------+------------+---------+---------+
1 row in set (0.00 sec)

BETWEEN

BETWEEN运算符的使用格式为a BETWEEN min AND max,当 a 大于等于 min 且小于等于 max 时返回 1,否则返回 0;当操作数 a、min、max 类型相同时,此表达式等价于(a>=min and a<=max),当操作数类型不同时,比较会遵循类型转换原则进行转换后,在进行比较运算。

1
2
3
4
5
6
7
select 12 between 10 and 15;
+----------------------+
| 12 between 10 and 15 |
+----------------------+
| 1 |
+----------------------+
1 row in set (0.00 sec)

IN

IN运算符的使用格式为 a IN (value1,value2,…),当 a 的值存在于列表中时,则返回值为 1,否则为 0。

1
2
3
4
5
6
7
select 1 in (1,2),'q' in ('M','Y','S','Q','L');
+------------+------------------------------+
| 1 in (1,2) | 'q' in ('M','Y','S','Q','L') |
+------------+------------------------------+
| 1 | 1 |
+------------+------------------------------+
1 row in set (0.00 sec)

IS NULL

IS NULL运算符的使用格式为a IS NULL,当 a 的值为 NULL,则返回值为 1,否则返回 0。

1
2
3
4
5
6
7
select 0 is null,null is null;
+-----------+--------------+
| 0 is null | null is null |
+-----------+--------------+
| 0 | 1 |
+-----------+--------------+
1 row in set (0.00 sec)

IS NOT NULL

IS NOT NULL运算符的使用格式为a IS NOT NULL,当 a 的值不为 NULL,则返回值为 1,否则返回 0

1
2
3
4
5
6
7
select 0 is not null,null is not null;
+---------------+------------------+
| 0 is not null | null is not null |
+---------------+------------------+
| 1 | 0 |
+---------------+------------------+
1 row in set (0.00 sec)

like

like运算符的使用格式为a LIKE %123%,当 a 中包含字符串”123”时,返回值为 1,否则为 0

1
2
3
4
5
6
7
select 123456 like '123%', 123456 like '%123',123456 like '%312%';
+--------------------+--------------------+---------------------+
| 123456 like '123%' | 123456 like '%123' | 123456 like '%312%' |
+--------------------+--------------------+---------------------+
| 1 | 0 | 0 |
+--------------------+--------------------+---------------------+
1 row in set (0.00 sec)

REGEXP

REGEXP运算符的使用格式为”str REGEXP str_pat”,当字符串中含有 str_pat 相匹配的字符串时,返回值为 1,否则返回 0

1
2
3
4
5
6
7
select 'abcdef' regexp 'ab','abcdef' regexp 'k';
+----------------------+---------------------+
| 'abcdef' regexp 'ab' | 'abcdef' regexp 'k' |
+----------------------+---------------------+
| 1 | 0 |
+----------------------+---------------------+
1 row in set (0.00 sec)

逻辑运算符

逻辑运算符又称为布尔运算符,用来确认表达式的真假。MySQL 支持以下四种逻辑运算符:

运算符作用
NOT/!逻辑非
AND/&逻辑与
OR/||逻辑或
XOR逻辑异或

逻辑非

返回和操作数相反的结果。当操作数为 0,则返回值为 1,否则为 0.但是有一点除外,那就是 NOTNULL 的返回值为 NULL。

1
2
3
4
5
6
7
select not 0,not 1,not null;
+-------+-------+----------+
| not 0 | not 1 | not null |
+-------+-------+----------+
| 1 | 0 | NULL |
+-------+-------+----------+
1 row in set (0.00 sec)

逻辑与

当所有操作数均为非零值并且不为 NULL 时,计算所得结果为 1;当一个或多个操作数为 0 时,所得结果为 0;操作数中有任意一个为 NULL,返回值为 NULL

1
2
3
4
5
6
7
select 1 and 1,0 and 1,3 and 1,1 and null;
+---------+---------+---------+------------+
| 1 and 1 | 0 and 1 | 3 and 1 | 1 and null |
+---------+---------+---------+------------+
| 1 | 0 | 1 | NULL |
+---------+---------+---------+------------+
1 row in set (0.00 sec)

逻辑或

当两个操作数均为非 NULL 值时,如有任意一个操作数做为非零值,则结果为 1,否则结果为 0;当有一个操作数为 NULL 时,如另一个操作数为非零值,则结果为 1,否则为 NULL,如果两个操作数均为 NULL,则所得结果为 NULL。

1
2
3
4
5
6
7
select 1 or 1,0 or 1,3 or 1,1 or null,null or null;
+--------+--------+--------+-----------+--------------+
| 1 or 1 | 0 or 1 | 3 or 1 | 1 or null | null or null |
+--------+--------+--------+-----------+--------------+
| 1 | 1 | 1 | 1 | NULL |
+--------+--------+--------+-----------+--------------+
1 row in set (0.00 sec)

逻辑异或

当任意一个操作数为 NULL 时,返回值为 NULL;对于非 NULL 的操作数,如果两个的逻辑真价值相异,则返回 1,否则返回 0.

1
2
3
4
5
6
7
select 1 xor 1,0 xor 0,1 xor 0,0 xor 1,null xor 1;
+---------+---------+---------+---------+------------+
| 1 xor 1 | 0 xor 0 | 1 xor 0 | 0 xor 1 | null xor 1 |
+---------+---------+---------+---------+------------+
| 0 | 0 | 1 | 1 | NULL |
+---------+---------+---------+---------+------------+
1 row in set (0.00 sec)

位运算符

位运算是将给定的操作数转化为二进制后,对各个操作数每一位都进行指定的逻辑运算,得到的二进制结果转化为十进制数就是位运算的结果。MySQL5.7 支持六种位运算符

运算符作用
$位与
|位或
^位亦或
~位取反
>>位右移
<<位左移

位与

1
2
3
4
5
6
7
select 2&3;
+-----+
| 2&3 |
+-----+
| 2 |
+-----+
1 row in set (0.00 sec)

位或

1
2
3
4
5
6
7
select 2|3;
+-----+
| 2|3 |
+-----+
| 3 |
+-----+
1 row in set (0.00 sec)

位异或

1
2
3
4
5
6
7
select 2^3;
+-----+
| 2^3 |
+-----+
| 1 |
+-----+
1 row in set (0.00 sec)

位取反

1
2
3
4
5
6
7
select ~1,~18446744073709551614;
+----------------------+-----------------------+
| ~1 | ~18446744073709551614 |
+----------------------+-----------------------+
| 18446744073709551614 | 1 |
+----------------------+-----------------------+
1 row in set (0.00 sec)

在 MySQL 中常量数字默认会以 8 个字节来表示,8 个字节就是 64 位,常量 1 的二进制表示为 63 个 0 加一个 1,取反就是 63 个 1 加一个 0,转换成二进制就是 18446744073709551614

1
2
3
4
5
6
select bin(18446744073709551614);
+------------------------------------------------------------------+
| bin(18446744073709551614) |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111110 |
+------------------------------------------------------------------+

位右移

100 的二进制 0001100100 右移 3 位,左边补零,结果是 0000001100,转换为二进制为 12.

1
2
3
4
5
6
7
select 100>>3;
+--------+
| 100>>3 |
+--------+
| 12 |
+--------+
1 row in set (0.00 sec)

位左移

1
2
3
4
5
6
7
select 100<<3;
+--------+
| 100<<3 |
+--------+
| 800 |
+--------+
1 row in set (0.00 sec)