SQL 正则表达式详解:语法、函数与实战案例(MySQL/Oracle通用)

在数据处理与查询场景中,SQL 正则表达式是实现模糊匹配、数据清洗、格式校验的核心工具,相比传统 LIKE 模糊查询,正则表达式支持更复杂的字符规则匹配,能高效解决手机号、邮箱、身份证号等格式验证、关键词精准提取等需求。

本文将以MySQL为主(兼容主流数据库正则语法),系统讲解SQL正则表达式的语法规则、常用函数、实战案例,并搭配表格总结与可直接运行的代码示例,帮你快速掌握SQL正则的使用技巧。

一、SQL正则表达式基础认知

SQL中的正则表达式依赖数据库内置函数实现,MySQL使用 REGEXP / RLIKE 关键字+正则语法完成匹配,Oracle使用 REGEXP_LIKE 函数,核心语法逻辑一致,仅函数调用形式略有差异。

核心作用

  1. 精准匹配符合特定规则的字符串(如纯数字、邮箱格式)
  2. 替代 LIKE 实现复杂模糊查询(如匹配以某字符开头、包含指定字符组)
  3. 数据清洗:过滤无效数据、提取规范格式内容

二、SQL正则表达式核心语法(速查表)

以下是MySQL正则表达式最常用的元字符与语法,覆盖90%实战场景,建议直接收藏:

元字符/符号 含义说明 匹配示例

^ 匹配字符串开头 ^a :以a开头的字符串

匹配字符串结尾 s :以s结尾的字符串

. 匹配任意单个字符(除换行) a.c :abc、a1c、a@c

  • 匹配前面的字符0次或多次 ab* :a、ab、abb
  • 匹配前面的字符1次或多次 ab+ :ab、abb、abbb
    ? 匹配前面的字符0次或1次 ab? :a、ab
    字符集 匹配字符集中任意一个字符 abc :a、b、c; 0-9 :任意数字
    \^字符集 匹配不在字符集中的字符 \^0-9 :非数字字符
    {n} 匹配前面的字符恰好n次 0-9{3} :3位数字
    {n,m} 匹配前面的字符n~m次 0-9{2,4} :2-4位数字
    逻辑或匹配
    () 分组,将多个字符作为整体匹配 (ab)+ :ab、abab

注意:MySQL正则表达式不区分大小写,若需严格区分,可使用 REGEXP BINARY 关键字。

三、SQL正则常用函数与基础用法

  1. MySQL:REGEXP/RLIKE 关键字

MySQL中直接使用 字段名 REGEXP '正则表达式' 即可实现匹配, RLIKE 是 REGEXP 的同义词,效果完全一致。

语法格式:

sql

SELECT 字段 FROM 表名 WHERE 字段 REGEXP '正则规则';

  1. 基础匹配代码示例

示例1:匹配以指定字符开头/结尾的数据

sql

-- 匹配用户名以字母a开头的用户

SELECT username FROM user WHERE username REGEXP '^a';

-- 匹配手机号以88结尾的用户

SELECT phone FROM user WHERE phone REGEXP '88$';

示例2:匹配包含指定字符组的数据

sql

-- 匹配用户名包含a/b/c中任意一个字符的记录

SELECT username FROM user WHERE username REGEXP 'abc';

-- 匹配用户名纯数字的记录

SELECT username FROM user WHERE username REGEXP '[1](#1)+$';

示例3:匹配固定长度/范围长度的字符

sql

-- 匹配手机号为11位纯数字(基础校验)

SELECT phone FROM user WHERE phone REGEXP '[2](#2){11}$';

-- 匹配密码长度6-12位,包含字母/数字

SELECT password FROM user WHERE password REGEXP '[3](#3){6,12}$';

四、SQL正则实战高级案例

案例1:邮箱格式校验

匹配标准邮箱格式(字符@域名.后缀):

sql

