mysql 中 like 到底怎么用 - 前端学习

194 阅读3分钟

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. 最佳实践

  1. ​尽量使用前缀匹配​​:LIKE 'prefix%'可以利用索引

  2. ​避免通配符开头​​:LIKE '%suffix'会导致全表扫描

  3. ​考虑使用全文索引​​:对于复杂的文本搜索需求

  4. ​使用EXPLAIN分析查询计划​​:确保查询优化器正确使用索引

    -- 分析查询计划 EXPLAIN SELECT * FROM users WHERE name LIKE 'abc%';

LIKE操作符是MySQL中非常实用的模糊查询工具,正确使用可以大大提高查询效率,但需要注意通配符的位置对性能的影响。