一、正则表达式
- 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