这一节将记录如何使用 LIKE 操作符进行通配搜索,以便对数据进行复杂过滤

LIKE 操作符

前面的大小比较,或者检查某个范围的值都是对于数字来说的

而使用 LIKE 加上 通配符(wildcard)可实现对于字符串的过滤

百分号(%)通配符

最常使用的通配符是百分号(%) ,%表示任何字符出现任意次数

例如,下面找出所有以单词Fish起头的产品

1
2
3
SELECT prod_id , prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';

注意:区分大小写

根据DBMS的不同及其配置,搜索是可以区分大小写的 ,经过测试,在我这里它是不区分的

通配符可以在搜索模式的任意位置使用任意次数,例如下面使用两个通配符,它们位于模式的两端

1
2
3
SELECT prod_id , prod_name
FROM Products
WHERE prod_name LIKE '%bean bag%';

说明:请注意后面所跟的空格

有些DBMS会使用空格来填补字段的内容 ,例如某列有 50 个字符,而存储的文本为 Fish bean bag toy (17个字符),则为填满该列需要在文本后附加 33 个空格。这样一来试图使用'F%y'就无法检索出该文本(虽然在我的 MySQL 中并不会这样)。诚然,你可以使用'F%y%',但是更好的方法是使用函数去除空格 ,这种方法在后面会讲

下划线(_)通配符

另一个常用的的就是下划线(_),它只匹配单个字符

说明:DB2 通配符

DB2 不支持通配符 _

举一个例子:

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

因为规定了是两个字符,所以 8 inch teddy bear 并没有被匹配,你可以替换成%来对比一下不同的效果

方括号([])通配符

这东西我感觉是从正则表达式里面拿过来的,作用是对一个位置指定一个匹配字符集

说明:并不总是支持集合

并不是所有的DBMS都支持创建集合[],微软的 SQL Server 支持这一写法,但包括我使用的MySQL在内,Oracle,DB2,SQLite都不支持

例如,要找出所有以 J 或 M 开头的联系人,可进行如下查询

1
2
3
4
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[JM]%'
ORDER BY cust_contact ;

因为我这里不支持这种语法,我就不贴图了

和正则表达式中的一样,可以使用脱字符(^)来否定,例如可以查找不以 J 或 M 开头的联系人

1
2
3
4
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[^JM]%'
ORDER BY cust_contact ;

当然,也可以使用 NOT 操作符得出类似的效果,^唯一的优点是在使用多个 WHERE 子句时简化语法

使用通配符的技巧

以下是书中记录的一些技巧

  • 不要过度使用通配符 ,如果其他操作符能达到相同的目的,应当使用其他操作符
  • 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开头 ,这样搜起来是最慢的
  • 仔细注意通配符的位置,通配符很容易放错位置