SQL 中的 LIKE 和正则表达式(REGEXP 或 RLIKE)都用于模式匹配 ,但它们在表达能力、语法复杂度、性能上有显著区别。
核心区别一览表
| 对比维度 | LIKE |
正则表达式 |
|---|---|---|
| 匹配粒度 | 通配符(%、_) |
元字符、量词、字符类等 |
| 表达能力 | 弱(简单模式匹配) | 极强(复杂模式、重复、位置、子匹配) |
| 大小写敏感 | 取决于数据库排序规则 | 通常可配置(如 REGEXP BINARY) |
| 通配符 | %(任意多个字符)、_(单个字符) |
.(任意单个字符)、*、+、?、{n} 等 |
| 字符类支持 | 无 | 支持 [0-9]、[a-z]、\d、\w 等 |
| 位置匹配 | 无法匹配行首/行尾(仅全串匹配) | 支持 ^(行首)、$(行尾) |
| 转义符 | ESCAPE 子句(如 LIKE '100\%' ESCAPE '\') |
\(如 \. 匹配点号) |
| 性能 | 较快(简单扫描即可实现) | 较慢(需编译、回溯等) |
| 索引利用 | 前缀 'abc%' 可利用索引 |
无法利用普通索引(可尝试全文索引) |
| 标准性 | SQL 标准核心功能 | 各数据库扩展(语法略有差异) |
详细说明与示例
1. 基础语法示例(MySQL 风格)
sql
-- 1. LIKE:查找以 'abc' 开头的字符串
SELECT * FROM t WHERE col LIKE 'abc%';
-- 2. 正则:查找以 'abc' 开头的字符串
SELECT * FROM t WHERE col REGEXP '^abc';
-- 3. LIKE:查找包含 'abc' 的字符串(任意位置)
SELECT * FROM t WHERE col LIKE '%abc%';
-- 4. 正则:查找包含 'abc' 的字符串(任意位置)
SELECT * FROM t WHERE col REGEXP 'abc';
-- 5. 正则:查找数字开头的字符串
SELECT * FROM t WHERE col REGEXP '^[0-9]';
-- 或使用预定义字符类
SELECT * FROM t WHERE col REGEXP '^\\d';
2. 正则能但 LIKE 做不到的典型场景
| 需求 | 正则表达式 | LIKE 解决方案(通常不可行) |
|---|---|---|
| 手机号格式(11位数字) | '^1[0-9]{10}$' |
很难实现 |
| 邮箱格式 | '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' |
无法表达 |
| 至少包含一个数字 | '[0-9]' |
需要 LIKE '%0%' OR LIKE '%1%' ... |
| 匹配3或5个字符 | '^.{3,5}$' |
需要 LIKE '___' OR '____' OR '_____' |
| 排除特定模式 | '^(?!abc).*'(部分数据库不支持零宽断言) |
无法直接实现 |
3. 性能与索引注意事项
sql
-- ✅ LIKE 前缀匹配可使用索引(B-Tree)
SELECT * FROM user WHERE name LIKE '张%';
-- ❌ LIKE 中缀或后缀匹配无法使用索引
SELECT * FROM user WHERE name LIKE '%张%';
-- ❌ 正则表达式几乎无法使用普通索引
SELECT * FROM user WHERE name REGEXP '^张';
-- 正则优化的可能方案:使用全文索引(MySQL)
-- 或者将常用正则条件转换为 LIKE 前缀条件
4. 数据库差异说明
-
MySQL :
REGEXP(不区分大小写,取决于 collation)、RLIKE同义词 -
PostgreSQL :
~(区分大小写)、~*(不区分大小写)、SIMILAR TO(混合风格,不推荐) -
SQL Server :无内置正则,需用
LIKE或 CLR 扩展 -
SQLite :
REGEXP需要加载扩展(默认不可用)
5. 使用建议
| 场景 | 推荐方案 |
|---|---|
| 简单前缀匹配(如搜索框输入) | LIKE 'keyword%' |
| 简单通配符(固定长度的占位) | LIKE '_abc_' |
| 复杂格式验证(邮箱、手机号、IP) | 正则表达式(或在应用层验证) |
| 大数据量 + 前缀匹配 | 务必用 LIKE + 索引 |
| 少数几条记录 + 极复杂的匹配逻辑 | 正则表达式 |
总结
-
能用
LIKE解决的问题,就不要用正则(性能更好、更易读) -
需要复杂模式、字符类、位置匹配时,正则是不二之选
-
对性能敏感的场景(百万级以上数据),优先考虑
LIKE前缀匹配 + 索引,或者改用全文搜索工具(Elasticsearch、Sphinx 等)