mysql like(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在数据库查询的世界里,MySQL LIKE 是一个如同瑞士军刀般的存在——它虽不复杂,却能解决许多看似棘手的模糊匹配问题。无论是寻找特定前缀的用户名称,还是检索包含关键词的商品描述,LIKE 都能通过灵活的通配符语法,帮助开发者精准定位目标数据。然而,对于编程初学者和中级开发者而言,理解 LIKE 的底层逻辑、掌握其性能优化技巧,并避免常见陷阱,仍是需要系统学习的课题。本文将从基础到进阶,结合实际案例,逐步揭开 MySQL LIKE 的使用之道。


一、MySQL LIKE 的基本语法与核心逻辑

1.1 基础语法结构

LIKEMySQL 中用于模糊查询的关键字,其核心语法如下:

SELECT * FROM 表名 WHERE 列名 LIKE '模式';  

这里的“模式”通常包含两个特殊字符:

  • %:代表任意长度的任意字符(包括空字符)
  • _:代表单个任意字符

形象比喻:可以将 % 想象成一根伸缩自如的橡皮筋,能够匹配任意长度的内容;而 _ 则像一个固定长度的“空位”,只允许占据一个字符的位置。

1.2 简单案例:用户搜索功能

假设有一个用户表 users,其中包含 name 列,我们想查找所有以“张”开头的用户:

SELECT * FROM users WHERE name LIKE '张%';  

这条语句会匹配到“张三”“张伟”“张小明”等记录,但不会匹配“李张”或“张”本身(因为 % 允许后续字符为空)。

关键点

  • LIKE 区分大小写?默认情况下,LIKE 在区分大小写的数据库配置下(如使用 utf8mb4_bin 字符集),会严格区分大小写;而在默认的 utf8mb4_unicode_ci 下则不区分。
  • 若需不区分大小写查询,可使用 COLLATE 子句:
    SELECT * FROM users WHERE name COLLATE utf8mb4_unicode_ci LIKE '张%';  
    

二、通配符的深度解析与应用场景

2.1 % 的灵活运用

2.1.1 中间匹配

% 出现在模式中间时,可匹配任意位置的字符序列:

-- 查找包含“科技”二字的公司名称  
SELECT * FROM companies WHERE company_name LIKE '%科技%';  

此语句会匹配“阿里巴巴科技”“科技有限公司”等记录。

2.1.2 开头或结尾的特殊处理

  • 以特定字符结尾LIKE '%科技'
  • 以特定字符开头LIKE '科技%'

2.2 _ 的精确控制

当需要匹配固定长度的字符串时,_ 的作用尤为突出:

-- 查找长度为3且第二个字符为“a”的单词  
SELECT * FROM words WHERE word LIKE '_a%';  

此语句会匹配“cat”“bat”但不会匹配“apple”(长度不足)。

进阶技巧
若需匹配多个连续字符,可用多个 _

-- 匹配第三个字符为“x”的5位字符串  
SELECT * FROM codes WHERE code LIKE '__x__';  

三、性能优化与注意事项

3.1 索引失效的陷阱

LIKE 的性能表现与索引密切相关,但以下两种情况会导致索引失效:

  1. % 开头的模糊查询

    SELECT * FROM articles WHERE title LIKE '%MySQL%';  -- 索引失效  
    

    % 在开头,引擎无法从索引的起始位置快速定位数据。

  2. 使用转义字符或函数

    SELECT * FROM users WHERE name LIKE CONCAT('%', '张', '%');  -- 索引失效  
    

    动态拼接的表达式会让优化器放弃使用索引。

解决方案

  • 对于以 % 开头的查询,可考虑全文索引(FULLTEXT)或倒排索引技术。
  • 将模糊条件尽量放在模式的右侧:
    SELECT * FROM products WHERE product_code LIKE 'A%';  -- 索引有效  
    

3.2 转义字符的使用场景

当查询条件本身包含 %_ 时,需使用转义符 \ 进行转义:

-- 查找包含“%”的折扣信息  
SELECT * FROM discounts WHERE description LIKE '%\%%' ESCAPE '\\';  

此时 ESCAPE 关键字指定了转义符为反斜杠 \


四、高级技巧与扩展用法

4.1 多条件组合查询

通过 ANDOR 可实现复杂条件的组合:

-- 查找以“2023”开头且包含“成功”字样的记录  
SELECT * FROM logs WHERE log_content LIKE '2023%' AND log_content LIKE '%成功%';  

4.2 正则表达式与 REGEXP 的对比

虽然 LIKE 功能强大,但在需要更复杂模式匹配时,可考虑 REGEXP

-- 匹配以数字开头且包含字母的密码  
SELECT * FROM users WHERE password REGEXP '^[0-9].*[a-zA-Z]';  

但需注意:REGEXP 的性能通常低于 LIKE,需根据业务场景权衡。

4.3 结合 CASE 表达式实现条件分组

SELECT  
  CASE  
    WHEN name LIKE 'A%' THEN 'A组'  
    WHEN name LIKE 'B%' THEN 'B组'  
    ELSE '其他'  
  END AS group_name,  
  COUNT(*) AS count  
FROM users  
GROUP BY group_name;  

此语句可快速统计以不同字母开头的用户分布情况。


五、常见问题与解决方案

5.1 问题1:查询结果为空但预期存在记录

可能原因

  • 列值包含不可见字符(如空格、换行符)
  • 字符集或排序规则导致的大小写问题

解决方案

  1. 使用 TRIM()BINARY 去除空格或强制区分大小写:
    SELECT * FROM users WHERE BINARY name LIKE '张三';  -- 强制区分大小写  
    
  2. 检查列值的实际存储内容:
    SELECT HEX(name) FROM users WHERE name LIKE '%张%';  -- 查看二进制数据  
    

5.2 问题2:如何实现“不包含某模式”的查询?

使用 NOT LIKE 结合 ANDOR

-- 查找不包含“已删除”的记录  
SELECT * FROM records WHERE status NOT LIKE '%已删除%';  

结论

MySQL LIKE 是开发者工具箱中不可或缺的利器,其通过通配符 %_ 提供了灵活的模糊匹配能力。然而,要真正掌握这一技术,开发者需要理解其语法逻辑、性能特性,并结合实际场景选择最优方案。无论是基础的用户名查询,还是复杂的条件组合,通过本文的案例与技巧,读者可以逐步构建起对 LIKE 的全面认知。

在后续的实践中,建议开发者:

  1. 对高频模糊查询字段建立索引(注意索引失效场景);
  2. 结合 EXPLAIN 分析查询性能;
  3. 在复杂需求中权衡 LIKE 与正则表达式的适用性。

通过不断练习与优化,MySQL LIKE 必将成为你高效处理数据的得力伙伴。

最新发布