LIKE是SQL中基于%和_通配符的轻量模糊查询手段,支持前缀匹配走索引,但不支持正则特性;需用ESCAPE转义特殊字符,大小写敏感性由排序规则决定。

SQL 中的 LIKE 是实现模糊查询最常用、最基础的手段,核心在于用通配符配合字符串模式匹配。它不依赖全文索引或正则引擎,轻量高效,适用于大多数简单到中等复杂度的文本筛选场景。
LIKE 的两个核心通配符:% 和 _
% 表示任意长度(含零长度)的任意字符序列;_ 表示单个任意字符。这是所有 LIKE 匹配的基石,其他写法都基于它们组合。
-
name LIKE '张%':匹配“张三”“张小明”“张”,但不匹配“李张” -
code LIKE 'A_B%':匹配“A1B001”“AxB22”,但不匹配“AB123”(中间缺一个字符)或“A12B33”(_ 只占一位) -
desc LIKE '%error%warning%':可跨位置匹配,只要 “error” 出现在 “warning” 前面且两者都在该字段中(注意:不是正则中的顺序断言,仅靠 % 连接)
转义特殊字符:ESCAPE 子句不可少
当要查的字段本身含 % 或 _(比如产品编号为 A%2023、路径为 data_2024),直接写 LIKE 'A%2023' 会被当成通配模式,必须显式声明转义符。
- 写法:
code LIKE 'A\%2023' ESCAPE '\' - 也可选其他字符,如
LIKE 'A!_2023' ESCAPE '!',此时 ! 后的 _ 不再是通配符,而是字面量下划线 - 注意:不同数据库对默认转义符支持略有差异,MySQL 默认无转义,PostgreSQL/SQL Server 需显式指定 ESCAPE
大小写敏感性取决于字段排序规则(Collation)
LIKE 是否区分大小写,不由关键字决定,而由字段所用的排序规则控制。例如:
- MySQL 中
VARCHAR(50) COLLATE utf8mb4_0900_as_cs→ 区分大小写,“ABC” 不匹配 “abc” - SQL Server 中
Latin1_General_CI_AS→ CI 表示 Case-Insensitive,即不区分 - 若需强制忽略大小写,可统一转换:
UPPER(name) LIKE UPPER('zhang%'),但会丢失索引优势
性能关键:LIKE 左侧不能以通配符开头
只有当模式不以 % 或 _ 开头时(即前缀匹配),数据库才可能利用 B-Tree 索引加速查询。
- ✅ 高效:
WHERE phone LIKE '138%'→ 可走索引 - ❌ 全表扫描:
WHERE name LIKE '%ing'或LIKE '%john%'→ 索引失效(除非使用倒排索引、全文索引或函数索引) - 替代方案:对后缀匹配,可考虑存储反向字符串并建索引,如
REVERSE(name)建索引,再查REVERSE(name) LIKE REVERSE('%ing')→ 实际查'gni%'
掌握 LIKE 的行为边界比死记语法更重要——它不是正则,不支持重复、分组或逻辑或;它快在简单,也受限于简单。真有复杂文本分析需求,该上全文检索就别硬扛。










