LIKE
操作符
通配符(wildcard):用来匹配值的一部分的特殊字符
搜索模式(search pattern):由字面值、通配符或者两者组合构成的搜索条件
不管是匹配一个值还是多个值,检验大于还是小于已知值,或者检查某个范围的值,其共同特点是过滤中使用的值都是已知的
但是有时侯,已知条件并不是这么明确,需要模糊一点匹配条件;这时候就需要使用通配符
利用通配符,可以创建比较特定数据的搜索模式
通配符本身实际上,是 SQL 的 WHERE
子句中含有特殊含义的字符
为了在搜索子句中使用通配符,必须使用 LIKE
操作符
LIKE
操作符指示 DBMS,后跟的搜索模式利用通配符匹配,而不是简单的相等匹配进行比较
通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索
谓语(predicate):操作符何时不是操作符?当它作为谓语时。
从技术上说,LIKE
是谓语而不是操作符
百分号(%
)通配符
在搜索串中,
%
表示任何字符出现任意次数
任意次数指,除了表示一个或者多个字符外,还可以表示 0 个字符
这里使用了搜索模式 ‘TNT%’
;在执行这条子句时,将检索任意以 TNT
开头的词,%
告诉 DBMS 接受 TNT
之后的任意字符,不管它有多少字符
在 mysql 中,搜索时不区分大小写的,但是根据 DBMS 的不同及其配置,搜索是可以区分大小写的
通配符可以在搜索模式中的任意位置使用,并且可以使用多个通配符
例如,在模式的两端使用两个通配符
注意
NULL
:
通配符%
看起来可以匹配任何东西,但是不包括NULL
例如,子句 WHERE prod_name LIKE ‘%’
不会匹配产品名称为 NULL
的行
注意空格:
尾空格可能会干扰通配符匹配
例如,在保存词 anvil
时,如果它后面有一个或多个空格,则子句 WHERE prod_name LIKE ‘%anvil’
将不会匹配,因为后面有多余的字符;可以在后面再加一个 %
或者去掉首尾空格
下划线(_
)通配符
下划线的用途与
%
是一样的,但是它只匹配单个字符,而不是多个字符
可以比较下面两个代码
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';
方括号([]
)通配符
方括号用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符
但并不是所有的 DBMS 都支持创建集合的 []
如下子句中,模式为 '[JM]%'
,使用了两个不同的通配符
[JM]
匹配方括号中任意一个字符,它也只能匹配单个字符;任何多于一个字符的名字都不匹配
[JM]
之后的 %
通配符匹配第一个字符之后的任意数目的字符,返回所需的结果
此通配符可以使用前缀字符 ^
(脱字号)来否定
[^JM]
匹配 J和M 之外的任意字符开始的任意联系人名;作用同 NOT
使用通配符的技巧
使用通配符一般比前面说的搜索需要耗费更长的时间,因此
- 不要过度使用通配符,如果其他操作符可以达到相同的目的,就使用其他的操作符
- 在确实需要使用通配符时,尽量不要把它们用在搜索模式的开始处,把通配符置于开始处,搜索最慢
- 注意通配符的位置,一旦放错,返回数据会出错