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}$';
最佳实践总结
- 优先使用前缀匹配:确保
%
位于模式末尾以利用索引。 - 避免过度模糊查询:例如
LIKE '%a%'
会导致全表扫描。 - 测试执行计划:使用
EXPLAIN
分析查询性能,例如:EXPLAIN SELECT * FROM products WHERE product_name LIKE '%智能%';
结论
MySQL LIKE 子句
是开发者处理模糊查询的必备工具,但其高效性依赖于对通配符、索引和执行计划的深入理解。通过合理设计查询模式、善用索引策略,并结合正则表达式等进阶技巧,开发者可以显著提升查询效率,同时满足复杂场景需求。掌握这些知识后,你将能更从容地应对从用户搜索、数据筛选到日志分析等各类实际问题。
实践建议:
- 在本地数据库中创建测试表,尝试不同模式的
LIKE
查询。 - 使用
EXPLAIN
分析查询性能,观察索引的使用情况。 - 遇到性能瓶颈时,考虑使用全文索引或优化查询条件。
通过持续练习与优化,LIKE
子句将成为你数据库查询的得力助手。