LIKE操作符是MySQL中用于模式匹配的强大工具,主要用于在WHERE子句中进行模糊查询。以下是LIKE操作符的详细用法和示例:
1. 基本语法
SELECT column1, column2, ...
FROM table_name
WHERE column_name LIKE pattern;
2. 通配符详解
2.1 百分号通配符 (%)
-
匹配任意数量的字符(包括零个字符)
-
可以出现在模式的开头、中间或结尾
示例:
-- 以"abc"开头的所有值
SELECT * FROM users WHERE name LIKE 'abc%';
-- 包含"abc"的所有值
SELECT * FROM users WHERE name LIKE '%abc%';
-- 以"abc"结尾的所有值
SELECT * FROM users WHERE name LIKE '%abc';
-- 第二个字符是"b"的所有值
SELECT * FROM users WHERE name LIKE '_b%';
2.2 下划线通配符 (_)
-
匹配单个字符
-
可以多次使用来匹配多个字符
示例:
-- 以"a"开头,第三个字符是"c"的所有值
SELECT * FROM users WHERE name LIKE 'a_c%';
-- 长度为3个字符的所有值
SELECT * FROM users WHERE name LIKE '___';
-- 第二个字符是"b",第四个字符是"d"的所有值
SELECT * FROM users WHERE name LIKE '_b_d%';
3. 组合使用通配符
-- 以"a"开头,包含"b",以"c"结尾的所有值
SELECT * FROM users WHERE name LIKE 'a%b%c';
-- 第二个字符是"b",包含"c"的所有值
SELECT * FROM users WHERE name LIKE '_b%c%';
-- 包含"a"和"b",且"a"在"b"之前的所有值
SELECT * FROM users WHERE name LIKE '%a%b%';
4. NOT LIKE操作符
-- 不包含"abc"的所有值
SELECT * FROM users WHERE name NOT LIKE '%abc%';
-- 不以"abc"开头的所有值
SELECT * FROM users WHERE name NOT LIKE 'abc%';
-- 不以"abc"结尾的所有值
SELECT * FROM users WHERE name NOT LIKE '%abc';
5. 转义特殊字符
当需要匹配包含通配符的字符时,需要使用ESCAPE关键字:
-- 匹配包含下划线的值
SELECT * FROM users WHERE name LIKE '%\_%' ESCAPE '\';
-- 匹配包含百分号的值
SELECT * FROM users WHERE name LIKE '%\%%' ESCAPE '\';
-- 自定义转义字符
SELECT * FROM users WHERE name LIKE '%#_%' ESCAPE '#';
6. 大小写敏感问题
MySQL默认情况下,LIKE操作符是大小写不敏感的,但可以通过BINARY关键字实现大小写敏感:
-- 大小写不敏感(默认)
SELECT * FROM users WHERE name LIKE 'abc%';
-- 大小写敏感
SELECT * FROM users WHERE BINARY name LIKE 'abc%';
7. 性能优化建议
7.1 索引使用
-
只有
LIKE 'prefix%'格式可以利用索引 -
LIKE '%suffix'和LIKE '%infix%'无法使用索引-- 可以使用索引 SELECT * FROM users WHERE name LIKE 'abc%';
-- 无法使用索引 SELECT * FROM users WHERE name LIKE '%abc'; SELECT * FROM users WHERE name LIKE '%abc%';
7.2 函数索引(MySQL 8.0+)
-- 创建反向索引以支持后缀匹配
CREATE INDEX idx_name_reverse ON users (REVERSE(name));
-- 使用反向索引进行后缀匹配
SELECT * FROM users WHERE REVERSE(name) LIKE REVERSE('%abc');
8. 实际应用场景
8.1 邮箱域名查询
-- 查询所有gmail邮箱用户
SELECT * FROM users WHERE email LIKE '%@gmail.com';
8.2 电话号码查询
-- 查询所有以"138"开头的手机号
SELECT * FROM users WHERE phone LIKE '138%';
8.3 文件扩展名查询
-- 查询所有图片文件
SELECT * FROM files WHERE filename LIKE '%.jpg'
OR filename LIKE '%.png'
OR filename LIKE '%.gif';
9. 与其他操作符结合使用
-- 结合AND操作符
SELECT * FROM users
WHERE name LIKE 'a%' AND age > 18;
-- 结合OR操作符
SELECT * FROM users
WHERE name LIKE 'a%' OR name LIKE 'b%';
-- 结合IN操作符
SELECT * FROM users
WHERE name LIKE 'a%' AND city IN ('北京', '上海');
10. 性能对比
查询模式
是否使用索引
性能
建议
LIKE 'abc%'
✅ 是
高
推荐使用
LIKE '%abc'
❌ 否
低
避免使用
LIKE '%abc%'
❌ 否
低
避免使用
LIKE 'abc'
✅ 是
高
等同于=操作符
11. 最佳实践
-
尽量使用前缀匹配:
LIKE 'prefix%'可以利用索引 -
避免通配符开头:
LIKE '%suffix'会导致全表扫描 -
考虑使用全文索引:对于复杂的文本搜索需求
-
使用EXPLAIN分析查询计划:确保查询优化器正确使用索引
-- 分析查询计划 EXPLAIN SELECT * FROM users WHERE name LIKE 'abc%';
LIKE操作符是MySQL中非常实用的模糊查询工具,正确使用可以大大提高查询效率,但需要注意通配符的位置对性能的影响。