06 用通配符进行过滤
1.LIKE操作符
通配符:用来匹配值的一部分的特殊字符。实际上是SQL的WHERE子句中含有特殊含义的字符,在搜索子句中使用通配符,必须使用LIKE操作符指示DBMS,后跟的搜索模式利用通配符匹配而不是简单的相等匹配进行比较。
搜索模式:由字面值、通配符或者两者组合构成的搜索条件。
谓词:LIKE是谓词而不是操作符。操作法作为谓词时不是操作符。
通配符搜索只能用于文本字段(字符串),不能用于非文本数据类型字段。
(1)百分号(%)通配符
%表示任何字符出现任意次数,表示搜索模式中给定位置的0个、1个或多个字符,是最常用的通配符。
输入:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
输出:
搜索模式为'Fish%',检索任意Fish开头的词。根据DBMS的不同及其配置,搜索可以区分大小写,不过这里使用的MySQL没有区分。
通配符可以在搜索模式的任意位置使用,并且可以使用多个通配符。
下面使用两个位于模式两端的通配符,输入:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '%bean bag%';
输出:
搜索模式'%bean bag%'表示匹配任何位置上包含文本bean bag的值,不管它之前或之后出现什么字符。
通配符也可以出现在搜索模式的中间,下面找出以F开头,以y结尾的所有产品,输入:
SELECT prod_name
FROM Products
WHERE prod_name LIKE 'F%y';
输出:
注意,通配符%不能匹配NULL。子句WHERE prod_name LIKE '%'不会匹配产品名次为NULL的行。
(2)下划线(_)通配符
只能匹配单个字符。
输入:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '__ inch teddy bear';
输出:
该搜索模式只能匹配两个通配符。下面的SELECT语句使用%通配符,返回三行产品,输入:
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE '% inch teddy bear';
输出:
(3)方括号([])通配符
用来指定一个字符集,必须匹配指定位置的一个字符。
注意:MySQL不支持集合,因此以下检索不附上执行结果。
为了找出所有名字以J或M开头的联系人,可输入:
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
此通配符可以用前缀字符^(脱字号)来否定,优点是使用多个WHERE子句时可以简化语法。
输入:
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[^JM]%'
ORDER BY cust_contact;
也可以使用NOT操作符来否定,输入:
SELECT cust_contact
FROM Customers
WHERE NOT cust_contact LIKE '[JM]%'
ORDER BY cust_contact;
2.使用通配符的技巧
(1)不要过度使用通配符。若有操作符能达到相同目的,应该使用操作符。
(2)确实需要通配符时,尽量不要放在搜索模式的开始处,这样搜索速度很慢。
(3)仔细注意通配符的位置。