数据过滤——通配符
- 通配符(wildcard):用来匹配值的一部分的特殊字符
- 搜索模式(search pattern):由字面值、通配符或两者组合构成的搜索条件
- LIKE操作符:为了在搜索子句使用通配符,需要使用LIKE操作符,LIKE操作符指示数据库,后面跟着的搜索模式会利用通配符匹配而不是直接相等匹配。
- 谓词(predicate):从技术上讲,LIKE是谓词而不是操作符,虽然最终得到的结果是相同的。
1. 百分号%通配符
- %通配符是最常使用的通配符,在搜索串中,%表示任何字符出现任意次数
- 区分大小写:MySQL的配置方式中,搜索是区分大小写的
- 通配符可以在搜索模式中任意位置使用,且可以使用多个通配符
- 注意尾空格:尾空格可能会干扰通配符的匹配,例如在保存词anvil时,如果它后面有一个或多个空格,那么子句
WHERE prod_name LIKE '%anvil'
将不会匹配到它,因为结尾的l后有多余的字符。解决问题的一个简单办法是在搜索模式结尾再附加一个%,更好的办法是使用函数去掉首尾空格。 - 可以匹配0个字符:除了一个和多个字符外,%还可以匹配0个字符
- 注意NULL:虽然%看起来可以匹配任何东西,但是它依然不能匹配到NULL值
# 找到所有以jet起头的词
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'jet%'
# 找到任何包含anvil的值
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '%anvil%'
# 找到以s起头,以e结尾的所有产品
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 's%e'
2. 下划线(_)通配符
- 下划线通配符的用途与%一样,不同的是,下划线只匹配单个字符而不是多个字符
- 事实上,当知道要查询的值有几个字符时,就可以使用下划线通配符
# 查询有3个字符的行
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '___'
_总是匹配一个字符,不会多也不会少
3. 使用通配符的技巧
通配符对我们而言是“高效的”,但这种高效是有代价的,使用通配符搜索的处理一般要比之前讨论过的所花时间更长。
- 不要过度使用通配符,如果其他操作符可以达到相同目的,优先使用其他操作符
- 在确实需要使用通配符时,除非绝对必要,否则不要用在搜索模式的开始处,将通配符置于搜索模式的开始处搜索速度是最慢的
- 注意通配符的位置,如果位置不对,可能不会返回想要的数据