SQL通配符是用于在字符串比较中进行模式匹配的特殊字符,通常与LIKE操作符结合使用,实现对数据库中文本数据的灵活搜索。
在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] 通配符用于匹配字符集中任何一个单一字符。
查找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),这会阻止索引的使用[charlist]需要使用REGEXP操作符