当前位置: 首页 > news >正文

SQL like 与 正则 区别

SQL 中的LIKE和正则表达式(REGEXPRLIKE)都用于模式匹配,但它们在表达能力、语法复杂度、性能上有显著区别。

核心区别一览表

对比维度LIKE正则表达式
匹配粒度通配符(%_元字符、量词、字符类等
表达能力弱(简单模式匹配)极强(复杂模式、重复、位置、子匹配)
大小写敏感取决于数据库排序规则通常可配置(如REGEXP BINARY
通配符%(任意多个字符)、_(单个字符).(任意单个字符)、*+?{n}
字符类支持支持[0-9][a-z]\d\w
位置匹配无法匹配行首/行尾(仅全串匹配)支持^(行首)、$(行尾)
转义符ESCAPE子句(如LIKE '100\%' ESCAPE '\'\(如\.匹配点号)
性能较快(简单扫描即可实现)较慢(需编译、回溯等)
索引利用前缀'abc%'可利用索引无法利用普通索引(可尝试全文索引)
标准性SQL 标准核心功能各数据库扩展(语法略有差异)

详细说明与示例

1. 基础语法示例(MySQL 风格)

-- 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. 性能与索引注意事项

-- ✅ 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. 数据库差异说明

  • MySQLREGEXP(不区分大小写,取决于 collation)、RLIKE同义词

  • PostgreSQL~(区分大小写)、~*(不区分大小写)、SIMILAR TO(混合风格,不推荐)

  • SQL Server:无内置正则,需用LIKE或 CLR 扩展

  • SQLiteREGEXP需要加载扩展(默认不可用)

5. 使用建议

场景推荐方案
简单前缀匹配(如搜索框输入)LIKE 'keyword%'
简单通配符(固定长度的占位)LIKE '_abc_'
复杂格式验证(邮箱、手机号、IP)正则表达式(或在应用层验证)
大数据量 + 前缀匹配务必用LIKE+ 索引
少数几条记录 + 极复杂的匹配逻辑正则表达式

总结

  • 能用LIKE解决的问题,就不要用正则(性能更好、更易读)

  • 需要复杂模式、字符类、位置匹配时,正则是不二之选

  • 对性能敏感的场景(百万级以上数据),优先考虑LIKE前缀匹配 + 索引,或者改用全文搜索工具(Elasticsearch、Sphinx 等)

http://www.jsqmd.com/news/881526/

相关文章:

  • 2026年比较好的丽水本地获客渠道实力公司推荐 - 品牌宣传支持者
  • 南宁口碑好的旧改企业哪家靠谱
  • 安全稀疏矩阵乘法:基于二叉树递归传播的MPC算法优化详解
  • 二、大模型节点配置以及结束节点配置
  • 异常断电导致存储崩溃:Linux IO栈级数据恢复实战
  • 阿拉伯语多模态机器学习:从数据构建到模型融合的工程实践
  • AscendSiPBoost信号处理加速库架构与实战
  • 什么是ERC-8183
  • 安全多方计算在隐私保护AI推理中的应用:FHE与混淆电路协议对比
  • 【论文阅读】VLAW: Iterative Co-Improvement of Vision-Language-Action Policy and World Model
  • List<T>泛型列表
  • 如何让政策数据在三个端保持同步?政策快报的实践方案
  • c++ csv?_?C++处理csv文件格式的fstream与字符串分割方法详解.txt
  • 2026年免费照片去水印软件App推荐,一看就会的保姆级详细教程
  • Infineon XC16x中断处理机制解析与优化实践
  • 神经网络原理 第九章:自组织映射
  • VR+机器学习:跨语言阅读障碍识别的新范式
  • leetcode 61. 旋转链表 中等
  • 测试前端代码!
  • FPGA与机器学习协同加速量子点自动调谐:原理、实现与性能分析
  • 网络体系结构 | 物理层:传输介质与编码
  • 集成光子学与连续变量量子光学技术解析
  • 《Visual Studio 2022中高效使用Git的实战总结:团队协作与版本控制指南》
  • 祖玛游戏开发:状态机与路径拓扑的工程实践
  • 2026年质量好的大孔径深孔钻镗床/德州圆钢深孔钻镗床口碑好的厂家推荐 - 品牌宣传支持者
  • AArch64虚拟内存系统架构与权限控制详解
  • 2026年热门的潍坊磁选机/砂石磁选机厂家对比推荐 - 品牌宣传支持者
  • Future接口学习
  • 端到端课程自用 7 规划 端到端的训练数据与评测方法 笔记
  • 昇腾CANN ops-math 仓:数据类型转换的性能陷阱