SQL Interview Prep · 课时

LIKE、通配符与转义

学习模式匹配、百分号与下划线,以及如何转义字面通配符

第 3 / 4 课13 个步骤

LIKE、通配符与转义 是 CoddyKit 上的免费 SQL Interview Prep 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Interview Prep 课程共包含 4 节课。

面试严格审视下的模式匹配

LIKE 看起来很简单,却隐藏着三个经典的面试陷阱:混淆 % 和 _,忘记对数据中的字面百分号或下划线进行转义,以及忽略不同数据库在大小写敏感性方面的差异。

本课将深入讲解两个通配符、ESCAPE 子句,以及面试官用来区分初级开发者和真正交付过搜索功能的开发者的跨数据库方言规则。

两个通配符

LIKE 恰好有两个通配符:

  • % 匹配零个或多个字符
  • _ 匹配恰好一个字符

因此,'a%' 会匹配任何以字母 a 开头的内容,而 'a_' 会匹配以 a 开头的双字符字符串。混淆这两者是 LIKE 最常见的错误。

SELECT *
FROM customers
WHERE name LIKE 'A%';
-- every name beginning with A

百分号可放在任意位置

调整 % 的位置,就能控制匹配的锚定位置:

  • '%son' 匹配以 son 结尾的内容(如 Johnson、Mason)
  • '%mary%' 匹配任意位置包含 mary 的内容
  • 'J%n' 匹配以 J 开头且以 n 结尾的内容

单独的 '%' 会匹配每一行非 NULL 数据。NULL 永远不会匹配任何 LIKE 模式,包括 '%'。

SELECT *
FROM customers
WHERE email LIKE '%@gmail.com';

使用下划线匹配固定长度

_ 匹配任意单个字符,适合用于定长编码。'A__' 会匹配恰好三个字符且以 A 开头的内容,不多不少。

面试官会用产品代码或国家代码来测试这一点。当要求查找以 A 开头的三字符代码时,如果候选人写成 'A%',就会得到一个微妙但错误的结果,返回所有以 A 开头的任意内容。

SELECT *
FROM products
WHERE sku LIKE 'A__';
-- A followed by exactly two more characters

当数据中出现 % 和 _ 时

如果需要查找确实包含百分号的值,例如折扣标签“50% 折扣”,该怎么办?写成 LIKE '%50%%' 会失败,因为末尾的 % 会被当作通配符,而不是字面字符。

您必须告诉 SQL 某个特定字符应按字面含义处理,这正是 ESCAPE 子句的作用。

ESCAPE 子句

使用 ESCAPE 声明一个转义字符,然后在希望按字面含义处理的通配符前加上它。这里 ! 是转义字符,因此 !% 表示字面百分号。

这样可以查找任意位置包含字面文本 50% 的值。转义字符可以任意选择,请选择一个不会出现在搜索文本中的字符。

SELECT *
FROM promos
WHERE label LIKE '%50!%%' ESCAPE '!';
-- matches a literal '50%' anywhere in label

转义字面下划线

用户名和标识符中经常包含下划线,而未转义的 _ 会悄悄匹配任意字符。若要查找确实以 'a_b' 开头的电子邮件地址,就必须转义下划线。

如果不进行转义,'a_b%' 还会匹配 'axb'、'a9b' 等内容。这个错误经常被带入生产环境,因为未转义的查询仍然会返回看起来合理的行。

SELECT *
FROM users
WHERE handle LIKE 'a!_b%' ESCAPE '!';
-- handle starting with the literal text a_b

大小写敏感性因数据库而异

LIKE 是否区分大小写,取决于数据库引擎和排序规则:

  • PostgreSQL:LIKE 区分大小写;使用 ILIKE 可忽略大小写
  • MySQL:取决于列的排序规则,默认情况下通常不区分大小写
  • SQL Server:取决于排序规则设置

可移植且明确的做法是将两边都转换为小写。

SELECT *
FROM customers
WHERE LOWER(name) LIKE 'a%';

隐藏的性能代价

像 '%son' 这样的前置通配符无法使用普通 B 树索引,因为索引按前缀排序,而您没有固定起始位置。数据库引擎必须扫描每一行。

'son%'(带后置通配符且前缀固定)可以使用索引。面试官很喜欢询问 LIKE 查询为什么很慢;前置的 % 通常就是答案。

-- index-friendly (anchored prefix):
WHERE name LIKE 'Smi%'
-- forces a scan (leading wildcard):
WHERE name LIKE '%mith'

超越 LIKE

当 LIKE 不够用时,请提及以下替代方案,以体现您对这个主题的深入理解:

  • PostgreSQL 中的 SIMILAR TO 和 POSIX 正则表达式(~、~*),用于真正的正则匹配
  • 用于大型自由文本语料库的全文搜索索引
  • 三元组索引(pg_trgm),用于加速前置通配符搜索

提到这些内容,说明您知道 LIKE 是文本搜索的起点,而不是上限。

安全地根据用户输入构建 LIKE 模式

面试官经常会问:如何使用 LIKE 搜索用户输入的词,同时避免出错?需要指出两个风险:

  • 注入——将值绑定为参数;绝不要把原始输入直接拼接到 SQL 字符串中。
  • 未转义的通配符——如果输入本身包含 % 或 _,请对它们进行转义,使其按字面值匹配。

先绑定参数,然后在查询中添加您自己的通配符。

-- $1 is bound as a parameter; wildcards are added in SQL
SELECT *
FROM products
WHERE name LIKE '%' || replace(replace($1, '_', '\_'), '%', '\%') || '%' ESCAPE '\';

快速检查

回想两个通配符之间的区别。

回顾

要点:

  • % 匹配零个或多个字符;_ 恰好匹配一个字符
  • 若要匹配数据中的字面 % 或 _,请声明一个 ESCAPE 字符,并在通配符前加上它
  • 大小写敏感性因数据库引擎而异;在两边使用 LOWER() 是可移植的修正方案(PostgreSQL 有 ILIKE)
  • 前置通配符会强制进行全表扫描;固定前缀可以使用索引

未转义的 _ 是一种隐蔽错误:它仍然会返回看起来合理的行。

免费开始

用 AI 导师学习 SQL — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「LIKE、通配符与转义」课时是免费的吗?

是的 — 「LIKE、通配符与转义」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 SQL Interview Prep 课程共包含 4 节课。

「LIKE、通配符与转义」这节课中我会学到什么?

学习模式匹配、百分号与下划线,以及如何转义字面通配符 你通过在浏览器中直接运行的动手代码来练习 SQL Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Interview Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「LIKE、通配符与转义」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Interview Prep 课中编写并运行代码吗?

能。每节 SQL Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. AND/OR 优先级与括号
  2. BETWEEN、IN 与包含边界
  3. LIKE、通配符与转义
  4. 按计算值筛选
← 返回 SQL Interview Prep