-- 校验邮箱是否符合 xxx@xxx.xxx 格式

SELECT email FROM user

WHERE email REGEXP '[4](#4)+@a-zA-Z0-9.-+\.a-zA-Z{2,6}$';

规则解析:

  • [5](#5)+ :邮箱前缀由字母、数字、下划线、点、横杠组成
  • @ :固定@符号
  • a-zA-Z0-9.-+ :域名主体
  • \.a-zA-Z{2,6}$ :后缀为2-6位字母(如com、cn、net)

案例2:身份证号校验(18位)

sql

-- 匹配18位身份证号(最后一位可为X/x)

SELECT id_card FROM user

WHERE id_card REGEXP '[6](#6)\d{5}1-9\d{3}((0\d)|(10-2))((0\|1\|2\d)|30-1)\d{3}(0-9|X|x)$';

案例3:过滤含特殊字符的用户名

sql

-- 匹配用户名包含@#$%等特殊字符的记录

SELECT username FROM user WHERE username REGEXP '\^a-zA-Z0-9';

案例4:逻辑或匹配多关键词

sql

-- 匹配地址包含北京、上海、广州的记录

SELECT address FROM user WHERE address REGEXP '北京|上海|广州';

五、不同数据库正则差异(极简总结)

数据库 正则函数/关键字 核心区别

MySQL REGEXP / RLIKE 语法简洁,不区分大小写,支持基础正则

Oracle REGEXP_LIKE 函数式调用,支持更丰富的正则扩展

SQL Server LIKE +通配符/ PATINDEX 2017+支持 REGEXP ,兼容部分语法

六、注意事项

  1. 转义字符:匹配 . 、 * 、 + 等元字符本身时,需加 \ 转义(如 \. 匹配点号)
  2. 性能优化:正则匹配会全表扫描,大数据量下建议先过滤索引字段,再用正则
  3. 大小写区分:MySQL默认不区分,需区分时用 REGEXP BINARY

七、总结

SQL正则表达式是数据查询的高效利器,相比传统 LIKE 查询,灵活性提升数倍,尤其适合数据格式校验、复杂模糊匹配场景。

本文整理的正则语法表可直接作为速查手册,搭配实战代码示例,能快速解决日常开发中的字符串匹配问题。建议在实际业务中,优先使用正则完成格式验证类需求。


  1. 0-9 ↩︎

  2. 0-9 ↩︎

  3. a-zA-Z0-9 ↩︎

  4. a-zA-Z0-9._- ↩︎

  5. a-zA-Z0-9._- ↩︎

  6. 1-9 ↩︎

相关推荐
DIY源码阁15 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse
不总是18 小时前
[2026最新] Windows 免安装版 MySQL 8 详细安装配置教程(ZIP 压缩包版)
数据库·windows·mysql
徒手猫18 小时前
MySQL 窗口函数完全指南
数据库·mysql
betazhou19 小时前
电科金仓数据库V9 MySQL兼容版本搭建一主一从体验
数据库·mysql·oracle·主从·高可用·kingbase·v9 mysql兼容版本
元宝骑士19 小时前
MySQL 8.0 递归 CTE:树形结构一键生成层级 Path 并更新回表
后端·mysql
Lao A(zhou liang)的菜园20 小时前
Oracle 增量检查点 & FAST_START_MTTR_TARGET 核心总结
数据库·oracle
wbs_scy20 小时前
MySQL 多表连接查询实战:内连接 + 外连接
数据库·mysql
杨云龙UP20 小时前
ODA/Oracle RAC 节点 Load 100+ 排查:一个 lsof 残留进程引发的负载虚高问题 2026-05-27
linux·数据库·oracle·centos·误操作
BD_Marathon21 小时前
SQL学习指南——事务
数据库·sql·oracle
IT龟苓膏1 天前
MySQL 表设计与 SQL 优化:从字段类型、主键设计到深分页优化一篇讲清
数据库·sql·mysql