MySQL 数据库——高阶语句(中)

一、正则表达式

  • MySQL 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串
  • MySQL 的正则表达式使用 REGEXP 这个关键字来指定正则表达 式的匹配模式,REGEXP 操作符所支持的匹配模式如表所示
    regexp
匹配 描述
^ 匹配文本的开始字符
$ 匹配文本的结束字符
. 匹配任何单个字符
* 匹配零个或多个在它前面的字符
+ 匹配前面的字符1次或多次
字符串 匹配包含指定的字符串
p1|p2 匹配p1或p2
[…] 匹配字符集合中的任意一个字符
[^…] 匹配不在括号中的任何字符
{n} 匹配前面的字符串n次
{n,m} 匹配前面的字符串至少n次,最多m次
#查询以h开头的学生信息
mysql> select id,name from xjj where name regexp '^h';
+----+-----------+
| id | name      |
+----+-----------+
|  6 | hanmeimei |
+----+-----------+
1 row in set (0.00 sec)

#查询以i结尾的学生信息
mysql> select id,name from xjj where name regexp 'i$';
+----+-----------+
| id | name      |
+----+-----------+
|  1 | liuyi     |
|  3 | lisi      |
|  4 | tianqi    |
|  6 | hanmeimei |
|  7 | lilei     |
|  8 | caicai    |
+----+-----------+
6 rows in set (0.00 sec)

#查询名字中包含ng的学生信息
mysql> select id,name from xjj where name regexp 'ng';
+----+--------+
| id | name   |
+----+--------+
|  2 | wangwu |
+----+--------+
1 row in set (0.00 sec)

#查询名字是tian开头,i结尾,中间不知道是一个什么字符的学生信息
mysql> select id,name from xjj where name regexp 'tian.i';
+----+--------+
| id | name   |
+----+--------+
|  4 | tianqi |
+----+--------+
1 row in set (0.00 sec)

#查询名字中包含ha或者wu的学生信息
mysql> select id,name from xjj where name regexp 'ha|wu';
+----+-----------+
| id | name      |
+----+-----------+
|  2 | wangwu    |
|  6 | hanmeimei |
+----+-----------+
2 rows in set (0.00 sec)

#查询名字中有an,g可有可无的学生信息
必须要有的部分是'an''g'可有可无
mysql> select id,name from xjj where name regexp 'ang*';
+----+-----------+
| id | name      |
+----+-----------+
|  2 | wangwu    |
|  4 | tianqi    |
|  6 | hanmeimei |
+----+-----------+
3 rows in set (0.00 sec)

#查询名字中含有an,g至少出现一次的学生信息
mysql> select id,name from xjj where name regexp 'ang+';
+----+--------+
| id | name   |
+----+--------+
|  2 | wangwu |
+----+--------+
1 row in set (0.00 sec)

#查询名字以d-x开头的学生信息
mysql> select id,name from xjj where name regexp '^[d-x]';
+----+-----------+
| id | name      |
+----+-----------+
|  1 | liuyi     |
|  2 | wangwu    |
|  3 | lisi      |
|  4 | tianqi    |
|  5 | jiaoshou  |
|  6 | hanmeimei |
|  7 | lilei     |
+----+-----------+
7 rows in set (0.00 sec)

#查询名字不是lilei的学生信息
mysql> select id,name from xjj where name regexp '[^lilei]';
+----+-----------+
| id | name      |
+----+-----------+
|  1 | liuyi     |
|  2 | wangwu    |
|  3 | lisi      |
|  4 | tianqi    |
|  5 | jiaoshou  |
|  6 | hanmeimei |
|  8 | caicai    |
+----+-----------+
7 rows in set (0.00 sec)

#查询学生名字不以lhgw各字母开头的学生信息
mysql> select id,name from xjj where name regexp '^[^lhgw]';
+----+----------+
| id | name     |
+----+----------+
|  4 | tianqi   |
|  5 | jiaoshou |
|  8 | caicai   |
+----+----------+
3 rows in set (0.00 sec)

二、运算符

MySQL 的运算符用于对记录中的字段值进行运算

MySQL 的运算符共有四种,分别是:算术运算符、比较运算符、逻辑运算符和位运算符

1.算术运算符

+ 加法
减法
* 乘法
/ 除法
% 取余

2.比较运算符

比较运算符是查询数据记录时经常使用的一类运算符

通过使用比较运算符可以判断出 表中有哪些记录是符合条件的,如果比较的结果(以布尔值的方式进行返回判断)为真则返回 1,如果为假则返回 0,比较的结果如果不确定则返回NULL

其中字符串在进行比较的时候默认是不区分大小写的,如果要区分大小写可以通过binary关键字来实现

= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
!=或<> 不等于
is null 判断一个值是否为 NULL
is not null 判断一个值是否不为 NULL
between and 两者之间
in 在集合中
like 通配符匹配
greatest 两个或多个参数时返回最大值
least 两个或多个参数时返回最小值
regexp 正则表达式
  • 与linux返回值表达相反,linux 中运行正常返回值是0,运行异常返回值是非0

条件成立就为1,不成立就为0

3.逻辑运算

①逻辑非(not):有0返回1,没0返回0,有null返回null

②逻辑与(and):有0返回0,没0返回1,有null返回null

③逻辑或(or): 前后都是0返回0,否则为1,前后有一个null为1,前后都是null(和0 or null)返回null

④逻辑异或(xor):前后相同为0,前后不同为1,有null返回null

not 或 ! 逻辑非
and 或 && 逻辑与
or 逻辑或
xor 逻辑异或
mysql> select 3<2;
+-----+
| 3<2 |
+-----+
|   0 |
+-----+
1 row in set (0.00 sec)


mysql> select 3!=4;
+------+
| 3!=4 |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select 5 between 2 and 6,'c' between 'a' and 'b';
+-------------------+-------------------------+
| 5 between 2 and 6 | 'c' between 'a' and 'b' |
+-------------------+-------------------------+
|                 1 |                       0 |
+-------------------+-------------------------+
1 row in set (0.00 sec)

mysql> select 5 in (1,2,3);
+--------------+
| 5 in (1,2,3) |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

mysql> select least(3,5,8),greatest(3,4,5);
+--------------+-----------------+
| least(3,5,8) | greatest(3,4,5) |
+--------------+-----------------+
|            3 |               5 |
+--------------+-----------------+
1 row in set (0.00 sec)

4.位运算符

①按位与( & ):1 1 得 1,否则为0

②按位或( | ):有1 得1,否则为0

③按位异或( ^ ): 不同得1,否则为0

④按位取反( ~ ):取反计算,1 1得1,否则为0

& 按位与
| 按位或
~ 按位取反
^ 按位异或
<< 按位左移
>> 按位右移
  • 先转换为二进制,再运算
  • 在使用过程中都有优先级问题。运算符的优先级决定了不同的运 算符在计算过程中的先后顺序。级别高的运算符会先进行计算,如果运算符的级别相同, MySQL 会按照顺序从左到右依次进行计算,优先级如下表所示:
1
2 ~
3 ^
4 *、/、%
5 +,-
6 >>,<<
7 &
8 |
9 =,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
10 BETWEEN,CASE,WHEN,THEN,ELSE
11 NOT
12 &&,AND
13 ,OR,XOR
14 :=
mysql> select 3 and 4,0 && null;null and null;
+---------+-----------+
| 3 and 4 | 0 && null |
+---------+-----------+
|       1 |         0 |
+---------+-----------+
1 row in set (0.00 sec)

mysql> select 2 and 3,4 && 0,4 && null,0 and null,null and null;
+---------+--------+-----------+------------+---------------+
| 2 and 3 | 4 && 0 | 4 && null | 0 and null | null and null |
+---------+--------+-----------+------------+---------------+
|       1 |      0 |      NULL |          0 |          NULL |
+---------+--------+-----------+------------+---------------+

mysql> select 2 or 3,2 or 0,null or null,0 or 0,0 or null;
+--------+--------+--------------+--------+-----------+
| 2 or 3 | 2 or 0 | null or null | 0 or 0 | 0 or null |
+--------+--------+--------------+--------+-----------+
|      1 |      1 |         NULL |      0 |      NULL |
+--------+--------+--------------+--------+-----------+
1 row in set (0.00 sec)

mysql> select 0 or null or 2;
+----------------+
| 0 or null or 2 |
+----------------+
|              1 |
+----------------+
1 row in set (0.00 sec)

mysql> select 2 xor 3,1 xor 0,null xor null,0 xor null;
+---------+---------+---------------+------------+
| 2 xor 3 | 1 xor 0 | null xor null | 0 xor null |
+---------+---------+---------------+------------+
|       0 |       1 |          NULL |       NULL |
+---------+---------+---------------+------------+
1 row in set (0.00 sec)

总结

1.逻辑运算

①逻辑非(not):有0返回1,没0返回0,有null返回null

②逻辑与(and):有0返回0,没0返回1,有null返回null

③逻辑或(or): 前后都是0返回0,否则为1,前后有一个null为1,前后都是null(和0 or null)返回null

④逻辑异或(xor):前后相同为0,前后不同为1,有null返回null

2.位运算符

①按位与( & ):1 1 得 1,否则为0

②按位或( | ):有1 得1,否则为0

③按位异或( ^ ): 不同得1,否则为0

④按位取反( ~ ):取反计算,1 1得1,否则为0

3.比较运算符

条件成立就为1,不成立就为0
mark

Guess you like

Origin blog.csdn.net/weixin_53560205/article/details/121021305