我们用来示例的表叫 PRODUCTS。
![7b9205a09317d6654e24e5969c1e22c1.png](https://i-blog.csdnimg.cn/blog_migrate/e0d0cc8df69b8e800898c346b4b262e3.jpeg)
我们之前的搜索,都是建立在去和一个已知的值进行匹配的,比如价格大于 2,或者名称等于 aaa 之类的,那假如我们要实现检索出产品名称中包含 abc 的产品,这个时候就需要使用通配符了。
通配符只能用于文本字段,非文本字段不能使用通配符搜索。
百分号通配符
select * from PRODUCTS where PROD_NAME like 'Fish%';
%
表示任何字符出现任意次数(包括 0 个字符),这里我们就实现了找出所有以 fish 开头的产品名称。
通配符可以在任意位置中使用,且可以写多个。
select * from PRODUCTS where PROD_NAME like '%bean bag%';
这句 SQL 就表示只要 PROD_NAME 包含「bean bag」,无论前后是有任何字符,还是没有字符,都会被检索出来。
(注:如果某列的数据类型是 50 个字符,而实际存储的文本不满 50 个字符,有些 DBMS 会用空格填补内容,那如果你写了一个 'g%d' 的字面量,表示匹配以 g 开头的,以 d 结尾的内容,在这种情况下可能不会工作,因为实际内容变成以空格结尾了,所以可以考虑改写为 'g%d%')
下划线通配符
和 %
类似,但是它只匹配一个字符,这个字符必须存在,不能为空。
select * from PRODUCTS where PROD_NAME like '_ish bean bag toy';
可以匹配到 PROD_NUM = 'Fish bean bag toy' 这条数据,但如果这样写,就匹配不到了:
select * from PRODUCTS where PROD_NAME like '_Fish bean bag toy';
方括号通配符
和下划线通配符类似,也是要匹配到一个字符,不过有些 DBMS 不支持。
select * from PRODUCTS where PROD_NAME like '[AB]ish bean bag toy';
方括号中表示这个字符的字符集,也可以用 [^AB]
来表示否定,即这个位置是要以除了 A、B 两个字符以外的字符。
通配符使用提示
由于通配符的搜索要比之前那些搜索的方式要慢,所以如果有其他操作符可以达到相同的目的的话,尽量避免使用通配符。如果真的要使用,也尽量不要以通配符开头,因为通配符开头的搜索是最慢的。