SQL 入门笔记(六)使用通配符进行过滤
这一节将记录如何使用 LIKE
操作符进行通配搜索,以便对数据进行复杂过滤
LIKE
操作符
前面的大小比较,或者检查某个范围的值都是对于数字来说的
而使用 LIKE
加上 通配符(wildcard)
可实现对于字符串的过滤
百分号(%
)通配符
最常使用的通配符是百分号(%
) ,%表示任何字符出现任意次数
例如,下面找出所有以单词Fish
起头的产品
1 | SELECT prod_id , prod_name |
注意:区分大小写
根据DBMS的不同及其配置,搜索是可以区分大小写的 ,经过测试,在我这里它是不区分的
通配符可以在搜索模式的任意位置使用任意次数,例如下面使用两个通配符,它们位于模式的两端
1 | SELECT prod_id , prod_name |
说明:请注意后面所跟的空格
有些DBMS会使用空格来填补字段的内容 ,例如某列有 50 个字符,而存储的文本为 Fish bean bag toy
(17个字符),则为填满该列需要在文本后附加 33 个空格。这样一来试图使用'F%y'
就无法检索出该文本(虽然在我的 MySQL 中并不会这样)。诚然,你可以使用'F%y%'
,但是更好的方法是使用函数去除空格 ,这种方法在后面会讲
下划线(_
)通配符
另一个常用的的就是下划线(_
),它只匹配单个字符
说明:DB2 通配符
DB2
不支持通配符 _
举一个例子:
1 | SELECT prod_id , prod_name |
因为规定了是两个字符,所以 8 inch teddy bear
并没有被匹配,你可以替换成%
来对比一下不同的效果
方括号([]
)通配符
这东西我感觉是从正则表达式里面拿过来的,作用是对一个位置指定一个匹配字符集
说明:并不总是支持集合
并不是所有的DBMS都支持创建集合[]
,微软的 SQL Server
支持这一写法,但包括我使用的MySQL在内,Oracle,DB2,SQLite都不支持
例如,要找出所有以 J 或 M 开头的联系人,可进行如下查询
1 | SELECT cust_contact |
因为我这里不支持这种语法,我就不贴图了
和正则表达式中的一样,可以使用脱字符(^
)来否定,例如可以查找不以 J 或 M 开头的联系人
1 | SELECT cust_contact |
当然,也可以使用 NOT
操作符得出类似的效果,^
唯一的优点是在使用多个 WHERE
子句时简化语法
使用通配符的技巧
以下是书中记录的一些技巧
- 不要过度使用通配符 ,如果其他操作符能达到相同的目的,应当使用其他操作符
- 在确实需要使用通配符时,也尽量不要把它们用在搜索模式的开头 ,这样搜起来是最慢的
- 仔细注意通配符的位置,通配符很容易放错位置