TOP

SQL 课程 5. 通配符和正则表达式 (LIKE)

通常,为了过滤数据,我们需要的不是通过条件的精确匹配进行采样,而是通过近似值进行采样。也就是说,例如,当我们搜索名称与特定模式(正则表达式)匹配或包含特定符号或单词的产品时。为此,SQL 中有一个运算符 LIKE,用于查找近似值。为了构建这样的模式,使用元字符(特殊字符,用于搜索部分值),即:“百分号”(%)或星号(*),“下划线”(_)或“问号”(?) 、“方括号”([ ])。


1. 元字符百分号 (%) 或星号 (*)

例如,我们从表中选择仅与名称中包含单词 Skis 的产品相关的记录。为此,我们将创建一个合适的模板:

Run SQLSELECT * 
FROM Sumproduct 
WHERE Product LIKE '*Skis*'

正如您所看到的,DBMS 仅选择“产品”列中包含包含单词 Skis 的产品的记录。

此示例使用星号 (*) 元字符,因为 MS Access 不支持 LIKE 运算符的“百分号”(%)。

2. 元字符下划线(_)或问号(?)

下划线或问号用于替换单词中的单个字符。让我们将 Bikes 一词中的所有元音替换为“问号”(?) 并查看结果:

Run SQLSELECT * 
FROM Sumproduct 
WHERE Product LIKE 'B?k?s'
我们使用“问号”(?) 元字符,因为 MS Access 不支持 LIKE 运算符的“下划线”(_)。

3. 元字符方括号([ ])

方括号元字符 ([ ]) 用于同时指定要搜索的一组字符。

SELECT * 
FROM Sumproduct 
WHERE City LIKE '[TN]*'

在上面的示例中,我们在 City 字段中选择了城市名称以字母 T 或 N 开头的记录。

MySQL 方言不支持方括号元字符 ([ ])。

另外,在这种情况下,我们可以使用另一个元字符来执行相反的操作。让我们在正则表达式中添加一个感叹号 (!),这意味着“不等于”(对于 MS Access)或一个幂号 (^)(对于其他 DBMS)。

SELECT * 
FROM Sumproduct 
WHERE City LIKE '[!TN]*'

也就是说,我们创建的最后一个查询将被读取为:从 Sumproduct 表中选择所有列,并且仅选择 City 字段中城市名称不以字母 T 或 N 开头的记录。此外,我们注意到“方括号”元字符中的一组字母仅对应于文本中的一个位置。

如果我们使用我们已经知道的 NOT 运算符,我们可以获得类似的结果,但带有感叹号 (!) 的记录会更短。