mysql like(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在数据库查询的世界里,MySQL LIKE
是一个如同瑞士军刀般的存在——它虽不复杂,却能解决许多看似棘手的模糊匹配问题。无论是寻找特定前缀的用户名称,还是检索包含关键词的商品描述,LIKE
都能通过灵活的通配符语法,帮助开发者精准定位目标数据。然而,对于编程初学者和中级开发者而言,理解 LIKE
的底层逻辑、掌握其性能优化技巧,并避免常见陷阱,仍是需要系统学习的课题。本文将从基础到进阶,结合实际案例,逐步揭开 MySQL LIKE
的使用之道。
一、MySQL LIKE
的基本语法与核心逻辑
1.1 基础语法结构
LIKE
是 MySQL
中用于模糊查询的关键字,其核心语法如下:
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
的性能表现与索引密切相关,但以下两种情况会导致索引失效:
-
以
%
开头的模糊查询:SELECT * FROM articles WHERE title LIKE '%MySQL%'; -- 索引失效
因
%
在开头,引擎无法从索引的起始位置快速定位数据。 -
使用转义字符或函数:
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 多条件组合查询
通过 AND
或 OR
可实现复杂条件的组合:
-- 查找以“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:查询结果为空但预期存在记录
可能原因:
- 列值包含不可见字符(如空格、换行符)
- 字符集或排序规则导致的大小写问题
解决方案:
- 使用
TRIM()
或BINARY
去除空格或强制区分大小写:SELECT * FROM users WHERE BINARY name LIKE '张三'; -- 强制区分大小写
- 检查列值的实际存储内容:
SELECT HEX(name) FROM users WHERE name LIKE '%张%'; -- 查看二进制数据
5.2 问题2:如何实现“不包含某模式”的查询?
使用 NOT LIKE
结合 AND
或 OR
:
-- 查找不包含“已删除”的记录
SELECT * FROM records WHERE status NOT LIKE '%已删除%';
结论
MySQL LIKE
是开发者工具箱中不可或缺的利器,其通过通配符 %
和 _
提供了灵活的模糊匹配能力。然而,要真正掌握这一技术,开发者需要理解其语法逻辑、性能特性,并结合实际场景选择最优方案。无论是基础的用户名查询,还是复杂的条件组合,通过本文的案例与技巧,读者可以逐步构建起对 LIKE
的全面认知。
在后续的实践中,建议开发者:
- 对高频模糊查询字段建立索引(注意索引失效场景);
- 结合
EXPLAIN
分析查询性能; - 在复杂需求中权衡
LIKE
与正则表达式的适用性。
通过不断练习与优化,MySQL LIKE
必将成为你高效处理数据的得力伙伴。