SQL Server 模糊查询详解:LIKE 通配符用法与性能优化
在 SQL Server 数据库开发中,模糊查询是数据检索的常见需求。本文深入解析 LIKE 运算符及其四种主要通配符(%, _, [], [^])的使用规则,通过具体示例展示如何精准匹配字符串的前缀、后缀或任意位置内容,并介绍如何处理包含特殊符号的搜索场景。此外,文章还指出了以通配符开头查询对索引性能的影响,为构建高效 SQL 查询提供实用指导。
LIKE 关键字与基础通配符
在 SQL Server 中,LIKE 关键字用于在 WHERE 子句中搜索列中包含指定模式的记录。模式中可以包含普通字符和四种通配符,它们构成了灵活的模式匹配基础:
- %:代表零个、一个或多个任意字符。
- _:代表恰好一个任意字符。
- [list]:代表列表内指定的任意单个字符,例如
[abc]匹配 a、b 或 c。 - [-range]:代表指定范围内的任意单个字符,例如
[a-f]匹配 a 到 f 之间的任何字母。 - [^list] 或 [^range]:代表不在该集合或范围内的任意单个字符。
使用这些通配符时,务必将模式和字符串用单引号括起来。以下是几种典型的应用场景:
第1步:匹配前缀或后缀
当需要查找以特定字符开头或结尾的数据时,使用 % 置于另一端:
-- 查找以 'Mc' 开头的姓名
SELECT * FROM authors WHERE phone LIKE 'Mc%';
-- 查找以 'inger' 结尾的姓名
SELECT * FROM authors WHERE name LIKE '%inger';
第2步:匹配任意位置的内容
若需查找字符串中间包含特定内容的记录,可在两侧均使用 %:
-- 查找包含 'en' 的任何位置
SELECT * FROM authors WHERE name LIKE '%en%';
第3步:精确长度与首字母过滤
_ 常用于固定长度的格式验证,结合范围限定可缩小结果集:
-- 查找由六个字符组成且第五个字符为 'h' 的名称 (即 _heryl)
SELECT * FROM authors WHERE name LIKE '_heryl';
-- 查找以 M-Z 之间字母开头,并以 inger 结尾的名称
SELECT * FROM authors WHERE name LIKE '[M-Z]inger';
-- 查找以 M 开头,但第二个字母不是 c 的名称
SELECT * FROM authors WHERE name LIKE 'M[^c]%';
反向匹配与空值处理
除了正向搜索,还可以使用 NOT LIKE 来排除符合特定模式的记录,或者结合 IS NOT NULL 确保字段有实际值。
-- 查找区号不是 415 的所有电话号码
SELECT phone FROM authors WHERE phone NOT LIKE '415%';
-- 或者使用逻辑否定
SELECT phone FROM authors WHERE NOT phone LIKE '415%';
-- 确保电话不仅以 415 开头,而且不为空
SELECT phone FROM authors WHERE phone LIKE '415%' AND phone IS NOT NULL;
注意:如果直接使用赋值运算符 =(如 phone = '415%' ),通配符将被解释为普通字符,即只查找字面量为“415%”这一串字符的记录,而不会执行模式匹配。
高级技巧:搜索特殊字符与转义
当数据本身包含通配符字符(如 % 或 _)时,直接搜索会导致意外匹配。此时有两种标准方法:
使用 ESCAPE 关键字定义转义符
可以通过 ESCAPE 子句指定一个转义字符,通常选择斜杠 / 或其他非查询字符。在模式中,当转义符置于通配符之前时,该通配符被视为普通字符。
-- 查找包含字符串 '5%' 的记录
SELECT * FROM table_name WHERE ColumnA LIKE '%5/%%' ESCAPE '/';
上述查询中,第一个 % 和最后一个 % 仍是通配符,而中间的 /% 则被解释为字面量百分号。
在方括号中使用字符
对于某些通配符,可以在方括号内部直接引用。例如,要搜索连字符 -,需将其放在方括号的第一个位置:
-- 查找值为 '9-5' 的记录
SELECT * FROM table_name WHERE ColumnA LIKE '9[-]5';
-- 其他方括号内转义示例
SELECT * FROM table_name WHERE ColumnA LIKE '5[%]'; -- 匹配 '5%'
SELECT * FROM table_name WHERE ColumnA LIKE '[_]n'; -- 匹配 '_n'
| 模式 | 含义 |
|---|---|
LIKE '5[%]' | 匹配字面字符串 "5%" |
LIKE '5%' | 匹配以 5 开头后跟零或多个字符 |
LIKE '[_]n' | 匹配 "_n" |
LIKE '[a-cdf]' | 匹配 a, b, c, d 或 f |
LIKE '[ [ ]' | 匹配左方括号 [ |
LIKE ']' | 匹配右方括号 ] |
性能注意事项:索引与通配符位置
在使用 LIKE 进行模糊查询时,通配符的位置直接影响查询性能,尤其是索引的使用:
- 前导通配符(效率低):如果表达式以通配符开头(如
LIKE '%Smith'),SQL Server 无法有效利用索引,通常会触发全表扫描。这相当于在电话簿中不知道从哪一页开始查找。代码如下:-- 较差的性能:无法使用索引 SELECT * FROM authors WHERE name LIKE '%ith'; - 尾部或中间通配符(效率高):如果通配符位于末尾或中间(如
LIKE 'Sam%'或LIKE 'S%m'),数据库引擎可以利用索引快速定位起始位置,性能相对较好。代码如下:-- 较好的性能:可使用索引 SELECT * FROM authors WHERE name LIKE 'Sam%';
总结:在进行数据检索时,应尽可能避免使用前导通配符。如果业务场景必须支持任意位置的模糊匹配,建议考虑全文检索(Full-Text Search)等更优化的替代方案。
空格匹配特性
需要注意的是,LIKE 比较对模式中的空格非常敏感,但对于被搜索表达式的末尾空格则较为宽容。具体来说:
- 模式中的空格:必须完全一致。如果要找 "abc "(带空格),列值为 "abc"(无空格)的行不会返回。
- 尾部空格:如果模式中没有尾部空格,即使列数据包含尾部空格也会匹配成功。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









