MySQL LIKE 子句(手把手讲解)

更新时间:

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

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

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

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

前言

在数据库查询中,精准匹配固然重要,但灵活的模糊匹配需求同样常见。例如,搜索用户昵称中包含“小明”、查找订单号以“2023”开头,或是筛选商品名称中带有“智能”关键词的记录。这些场景下,MySQL LIKE 子句便成为开发者手中的利器。本文将从零开始,结合实例深入剖析其语法、用法及优化技巧,帮助读者掌握这一核心工具。


基础语法与核心概念

什么是 LIKE 子句?

LIKE 是 SQL 中用于模糊匹配的运算符,与 =(精确匹配)形成对比。其核心功能是通过 通配符(wildcards)定义搜索模式,从而匹配符合条件的字符串。例如:

SELECT * FROM users WHERE username LIKE 'Tom%';  

这条语句会返回所有用户名以“Tom”开头的记录。

关键概念解析

  • 通配符%(匹配零个或多个字符)和 _(匹配单个字符)。
  • 模式匹配:通过组合通配符和字符,定义灵活的搜索规则。
  • 大小写敏感性:默认情况下,匹配不区分大小写(具体取决于数据库的字符集配置)。

比喻理解
可以将 LIKE 子句想象为图书馆的图书检索系统。当你输入“Python%”时,系统会自动搜索所有以“Python”开头的书籍标题,而“%编程%”则会匹配包含“编程”关键词的所有书籍。


核心语法详解与案例

基础用法:% 通配符

% 是最常用的通配符,表示匹配任意长度的字符序列(包括空字符)。

示例 1:查询以特定字符串开头的记录

-- 查询所有用户名以 "Admin" 开头的用户  
SELECT * FROM users WHERE username LIKE 'Admin%';  

示例 2:查询包含特定子字符串的记录

-- 查找商品名称中包含 "智能" 的商品  
SELECT * FROM products WHERE product_name LIKE '%智能%';  

细粒度匹配:_ 通配符

_ 通配符匹配单个字符,适用于已知字符串长度但部分字符不确定的场景。

示例 3:匹配固定长度的字符串

-- 查找所有 3 位数的订单编号(例如 "A12"、"B3C")  
SELECT * FROM orders WHERE order_id LIKE '___';  

示例 4:结合 %_ 的复合模式

-- 匹配以 "A" 开头,且第 3 个字符是 "X" 的 5 位订单号(如 "AXYZ1")  
SELECT * FROM orders WHERE order_id LIKE 'A_X%';  

高级用法与常见场景

1. 排除特定模式

通过 NOT LIKE 可实现反向匹配,筛选不满足条件的记录。

示例 5:排除特定后缀的订单

-- 查找订单编号不以 "2023" 开头的记录  
SELECT * FROM orders WHERE order_id NOT LIKE '2023%';  

2. 匹配特殊字符

当目标字符串本身包含 %_ 时,需使用 ESCAPE 关键字定义转义符。

示例 6:匹配包含通配符的字符串

-- 查找商品名称为 "50% OFF" 的记录  
SELECT * FROM products  
WHERE product_name LIKE '50\% OFF' ESCAPE '\';  

此处 \ 被定义为转义符,表示后续的 % 是普通字符而非通配符。


性能优化与索引策略

1. 索引失效的陷阱

LIKE 查询的性能高度依赖索引设计。若模式以 % 开头(如 %Tom),则无法利用索引,导致全表扫描。

示例 7:索引失效的查询

-- 全表扫描,效率低下  
SELECT * FROM users WHERE username LIKE '%Tom';  

解决方案

  • 前缀匹配优先:确保 % 位于模式末尾(如 Tom%),此时索引可生效。
  • 全文索引替代:对于复杂文本搜索,可考虑使用 FULLTEXT 索引(需 MySQL 5.6+)。

2. 索引优化案例

-- 创建索引  
CREATE INDEX idx_username ON users(username);  

-- 高效查询(利用索引)  
SELECT * FROM users WHERE username LIKE 'Admin%';  

3. 减少数据扫描范围

通过组合 AND 条件缩小搜索范围,例如:

-- 先筛选部门,再模糊匹配  
SELECT * FROM employees  
WHERE department = 'Tech'  
AND employee_name LIKE '%Engineer';  

常见问题与解决方案

问题 1:大小写敏感性不一致

默认情况下,LIKE 在某些字符集下(如 utf8mb4_unicode_ci)不区分大小写。若需区分大小写,可使用 BINARY 关键字:

-- 区分大小写的匹配  
SELECT * FROM articles  
WHERE title LIKE BINARY 'Python%';  -- 仅匹配全大写或混合大小写的 "Python"  

问题 2:匹配空值(NULL)

NULL 值与 LIKE 不兼容,需先判断是否存在值:

-- 避免 NULL 引发的错误  
SELECT * FROM customers  
WHERE name IS NOT NULL  
AND name LIKE '%VIP%';  

进阶技巧与最佳实践

技巧 1:组合通配符实现复杂模式

-- 匹配 "Java" 后接 3 个任意字符的职位名称(如 "Java Dev", "Java_123")  
SELECT * FROM jobs WHERE title LIKE 'Java___%';  

技巧 2:结合正则表达式(REGEXP

对于更复杂的模式(如数字范围、字符类型匹配),可改用 REGEXP

-- 匹配订单号以 "ORD" 开头,后接 5 位数字  
SELECT * FROM orders WHERE order_id REGEXP '^ORD[0-9]{5}$';  

最佳实践总结

  1. 优先使用前缀匹配:确保 % 位于模式末尾以利用索引。
  2. 避免过度模糊查询:例如 LIKE '%a%' 会导致全表扫描。
  3. 测试执行计划:使用 EXPLAIN 分析查询性能,例如:
    EXPLAIN SELECT * FROM products WHERE product_name LIKE '%智能%';  
    

结论

MySQL LIKE 子句 是开发者处理模糊查询的必备工具,但其高效性依赖于对通配符、索引和执行计划的深入理解。通过合理设计查询模式、善用索引策略,并结合正则表达式等进阶技巧,开发者可以显著提升查询效率,同时满足复杂场景需求。掌握这些知识后,你将能更从容地应对从用户搜索、数据筛选到日志分析等各类实际问题。

实践建议

  • 在本地数据库中创建测试表,尝试不同模式的 LIKE 查询。
  • 使用 EXPLAIN 分析查询性能,观察索引的使用情况。
  • 遇到性能瓶颈时,考虑使用全文索引或优化查询条件。

通过持续练习与优化,LIKE 子句将成为你数据库查询的得力助手。

最新发布