【SQL必知必会】第6课 用通配符进行过滤


6.1 LIKE 操作符

6.1.1 百分号?%?通配符

检索任意以Fish开头的词不过后面有多少。

1 SELECT prod_id, prod_name
2 FROM Products
3 WHERE prod_name LIKE 'Fish%';
4 
5 /*
6   在执行这条子句时,将检索任意以Fish开头的词不管后面是什么。
7 */

 表示文本中含有"bean bag"

1 SELECT prod_id, prod_name
2 FROM Products
3 WHERE prod_name LIKE '%bean bag%';
4 
5 /*
6 表示文本中含有"bean bag"
7 */

找出以F开头y结尾的所有产品

 1 SELECT prod_name
 2 FROM Products
 3 WHERE prod_name LIKE 'F%y';
 4 
 5 /*
 6 找出以F开头y结尾的所有产品
 7 
 8 后面所跟的空格,有些DBMS会利用空格填补剩余的字符
 9 此时,“Fish bean bag toy”不能被匹配
10 
11 注意:LIKE不能匹配NULL
12 */

注意:某些DBMS会利用空格来填充剩余字符,此时则无法匹配以y结尾的字段了。


6.1.2 下划线?_?通配符

只能匹配一个字符

1 SELECT prod_id, prod_name
2 FROM Products
3 WHERE prod_name LIKE '__ inch teddy bear';

对照 "%"的匹配方法

1 SELECT prod_id, prod_name
2 FROM Products
3 WHERE prod_name LIKE '% inch teddy bear';


6.1.3 方括号?[ ]?通配符(Navicat 无法执行)

方括号[]通配符用来指定一个字符,它必须匹配指定位置通配符的位置的一个字符。

例如:找出所有名字以J 或M 起头的联系人

1 /*
2 
3   例如:找出所有名字以J 或M 起头的联系人
4 */
5 SELECT cust_contact
6 FROM Customers
7 WHERE cust_contact LIKE '[JM]%'
8 ORDER BY cust_contact;

此通配符可以用前缀字符^?(脱字号)?来否定。

 1 #此通配符可以用前缀字符^?(脱字号)?来否定。
 2 SELECT cust_contact
 3 FROM Customers
 4 WHERE cust_contact LIKE '[^JM]%'
 5 ORDER BY cust_contact;
 6 
 7 # 注意某些DBMS会用"!"
 8 /*
 9 等价下面这条语句:
10 SELECT cust_contact
11 FROM Customers
12 WHERE NOT cust_contact LIKE '[JM]%'
13 ORDER BY cust_contact;
14 */


小结

  • 不要过度使用通配符。如果其他操作符达到相同的目的,应该使用其他操作符。

  • 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开始处。把通配符置于开始处搜索起来是最慢的。

  • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。