Mysql必知必会学习笔记(六)

LIKE操作符

通配符(wildcard) 用来匹配值的一部分的特殊字符。
搜索模式(search pattern)由字面值、通配符或两者组合构成的搜索条件。

通配符本身实际是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符。
 (1)百分号(%)通配符
为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。
区分大小写 根据MySQL的配置方式,搜索可以是区分大小写的。如果区分大小写,'jet%'与JetPack 1000将不匹配。
在搜索中,%表示任何字符出现任意次数。例如,为了找出所有以词jet起头的产品,可使用以下select语句

%是接受jet之后的任意字符,不管它有多少字符
mysql> select vend_id,prod_name from products where prod_name like 'Jet%' ;
+---------+--------------+
| vend_id | prod_name    |
+---------+--------------+
|    1005 | JetPack 1000 |
|    1005 | JetPack 2000 |
+---------+--------------+
2 rows in set (0.00 sec)

mysql> select vend_id,prod_name from products where prod_name like 'jet%' ;
+---------+--------------+
| vend_id | prod_name    |
+---------+--------------+
|    1005 | JetPack 1000 |
|    1005 | JetPack 2000 |
+---------+--------------+
2 rows in set (0.00 sec)

 通配符可以在搜索模式中任意位置使用,可以使用多个通配符


select prod_id, prod_name from products where prod_name like '%anvil%';
mysql> select prod_id, prod_name from products where prod_name like '%anvil%';
+---------+--------------+
| prod_id | prod_name    |
+---------+--------------+
| ANV01   | .5 ton anvil |
| ANV02   | 1 ton anvil  |
| ANV03   | 2 ton anvil  |
+---------+--------------+
3 rows in set (0.00 sec)

 


找出所有以s起头以e结尾的所有产品

select prod_id, prod_name from products where prod_name like 's%e';
mysql> select prod_id, prod_name from products where prod_name like 's%e';
+---------+-----------+
| prod_id | prod_name |
+---------+-----------+
| SAFE    | Safe      |
+---------+-----------+
1 row in set (0.00 sec)
如果要搜索的数据,最后有一个尾空格,会影响通配符的使用,解决办法就是在末尾加一个%

%通配符可以匹配任何东西,但是不匹配NULL
 要的是要注意到,除了一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。

(2)下划线(_)通配符

与%用途一样,但是下划线匹配单个字符而不是多个字符

显示“ ton anvil”中只存在一个字符的字段

select prod_id, prod_name from products where prod_name like '_ ton anvil';
+---------+-------------+
| prod_id | prod_name   |
+---------+-------------+
| ANV02   | 1 ton anvil |
| ANV03   | 2 ton anvil |
+---------+-------------+
2 rows in set (0.00 sec)

mysql> select prod_id, prod_name from products where prod_name like '% ton anvil';
+---------+--------------+
| prod_id | prod_name    |
+---------+--------------+
| ANV01   | .5 ton anvil |
| ANV02   | 1 ton anvil  |
| ANV03   | 2 ton anvil  |
+---------+--------------+
3 rows in set (0.00 sec)
2、使用通配符的技巧

(1)不要过度使用通配符,能不用就不用

(2)把通配符置于搜索模式开始处,搜索起来最慢

(3)要注意通配符位置,放错地方,可能不会返回预期效果

 第9章 用正则表达式进行搜索

1、使用MySQL正则表达式

(1)基本字符匹配

检索列prod_name包含文本1000的所有行

select prod_name from products where prod_name regexp '1000' order by prod_name;
mysql> select prod_name from products where prod_name regexp '1000' order by prod_name;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.00 sec)

关键字regexp后所跟的东西作为正则表达式,与文字正文1000匹配的一个正则表达式处理

使用正则表达式.000  . 是正则表达式语言中搞一个特殊的字符。表示匹配任意一个字符,因此1000和2000都返回

select prod_name from products where prod_name regexp '.000' order by prod_name;
mysql> select prod_name from products where prod_name regexp '.000' order by prod_name;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)

 

LIKE和REGEXP之间有一个重要差别

select prod_name from products where prod_name like '1000' order by prod_name;
mysql> select prod_name from products where prod_name like '1000' order by prod_name;
Empty set (0.00 sec)
此处不返回数据,like匹配整个列。如果匹配的文本仅是在列中出现(就是不完全相同),like不会找到它

select prod_name from products where prod_name regexp '1000' order by prod_name;
mysql> select prod_name from products where prod_name regexp '1000' order by prod_name;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.00 sec)
而regexp实在列值内进行匹配,如果被匹配的文本在列值中出现,regexp会找到它,相应行会被返回。

用regexp也可以用来匹配整个列(从而和like相同),使用^和$定位符即可

在MySQL中的正则表达式匹配不区分大小写,为区分大小写,可使用binary关键字,如下

select prod_name from products where prod_name regexp binary 'JetPack .000';
mysql> select prod_name from products where prod_name regexp 'JetPack .000';
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)

mysql> select prod_name from products where prod_name regexp binary 'jetPack .000';
Empty set (0.00 sec)

 

(2)进行OR匹配

为搜索两个串之一,使用|,如下所示

select prod_name from products where prod_name regexp '1000|2000' order by prod_name;
mysql> select prod_name from products where prod_name regexp '1000|2000' order by prod_name;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)
两个以上or条件,例如‘1000|2000|3000’,将匹配1000或2000或3000

(3)匹配几个字符之一

如何匹配特定字符,用 [ 和 ] 括起来的字符完成,如下所示

select prod_name from products where prod_name regexp ‘[123] Ton’ order by prod_name;

使用正则表达式[123],定义了一组字符,意思是匹配1或2或3

(4)匹配范围

集合可以用定义要匹配的一个或多个字符,如[0123456789]会匹配数字0到9,为了简化,可以写成[0-9]

select prod_name from products where prod_name regexp ‘[1-5] Ton’ order by prod_name;

(5)匹配特殊字符

为了匹配特殊字符,必须用 \\ 为前导,\\- 表示 -,\\. 表示.

select prod_name from vendors where vend_name regexp ‘\\.’ order by vend_name;

(6)匹配字符类

(7)匹配多个实例

select prod_name from products where prod_name regexp ‘\\([0-9) sticks?\\)’ order by prod_name;

正则表达式\\([0-9) sticks?\\),[0-9]匹配任意字符,sticks?匹配stick和sticks(s后的?使s可选)

select prod_name from products where prod_name regexp ‘[[:digit:]]{4}’ order by prod_name;

如前所述, [:digit:]匹配任意数字, 因而它为数字的 个集合。 {4}确切地要求它前面的字符(任意数字) 出现4次, 所以[[:digit:]]

{4}匹配连在 起的任意4位数字。

(8)定位符

select prod_name from products where prod_name regexp ‘A[0-9\\.]’ order by prod_name;

^匹配串的开始。因此,"[0-9\\.]只在.或任意数字为串中第一个字符时才匹配它们。没有^,则还要多检索出4个别的行(那些中间有数字的行)。
 
————————————————
版权声明:本文为CSDN博主「搞IT的王蜀黍」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yilouwen7522/article/details/81091139
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2020-06-24 12:56  爬行的龟  阅读(195)  评论(0编辑  收藏  举报
如有错误,欢迎指正 邮箱656521736@qq.com