MySQL LIKE与REGEXP模糊查询字符串全解及多条件技巧

沈知远
沈知远
发布时间:2026-10-14| 2人浏览过
原创

在MySQL数据库开发中,模糊查询是获取特定数据的核心手段。本文深入解析LIKE操作符的通配符规则(%与_)、REGEXP扩展正则表达式的高级用法,并演示如何利用CONCAT函数突破限制,实现单个字段的“IN”风格多值模糊匹配,附带完整SQL代码示例。

结果与目标

在使用SQL进行数据检索时,我们经常需要处理非精确匹配的字符串场景。无论是通过关键词搜索用户名称,还是通过部分ID筛选记录,掌握正确的模糊查询语法至关重要。本文旨在提供一套即插即用的解决方案,覆盖从基础通配符到高级正则匹配的常见需求。

准备条件

  • MySQL 数据库环境(支持标准SQL模式及扩展正则表达式)。
  • 具备基本的SQL查询编写能力。
  • 明确待查询的表名(如 user、tb_require 或 customers)及字段名。

真实操作顺序

第1步:使用LIKE进行基础模糊匹配

目的:在SQL模式中快速查找包含特定字符模式的记录。

核心参数:

  • %:表示任意个或多个字符(包括零个字符)。可匹配任意类型和长度的内容。
  • _:表示任意单个字符。常用于限制字符串长度或定位特定位置的字符(也可代表一个中文字符)。

操作步骤:

  1. 匹配包含特定字符:若要找出名称中包含“三”的所有记录,使用 % 包裹关键词。
    复制代码 代码如下:
    SELECT * FROM user 
    WHERE u_name LIKE '%三%'
    此查询将返回“张三”、“张猫三”、“三脚猫”等记录。
  2. 组合多个条件:若需同时满足包含“三”和“猫”,必须使用 AND 连接两个 LIKE 子句,因为连续的 %三%猫% 只能匹配顺序出现的字符,无法匹配“张猫三”。
    复制代码 代码如下:
    SELECT * FROM user 
    WHERE u_name LIKE '%三%' AND u_name LIKE '%猫%'
  3. 固定长度与位置匹配:若仅需三个字且中间为“三”的记录,使用两个 _ 占位。
    复制代码 代码如下:
    SELECT * FROM user 
    WHERE u_name LIKE '_三_'
    同理,以“三”开头且为三个字的记录:
    复制代码 代码如下:
    SELECT * FROM user 
    WHERE u_name LIKE '三__'

第2步:使用REGEXP进行正则表达式匹配

目的:利用扩展正则表达式提供更灵活、强大的模式匹配能力,支持起始/结束锚点及字符类定义。

核心特性:

  • .:匹配任何单个字符(注意仅限单字节,中文需注意编码影响)。
  • [...]:字符类,匹配方括号内任一字符,如 [abc] 或范围 [a-z]。
  • *:匹配前面的元素零次或多次,如 x* 或 .*。
  • ^:匹配字符串开始;$:匹配字符串结束。

操作步骤:

当需要精确控制匹配位置时,REGEXP(或其同义词 RLIKE)优于 LIKE。

  1. 匹配开头:查找以“三”开头的名字。使用 ^ 锚定起始位置。
    复制代码 代码如下:
    SELECT * FROM user 
    WHERE u_name REGEXP '^三'
    这将返回“三脚猫”等记录,但不返回“张三”。
  2. 匹配结尾:查找以“三”结尾的名字。使用 $ 锚定结束位置。
    复制代码 代码如下:
    SELECT * FROM user 
    WHERE u_name REGEXP '三$'
    这将返回“张三”、“张猫三”等记录。
  3. 重复次数匹配:可使用 {n} 指定重复次数。
    复制代码 代码如下:
    -- 例如匹配以bb结尾的名称(假设存在此类数据)
    SELECT * FROM table_name 
    WHERE column_name REGEXP 'b{2}$'

注意:在处理中文字符时,请确保数据库字符集配置正确,否则正则表达式中的 . 或长度计算可能产生意外结果。

第3步:解决单字段多值IN查询难题

目的:当需求是“字段值是否为给定列表中的任意一个”时,通常使用 IN。但 IN 仅支持精确匹配,不支持模糊匹配。若需在模糊查询中实现类似 IN 的多值判断,可采用变通方法。

背景知识:

  • 数字型IN查询:直接使用 WHERE id IN (1, 2)。
  • 字符串精确IN查询:添加引号 WHERE name IN ('aaa', 'bbb')。

操作方案:使用 CONCAT 函数动态构建模糊匹配模式。

若有一个列表需要模糊检查,可以通过拼接 % 符号来构造通配符字符串。例如,在自定义函数或应用层生成以下SQL结构:

复制代码 代码如下:
-- 示例:检查字段是否包含 'aaa' 或 'bbb' 中的任意一个模糊片段
-- 注意:原生SQL直接写 CONCAT('%','aaa','%') 只是构造了字符串,
-- 实际多值模糊通常需要结合 OR 逻辑或使用 FIND_IN_SET 等变通。
-- 下面展示的是原文提供的特定语境下的 CONCAT 用法逻辑示意:
SELECT * FROM customers 
WHERE 'Robert Bob Smith III, PhD.' LIKE CONCAT('%', name_column, '%')
-- 这实际上是将待查字符串作为基准,去匹配库中的name字段模式

更常见的实用场景修正说明:

原文提到的 LIKE CONCAT('%', ... , '%') 更多用于将外部输入的参数包裹通配符后与字段比较。若要实现“匹配A或B或C中的任意一个”的模糊效果,最稳妥的标准写法依然是串联 OR:

复制代码 代码如下:
SELECT * FROM tb_require 
WHERE require_name LIKE '%aaa%' 
   OR require_name LIKE '%bbb%'
   OR require_name LIKE '%ccc%'
如果必须使用集合思想,且值为静态已知,建议使用 REGEXP 的正则“或”语法 |:
复制代码 代码如下:
SELECT * FROM tb_require 
WHERE require_name REGEXP 'aaa|bbb|ccc'

关键点提醒:使用 CONCAT 函数时,括号内需紧密跟随参数,避免不必要的空格导致格式错误。

完成判断

执行上述SQL语句后,观察结果集:
- 使用 LIKE 应返回所有符合通配符模式的行。
- 使用 REGEXP 应严格遵循正则规则的起始、结束及字符类定义。
- 多值匹配时,确保无漏网之鱼且无错杀(假阳性)。对于中文匹配,再次核对字符集设置。

原文有依据的排错

  • 运算符误用:在使用SQL模式(LIKE)时,不能使用 = 或 != 进行比较,必须使用 LKE 或 NOT LIKE。
  • 大小写敏感性:默认情况下,MySQL的SQL模式忽略大小写。若需区分大小写,应使用 BINARY 关键字或调整数据库排序规则(Collation),或在正则中使用字符类明确指定(如 [a-zA-Z])。
  • 空格问题:在调用函数如 CONCAT() 时,确保紧跟括号,内部参数间如有逗号则需规范书写,避免因额外空格引发解析异常。

简要总结

MySQL提供了丰富的字符串匹配工具。LIKE 适合简单的通配符过滤,而 REGEXP 则赋予了开发者和DBA更强的正则操控力。在处理复杂的多值模糊搜索需求时,理解 IN 的局限性并转向 OR 组合或 REGEXP 的 | 语法,是构建健壮查询的关键。

以上就是MySQL LIKE查询字符串示例语句及高级用法的详细内容,更多关于MySQL模糊搜索与SQL优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。