ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2020-06-24 13:01:56  阅读:269  来源: 互联网

标签:匹配 name 必知 Mysql products 必会 prod where select


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                                                                                        

标签:匹配,name,必知,Mysql,products,必会,prod,where,select
来源: https://www.cnblogs.com/laonicc/p/12509506.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有