1.前言
Mysql 支持多种类型的运算符,运算符可以为操作数进行运算。本文从Mysql 5.7版本出发,下面将详细介绍几种常见的运算符。Mysql运算符主要有四大类,它们分别是:
算术运算符
、比较运算符
、逻辑运算符
、位操作运算符
2 算术运算符
算术运算符包括加(+)、减(—)、乘(*)、除(/)、模运算(%)
下面简单演示这几种运算符的使用如下:
- 创建表
mysql> create table computeDemo(num int not null);
Query OK, 0 rows affected (0.01 sec)
- 插入数据
mysql> insert into computeDemo values(16),(32);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
接下来我们对num的值进行加法和法、减法、乘法、除法、取模运算。
mysql> update computeDemo set num= num-4 where num=16;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from computeDemo;
+-----+
| num |
+-----+
| 12 |
| 32 |
+-----+
2 rows in set (0.00 sec)
mysql> update computeDemo set num=num+8 where num=32;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from computeDemo;
+-----+
| num |
+-----+
| 12 |
| 40 |
+-----+
2 rows in set (0.00 sec)
mysql> update computeDemo set num=num*2 where num=12;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from computeDemo;
+-----+
| num |
+-----+
| 24 |
| 40 |
+-----+
2 rows in set (0.00 sec)
mysql> update computeDemo set num=num/2 where num=40;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from computeDemo;
+-----+
| num |
+-----+
| 24 |
| 20 |
+-----+
2 rows in set (0.00 sec)
mysql> update computeDemo set num=num%3 where num=20;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from computeDemo;
+-----+
| num |
+-----+
| 24 |
| 2 |
+-----+
2 rows in set (0.00 sec)
3. 比较运算符
比较运算符常用于SELECT语句查询中,下表列出了Mysql中常见的比较运算符:
运算符 | 解释说明 |
= 或 <=> | 判断左右两方值是否相等或者两方安全等于 |
< 或 > | 判断小于或者大于 |
<= 或 >= | 判断小于等于或者大于等于 |
!= | 判断不想等于 |
BETWEEN AND | 判断值是否在指定区域之间 |
IS NULL 或 IS NOT NULL | 判断值为null或者不为null |
IN 或 NOT IN | 判断值位于指定集合内或不在某个集合中 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
- 等于运算符与安全等于
等于运算符可以比较运算符两侧值是否相等,但是需要注意的是NULL不能用于等于比较运算符中。如果值相等则返回1 否则返回0。
mysql> select 1=0,1=1,NULL=2;
+-----+-----+--------+
| 1=0 | 1=1 | NULL=2 |
+-----+-----+--------+
| 0 | 1 | NULL |
+-----+-----+--------+
1 row in set (0.00 sec)
对于NULL值的比较可以使用<=>
如下所示:
mysql> select 1=0,1=1,NULL<=>2;
+-----+-----+----------+
| 1=0 | 1=1 | NULL<=>2 |
+-----+-----+----------+
| 0 | 1 | 0 |
+-----+-----+----------+
1 row in set (0.00 sec)
- 大于或者小于
mysql> select 5>1,5<1;
+-----+-----+
| 5>1 | 5<1 |
+-----+-----+
| 1 | 0 |
+-----+-----+
1 row in set (0.00 sec)
- 大于等于或小于等于
mysql> select 5>=5,2<=3;
+------+------+
| 5>=5 | 2<=3 |
+------+------+
| 1 | 1 |
+------+------+
1 row in set (0.00 sec)
- 不等于
mysql> select 5!=5,5=5;
+------+-----+
| 5!=5 | 5=5 |
+------+-----+
| 0 | 1 |
+------+-----+
1 row in set (0.00 sec)
- between and
between and 运算格式为:a betwwen min and max ,此与a>= min && a<=max 等价。
mysql> select 5 between 1 and 10;
+--------------------+
| 5 between 1 and 10 |
+--------------------+
| 1 |
+--------------------+
1 row in set (0.01 sec)
- is null 与 is not null
判断某个值为 null 或者不为 null
mysql> select null is null, null is not null;
+--------------+------------------+
| null is null | null is not null |
+--------------+------------------+
| 1 | 0 |
+--------------+------------------+
1 row in set (0.00 sec)
- in 与 not in
mysql> select 4 in (1,3,4,5);
+----------------+
| 4 in (1,3,4,5) |
+----------------+
| 1 |
+----------------+
1 row in set (0.00 sec)
mysql> select 2 in (1,3,4,5);
+----------------+
| 2 in (1,3,4,5) |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)
- like
like查询在一般sql查询非常多,请看下面一个查询的案列如下所示:
1、 LIKE’Mc%’ 将搜索以字母 Mc 开头的所有字符串(如 McBadden )。
2 、 LIKE’%inger’ 将搜索以字母 inger 结尾的所有字符串(如 Ringer 、 Stringer )。
3 、 LIKE’%en%’ 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet 、 Green 、 McBadden )。
4 、 LIKE’_heryl’ 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl 、 Sheryl )。 _代表一个字符
5 、 LIKE’[CK]ars[eo]n’ 将搜索下列字符串: Carsen 、 Karsen 、 Carson 和 Karson (如 Carson )。
6 、 LIKE’[M-Z]inger’ 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer )。
7 、 LIKE’M[^c]%’ 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如 MacFeather )。
- regexp
正则匹配查询在日常开发中应用的比较少,下面将一个简单例子演示其使用
mysql> select 'abc' regexp '^a';
+-------------------+
| 'abc' regexp '^a' |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.00 sec)
mysql> select 'abc' regexp '^b';
+-------------------+
| 'abc' regexp '^b' |
+-------------------+
| 0 |
+-------------------+
1 row in set (0.00 sec)
4. 逻辑运算符
在日常开发中CRUD都大量会应用到逻辑运算符,下面列出了Mysql中使用到的逻辑运算符号
运算符名称 | 解释说明 |
NOT 或 ! | 逻辑非既判断否 |
AND 或 && | 逻辑与既判断表达式都为真 |
OR 或 || | 逻辑或 |
XOR | 逻辑异或 |
- NOT 或 !
当操作数为0的时候,返回值为1否则返回0,当值为null则返回null
mysql> select not 0,not 1,not null;
+-------+-------+----------+
| not 0 | not 1 | not null |
+-------+-------+----------+
| 1 | 0 | NULL |
+-------+-------+----------+
1 row in set (0.01 sec)
- And 或 &&
当所有的操作数为非 null 且数值不为 0
mysql> select (1 and 1),(1 and 0),(1 and null);
+-----------+-----------+--------------+
| (1 and 1) | (1 and 0) | (1 and null) |
+-----------+-----------+--------------+
| 1 | 0 | NULL |
+-----------+-----------+--------------+
1 row in set (0.00 sec)
- or 或 ||
当所有的操作数全为null 且任意一个操作数不为0,返回1 否则为0.
mysql> select (1 or 1),(0 or 0),(1 or null);
+----------+----------+-------------+
| (1 or 1) | (0 or 0) | (1 or null) |
+----------+----------+-------------+
| 1 | 0 | 1 |
+----------+----------+-------------+
1 row in set (0.00 sec)
- xor
当操作数中有null的值则返回null,对于非null的操作数,如果两个操作数逻辑不相同则返回1 否则返回0
mysql> select (1 xor 1),(0 xor 0),(1 xor null);
+-----------+-----------+--------------+
| (1 xor 1) | (0 xor 0) | (1 xor null) |
+-----------+-----------+--------------+
| 0 | 0 | NULL |
+-----------+-----------+--------------+
1 row in set (0.00 sec)
5. 位运算符
位运算符对于JAVA程序员最熟悉不过了,但是对于JAVA程序员来说,在日常使用Mysql中很少会使用Mysql的位运算。一般地都是在从查询Mysql获得数据,然后在JAVA程序中对数值进行位运算。下面列出了Mysql支持的位运算符
运算符名称 | 使用说明 |
| | 位或 |
& | 位与 |
^ | 位异或 |
<< | 位左移 |
>> | 位右移 |
按位取返 |
下面以一个简单的例子演示其使用:
mysql> select 2|3,2&3,2^3,2>>3,2<<3,~2;
+-----+-----+-----+------+------+----------------------+
| 2|3 | 2&3 | 2^3 | 2>>3 | 2<<3 | ~2 |
+-----+-----+-----+------+------+----------------------+
| 3 | 2 | 1 | 0 | 16 | 18446744073709551613 |
+-----+-----+-----+------+------+----------------------+
1 row in set (0.00 sec)