通配符(wildcard) 用来匹配值的一部分的特殊字符。
搜索模式(search pattern) 由字面值、通配符或两者组合构成的搜索条件
最常使用的通配符是百分号(%)。在搜索串中, %表示任何字符出现任意次数。
为了找出所有以词jet起头的产品,可使用以下SELECT语句:
select prod_id,prod_name from products
where prod_name like 'jet%';
区分大小写 根据MySQL的配置方式,搜索可以是区分大小写的。如果区分大小写,'jet%’与JetPack 1000将不匹配
注意尾空格 尾空格可能会干扰通配符匹配。例如,在保存词anvil时,如果它后面有一个或多个空格,则子句WHERE prod_name LIKE '%anvil’将不会匹配它们,因为在最后的l后有多余的字符。解决这个问题的一个简单的办法是在搜索模式最后附加一个%。一个更好的办法是使用函数(第11章将会介绍)去掉首尾空格。
注意NULL 虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。即使是WHERE prod_name LIKE '%’也不能匹配用值NULL作为产品名的行
下划线的用途与%一样,但 下划线只匹配单个字符而不是多个字符。
select prod_id,prod_name from products
where prod_name like '_ ton anvil';
select prod_id,prod_name from products
where prod_name like '% ton anvil';
❑ 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
❑ 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
❑ 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
***正则表达式是用来匹配文本的特殊的串(字符集合)***。如果你想从一个文本文件中提取电话号码,可以使用正则表达式。如果你需要查找名字中间有数字的所有文件,可以使用一个正则表达式。如果你想在一个文本块中找到所有重复的单词,可以使用一个正则表达式。如果你想替换一个页面中的所有URL为这些URL的实际HTML链接,也可以使用一个正则表达式(对于最后这个例子,或者是两个正则表达式)。
检索列prod_name包含文本1000的所有行:
select prod_name from products
where prod_name regexp '1000'
order by prod_name;
select prod_name from products
where prod_name regexp '.000'
order by prod_name;
匹配不区分大小写 MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大小写,可使用BINARY关键字,如WHERE prod_nameREGEXP BINARY ‘JetPack .000’。
为搜索两个串之一(或者为这个串,或者为另一个串),使用|,如下所示:
select prod_name from products
where prod_name regexp '1000|2000'
order by prod_name;
两个以上的OR条件 可以给出两个以上的OR条件。例如,'1000 | 2000 | 3000’将匹配1000或2000或3000。
可通过指定一组用[和]括起来的字符来完成, 如下所示:
select prod_name from products
where prod_name regexp '[123] Ton'
order by prod_name;
集合可用来定义要匹配的一个或多个字符。
例如,下面的集合将匹配数字0到9:
[0-9]
select prod_name from products
where prod_name regexp '[1-5] Ton'
order by prod_name;
为了匹配特殊字符,必须用\为前导。\-表示查找-, \.表示查找 .
select prod_name from products
where prod_name regexp '\\.'
order by prod_name;
\或\? 多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)。
目前为止使用的所有正则表达式都试图匹配单次出现。如果存在一个匹配,该行被检索出来,如果不存在,检索不出任何行。但有时需要对匹配的数目进行更强的控制。例如,你可能需要寻找所有的数,不管数中包含多少数字,或者你可能想寻找一个单词并且还能够适应一个尾随的s(如果存在),等等。
select prod_name from products
where prod_name regexp '\\([0-9] sticks?\\)'
order by prod_name;
select prod_name from products
where prod_name regexp '^[0-9\\.]'
order by prod_name;
^的双重用途 ^有两种用法。在集合中(用[和]定义),用它来否定该集合,否则,用来指串的开始处。
使REGEXP起类似LIKE的作用 LIKE和REGEXP的不同在于,LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用与LIKE一样。
简单的正则表达式测试 可以在不使用数据库表的情况下用SELECT来测试正则表达式。REGEXP检查总是返回0(没有匹配)或1(匹配)。可以用带文字串的REGEXP来测试表达式,并试验它们
select 'hello' regexp [0-9]
这个例子显然将返回0(因为文本hello中没有数字)。