程序员需掌握的SQL运算符(三)

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章