SQL like 与 正则 区别

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 等)

相关推荐
计算机毕设定制辅导-无忧学长7 分钟前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
大模型最新论文速读11 分钟前
text-to-sql:从学术玩具到生产落地
数据库·sql
ManageEngineITSM37 分钟前
工单分类怎么设计?类别、子类别与自动分派的实用方法
大数据·服务器·数据库·人工智能·分类·数据挖掘
ClouGence1 小时前
MongoDB 双向同步如何防止数据循环?(附实操指南)
数据库·mongodb
TDengine (老段)1 小时前
TDengine IDMP 十大实用功能(7)
数据库·物联网·时序数据库·tdengine·涛思数据·工业数据·idmp
Decay__1 小时前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
zjx23881 小时前
oracle11g转Gbase8s库SQL常见问题修改
数据库·sql
真上帝的左手1 小时前
30. 技术专题-‌应用框架组件-缓存-Redis
数据库·redis·分布式·缓存·中间件
雪芽蓝域zzs1 小时前
第 2 章:整合 MySQL + MyBatis,搭建数据库基础、实体类、Mapper、测试查询
数据库·mysql·mybatis
实泽有之,无泽虚之2 小时前
SQL Server数据库备份与还原详解
数据库·sqlserver