SQL 通配符

SQL通配符是用于在字符串比较中进行模式匹配的特殊字符,通常与LIKE操作符结合使用,实现对数据库中文本数据的灵活搜索。

SQL 通配符概述

在SQL查询中,通配符提供了强大的模式匹配能力,使我们能够搜索包含特定模式的数据,而不仅仅是精确匹配。

SQL通配符主要用于以下场景:

  • 搜索包含特定字符序列的文本
  • 匹配特定格式的数据
  • 过滤符合某种模式的数据记录

在SQL中,常用的通配符包括:

通配符 描述
% 替代0个或多个字符的任意序列
_ 替代恰好一个任意字符
[charlist] 匹配字符列表中任何一个单一字符
[^charlist] 或 [!charlist] 匹配不在字符列表中的任何一个单一字符

演示数据库

在本教程中,我们将使用Northwind示例数据库进行演示。

下面是选自"Customers"表的部分数据:

CustomerID CustomerName ContactName Address City PostalCode Country
1 Alfreds Futterkiste Maria Anders Obere Str. 57 Berlin 12209 Germany
2 Ana Trujillo Emparedados y helados Ana Trujillo Avda. de la Constitución 2222 México D.F. 05021 Mexico
3 Antonio Moreno Taquería Antonio Moreno Mataderos 2312 México D.F. 05023 Mexico
4 Around the Horn Thomas Hardy 120 Hanover Sq. London WA1 1DP UK
5 Berglunds snabbköp Christina Berglund Berguvsvägen 8 Luleå S-958 22 Sweden

使用 % 通配符

% 通配符可以匹配任意长度的字符序列(包括零个字符)。这是最常用的通配符。

匹配以特定字符串开头的数据

查找City以"ber"开头的所有客户:

实例

SELECT * FROM Customers
WHERE City LIKE 'ber%';

结果说明:将返回所有City字段以"ber"开头的记录,如"Berlin"。

匹配包含特定字符串的数据

查找City中包含"es"的所有客户:

实例

SELECT * FROM Customers
WHERE City LIKE '%es%';

结果说明:将返回所有City字段中包含"es"的记录,如"London"不匹配,"Mexico"可能匹配。

匹配以特定字符串结尾的数据

查找City以"on"结尾的所有客户:

实例

SELECT * FROM Customers
WHERE City LIKE '%on';

使用 _ 通配符

_ 通配符用于匹配恰好一个任意字符。

匹配特定模式的字符串

查找City以任意单个字符开头,后面是"erlin"的所有客户:

实例

SELECT * FROM Customers
WHERE City LIKE '_erlin';

结果说明:将匹配"Berlin"(B是任意一个字符),但不会匹配"New Berlin"(因为前面有两个字符)。

使用多个 _ 通配符

查找City以"L"开头,然后是任意字符,接着是"n",再是任意字符,最后是"on"的所有客户:

实例

SELECT * FROM Customers
WHERE City LIKE 'L_n_on';

结果说明:这个模式可以匹配"London"(L + 任意字符o + n + 任意字符d + on)。

使用 [charlist] 字符集通配符

[charlist] 通配符用于匹配字符集中任何一个单一字符。

匹配指定字符集中的字符

查找City以"b"、"s"或"p"开头的所有客户:

实例

SELECT * FROM Customers
WHERE City LIKE '[bsp]%';

结果说明:将返回City以b、s或p开头的所有记录。

使用字符范围

查找City以"a"到"c"之间的任何字母开头的所有客户:

实例

SELECT * FROM Customers
WHERE City LIKE '[a-c]%';

结果说明:将匹配City以a、b或c开头的所有记录。

使用否定字符集

查找City不以"b"、"s"或"p"开头的所有客户:

实例

SELECT * FROM Customers
WHERE City LIKE '[^bsp]%';

注意:某些数据库系统使用[!charlist]语法来表示否定字符集。

通配符组合使用技巧

通配符可以组合使用,创建更复杂的搜索模式:

组合使用实例

-- 查找第二个字符为'a'的所有城市
SELECT * FROM Customers
WHERE City LIKE '_a%';

-- 查找以'M'开头且包含'ex'的城市
SELECT * FROM Customers
WHERE City LIKE 'M%ex%';

-- 查找以字母A-G开头,且以'n'结尾的城市
SELECT * FROM Customers
WHERE City LIKE '[A-G]%n';

注意事项

  • 通配符搜索通常比精确匹配搜索更耗时
  • 尽量避免在搜索模式的开始使用通配符(如%pattern),这会阻止索引的使用
  • 不同的数据库系统对通配符的支持可能略有差异
  • 在MySQL中,[charlist]需要使用REGEXP操作符