SQL Server 模糊查询详解:LIKE 通配符用法与性能优化

键盘旁的猫
键盘旁的猫
发布时间:2026-10-15 | 6人浏览过
原创

在 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 进行模糊查询时,通配符的位置直接影响查询性能,尤其是索引的使用:

  1. 前导通配符(效率低):如果表达式以通配符开头(如 LIKE '%Smith'),SQL Server 无法有效利用索引,通常会触发全表扫描。这相当于在电话簿中不知道从哪一页开始查找。
    代码如下:
    -- 较差的性能:无法使用索引
    SELECT * FROM authors WHERE name LIKE '%ith';
  2. 尾部或中间通配符(效率高):如果通配符位于末尾或中间(如 LIKE 'Sam%' 或 LIKE 'S%m'),数据库引擎可以利用索引快速定位起始位置,性能相对较好。
    代码如下:
    -- 较好的性能:可使用索引
    SELECT * FROM authors WHERE name LIKE 'Sam%';

总结:在进行数据检索时,应尽可能避免使用前导通配符。如果业务场景必须支持任意位置的模糊匹配,建议考虑全文检索(Full-Text Search)等更优化的替代方案。

空格匹配特性

需要注意的是,LIKE 比较对模式中的空格非常敏感,但对于被搜索表达式的末尾空格则较为宽容。具体来说:

  • 模式中的空格:必须完全一致。如果要找 "abc "(带空格),列值为 "abc"(无空格)的行不会返回。
  • 尾部空格:如果模式中没有尾部空格,即使列数据包含尾部空格也会匹配成功。
以上就是 SQL Server 中 LIKE 模糊查询语法的详细内容,更多关于数据库查询优化的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表