0%

like语法

MySQL LIKE 模糊查询与通配符使用详解

在 MySQL 中,LIKE 运算符结合通配符可实现灵活的模糊查询,适用于根据部分字符匹配查找数据的场景(如搜索用户名、关键词等)。本文详细讲解 LIKE 的用法、通配符规则及注意事项。

基本语法

1
2
3
SELECT <字段列表>
FROM <表名>
WHERE <字段名> LIKE <匹配模式>;
  • LIKE 用于判断字段值是否与指定的 “匹配模式” 相符。
  • 匹配模式需结合通配符使用,否则等价于 = 运算符(如 name LIKE '张三' 等价于 name = '张三')。

通配符类型及用法

MySQL 支持两种通配符,用于构建匹配模式:

1. %:匹配任意多个字符(包括 0 个)

  • 表示 “任意长度的任意字符”(字母、数字、符号等均可)。
  • 可放在模式的任意位置(开头、中间、结尾)。
示例:
1
2
3
4
5
6
7
8
9
10
11
-- 1. 字段值包含 'a'(无论位置)
SELECT * FROM user WHERE name LIKE '%a%';
-- 匹配:'a'、'ab'、'ba'、'abc'、'xay' 等

-- 2. 字段值以 'a' 开头
SELECT * FROM user WHERE name LIKE 'a%';
-- 匹配:'a'、'ab'、'abc' 等,不匹配 'ba'

-- 3. 字段值以 'a' 结尾
SELECT * FROM user WHERE name LIKE '%a';
-- 匹配:'a'、'ba'、'cba' 等,不匹配 'ab'

2. _:匹配任意单个字符

  • 表示 “恰好一个任意字符”(必须有且仅有一个)。
示例:
1
2
3
4
5
6
7
-- 1. 字段值长度为 2,且第二个字符是 'a'
SELECT * FROM user WHERE name LIKE '_a';
-- 匹配:'ba'、'ca' 等,不匹配 'a'(长度不足)、'bba'(长度过长)

-- 2. 字段值第二个字符是 'a',后续字符任意
SELECT * FROM user WHERE name LIKE '_a%';
-- 匹配:'ba'、'bac'、'xayz' 等,不匹配 'ab'('a' 在第一个位置)

转义特殊字符

若需匹配包含 %_ 的字段值(如用户名 user_123discount%),需使用转义字符(默认 \),否则通配符会被解析为匹配规则。

语法:

  • \_ 匹配单个 _ 字符。
  • \% 匹配单个 % 字符。
示例:
1
2
3
4
5
6
7
8
9
10
-- 1. 匹配第二个字符是 '_' 的字段值(如 'a_b'、'x_y')
SELECT * FROM user WHERE name LIKE '_\_%';

-- 2. 匹配包含 '%' 的字段值(如 '50%off'、'discount%')
SELECT * FROM products WHERE title LIKE '%\%%';

-- 3. 自定义转义字符(使用 ESCAPE 关键字)
-- 若默认 '\' 与业务冲突,可指定其他字符(如 '#')作为转义符
SELECT * FROM user WHERE name LIKE '_#_%' ESCAPE '#';
-- 等价于 '_\_%',匹配第二个字符是 '_' 的值

注意事项

  1. 区分大小写

    • 匹配规则受字段的校对规则(Collation)影响:
      • utf8_general_ci(不区分大小写):LIKE '%A%' 会匹配 'a''A'
      • utf8_bin(区分大小写):LIKE '%A%' 仅匹配 'A',不匹配 'a'
  2. 性能影响

    • LIKE '%xxx'(以通配符开头)会导致索引失效,触发全表扫描(大数据表慎用)。
    • 优化建议:若需前缀匹配,使用 LIKE 'xxx%'(可利用前缀索引);复杂模糊查询可考虑全文索引(FULLTEXT)。
  3. NULL 值处理

    • LIKE无法匹配NULL值(NULL LIKE ‘%’返回FALSE),需单独用IS NULL判断:

      1
      SELECT * FROM user WHERE name LIKE '%a%' OR name IS NULL;

常见使用场景

  1. 关键词搜索:如 “查询标题包含‘MySQL’的文章”。
  2. 格式匹配:如 “查询手机号以 138 开头的用户”(LIKE '138%')。
  3. 模糊过滤:如 “查询用户名第二个字符是数字的用户”(LIKE '_[0-9]%',需结合正则时用 REGEXP)。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10