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