核心区别:通配符 vs 模式语言

  • LIKE:使用简单的通配符

    • %:匹配任意多个字符(包括0个)

    • _:匹配单个字符

  • 正则表达式:使用完整的模式描述语言


具体对比

1. 匹配能力对比
需求场景LIKE 实现正则表达式实现说明
以"A"开头LIKE 'A%'^A两者都能做到
包含"abc"LIKE '%abc%'abc两者都能做到
精确5个字符LIKE '_____'^.{5}$LIKE需要5个_,不直观
数字开头❌ 无法实现^\dLIKE无法匹配"任意数字"
邮箱验证❌ 极其困难^\w+@\w+\.\w+$LIKE难以精确匹配
密码强度❌ 无法实现^(?=.*[A-Z])(?=.*\d).{8,}$LIKE无法做前瞻断言
2. 实际案例演示

假设我们有一个用户表,要查找符合以下条件的用户名:

需求:找到以数字开头,第三个字符是元音字母,总长度至少为5的用户名

sql

-- 使用 LIKE  几乎不可能实现
-- 我们需要枚举所有可能性:
SELECT * FROM users WHERE 
  name LIKE '0_a%' OR 
  name LIKE '1_a%' OR 
  name LIKE '2_a%' OR 
  -- ... 需要写30种组合,极其繁琐!
  name LIKE '9_u%';

-- 使用正则表达式  一行搞定
SELECT * FROM users WHERE name REGEXP '^[0-9].[aeiou].{2,}';
-- 解释:^[0-9] 数字开头, . 任意字符, [aeiou] 元音字母, .{2,} 至少2个任意字符
3. 性能考虑
  • LIKE:在固定开头的情况下(如 'A%')可以利用索引,性能较好

  • 正则表达式:通常无法利用索引,全表扫描,性能较差

sql

-- 能利用索引(如果name有索引)
SELECT * FROM users WHERE name LIKE 'John%';

-- 不能利用索引
SELECT * FROM users WHERE name LIKE '%John%';
SELECT * FROM users WHERE name REGEXP 'John';
4. 适用场景总结
场景推荐使用原因
简单前缀/后缀匹配LIKE语法简单,可能利用索引
固定格式匹配LIKE如 LIKE 'ABC____'
复杂模式匹配正则表达式如邮箱、电话、特定模式
数据验证正则表达式如密码强度、格式检查
数据提取正则表达式如从文本中提取特定模式

结论

您的观察是对的——对于简单的模式匹配,LIKE 确实可以做到,而且应该优先使用,因为它的性能可能更好。

但是当需求变得复杂时:

  • LIKE 就像是一把螺丝刀——适合简单的拧螺丝工作

  • 正则表达式就像是一个多功能工具箱——能处理各种复杂的维修任务

经验法则:

  • 能用 LIKE 解决的简单问题,就用 LIKE

  • 当 LIKE 需要写很长的 OR 条件或者根本无法实现时,就使用正则表达式

在实际的数据库工作中,两者都是重要的工具,根据具体需求选择合适的使用才是关键!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