在mysql的查询操作中,like是用于实现模糊匹配的关键字,它可以帮助我们在不确定完整字段值的情况下,筛选出符合部分匹配规则的记录,是日常数据查询场景里非常常用的功能。

like的基本语法
like关键字通常和SELECT语句的WHERE子句配合使用,基础语法格式如下:
-- 基础语法 SELECT 字段名 FROM 表名 WHERE 字段名 LIKE 匹配模式;
这里的匹配模式需要结合通配符来使用,mysql中like支持两个核心通配符,分别是百分号%和下划线_。
通配符的具体作用
百分号%通配符
百分号代表匹配任意长度的字符串,包括空字符串,使用场景非常广泛。
- 匹配以指定内容开头的记录:模式为
指定内容% - 匹配以指定内容结尾的记录:模式为
%指定内容 - 匹配包含指定内容的记录:模式为
%指定内容%
下划线_通配符
下划线仅代表匹配单个任意字符,长度是固定的1位,不能多也不能少。
常见使用示例
假设我们有一张用户表user,表结构如下:
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100)
);
表中现有数据如下:
| id | username | |
|---|---|---|
| 1 | zhangsan | zhangsan@ipipp.com |
| 2 | lisi | lisi@ipipp.com |
| 3 | zhangwu | zhangwu@ipipp.com |
| 4 | wangli | wangli@ipipp.com |
示例1:查询用户名以zhang开头的用户
SELECT * FROM user WHERE username LIKE 'zhang%';
执行后会返回id为1和3的两条记录,分别是zhangsan和zhangwu。
示例2:查询邮箱包含ipipp.com的用户
SELECT * FROM user WHERE email LIKE '%ipipp.com%';
执行后会返回所有4条用户记录,因为所有邮箱都包含ipipp.com。
示例3:查询用户名长度为5位的用户
这里需要使用5个下划线来匹配5位长度的字符串:
SELECT * FROM user WHERE username LIKE '_____';
执行后会返回id为2和4的两条记录,分别是lisi和wangli,这两个用户名长度都是5位。
示例4:查询用户名第二个字符是a的用户
SELECT * FROM user WHERE username LIKE '_a%';
执行后会返回id为1和3的两条记录,zhangsan第二个字符是a,zhangwu第二个字符也是a。
特殊场景处理
如果我们要匹配的字符串本身包含百分号或者下划线,就需要使用转义字符来处理,mysql默认使用反斜杠作为转义符。
比如要查询用户名包含百分号的记录,写法如下:
-- 查询用户名包含%的记录 SELECT * FROM user WHERE username LIKE '%%%';
也可以自定义转义符,使用ESCAPE关键字:
-- 使用$作为转义符,查询包含_的用户名 SELECT * FROM user WHERE username LIKE '%$_%' ESCAPE '$';
使用注意事项
- like查询如果匹配模式以百分号开头,比如
LIKE '%内容',数据库无法使用索引,会导致全表扫描,数据量大的时候性能会比较差,尽量避免这种写法。 - 如果明确知道匹配的长度,优先使用下划线通配符而不是百分号,能减少匹配的范围,提升查询效率。
- like只适用于字符串类型的字段匹配,对数值类型字段使用like会先隐式转换类型,可能导致索引失效,不建议这样使用。
注意:like是大小写不敏感的,具体是否区分大小写取决于数据库表的字符集和排序规则配置,如果需要区分大小写,可以修改字段的排序规则或者使用BINARY关键字。