[零基础]MySQL正则表达式完全零基础入门:从“这什么鬼“到“真香!“

🎮 前言:正则表达式是什么?

想象一下,你要在手机通讯录里找人:

找 "张" 开头的人 → 输入"张"就能找到

找 "139" 开头的电话 → 也能快速找到

但如果要找 "13开头、第4位是5或8、11位数字" 的手机号呢?这就是正则表达式出场的时候了!

📦 第一章:准备工作

1.1 确保你的MySQL版本支持

bash 复制代码
sql
-- 查看MySQL版本(需要5.7以上)
SELECT VERSION();

-- 简单测试正则表达式功能
SELECT 'hello' REGEXP 'he';  -- 返回1(表示匹配)
SELECT 'world' REGEXP 'he';  -- 返回0(不匹配)

1.2 创建练习表

bash 复制代码
sql
-- 创建一个简单的练习表
CREATE TABLE practice_data (
    id INT AUTO_INCREMENT PRIMARY KEY,
    phone VARCHAR(20),
    email VARCHAR(50),
    username VARCHAR(30)
);

-- 插入一些测试数据
INSERT INTO practice_data (phone, email, username) VALUES
('13800138000', 'zhangsan@qq.com', '张三'),
('13912345678', 'lisi@gmail.com', '李四'),
('abc123', 'wangwu@163.com', '王五'),
('150-5555-6666', 'error_email', '赵六'),
('18188889999', 'zhaoliu@hotmail.com', 'user_007'),
('手机号', 'test@test.com', '测试用户');

🎯 第二章:最简单的正则表达式

2.1 最基本用法:查找包含某段文字

bash 复制代码
sql
-- 查找包含"张三"的记录
SELECT * FROM practice_data 
WHERE username LIKE '%张三%';  -- 传统写法

SELECT * FROM practice_data 
WHERE username REGEXP '张三';   -- 正则写法

-- 两者的结果一样!但...

2.2 找"开头是..."的数据

bash 复制代码
sql
-- 找出手机号以"139"开头的用户
SELECT * FROM practice_data 
WHERE phone LIKE '139%';        -- LIKE写法

SELECT * FROM practice_data 
WHERE phone REGEXP '^139';      -- REGEXP写法

-- ^ 表示"开头"
-- 发音:"尖尖向上,指开头"

2.3 找"结尾是..."的数据

bash 复制代码
sql
-- 找出邮箱以".com"结尾的用户
SELECT * FROM practice_data 
WHERE email LIKE '%.com';       -- LIKE写法

SELECT * FROM practice_data 
WHERE email REGEXP 'com$';      -- REGEXP写法

-- $ 表示"结尾"
-- 记忆:钱的符号在最后(结尾)

2.4 小练习:试试看!

bash 复制代码
sql
-- 练习1:找出用户名以"张"开头的
SELECT * FROM practice_data WHERE username REGEXP '^张';

-- 练习2:找出邮箱以"163.com"结尾的
SELECT * FROM practice_data WHERE email REGEXP '163.com$';

-- 练习3:找出包含"test"的任何字段
SELECT * FROM practice_data 
WHERE username REGEXP 'test' 
   OR email REGEXP 'test' 
   OR phone REGEXP 'test';

🔤 第三章:查找"某一个"字符

3.1 找任意单个字符

bash 复制代码
sql
-- 查找用户名包含"张_"的(_表示任意一个字符)
SELECT * FROM practice_data 
WHERE username LIKE '张_';        -- 只能匹配"张" + 1个字

SELECT * FROM practice_data 
WHERE username REGEXP '张.';      -- 匹配"张" + 任意1个字

-- . 表示"任意一个字符"
-- 比如:张三、张四、张A 都能匹配

3.2 从几个字符中选一个

bash 复制代码
sql
-- 查找139或138开头的手机号
SELECT * FROM practice_data 
WHERE phone LIKE '139%' OR phone LIKE '138%';  -- 传统写法,麻烦!

SELECT * FROM practice_data 
WHERE phone REGEXP '^13[89]';  -- 正则写法,简单!

-- [89] 表示:要么是8,要么是9
-- 13[89] 表示:138 或 139

3.3 更多例子

bash 复制代码
sql
-- 查找手机号第二位是3、5、7、8、9的
SELECT * FROM practice_data 
WHERE phone REGEXP '^1[35789]';

-- 查找用户名包含"张"或"李"的
SELECT * FROM practice_data 
WHERE username REGEXP '[张李]';

-- [a-z] 表示:任意小写字母
-- [A-Z] 表示:任意大写字母
-- [0-9] 表示:任意数字
-- [张李王] 表示:张、李、王中的一个

3.4 小练习

bash 复制代码
sql
-- 练习1:找出手机号以13或15开头的
SELECT * FROM practice_data WHERE phone REGEXP '^1[35]';

-- 练习2:找出用户名包含中文的
SELECT * FROM practice_data WHERE username REGEXP '[张李王赵]';

-- 练习3:找出邮箱包含数字的
SELECT * FROM practice_data WHERE email REGEXP '[0-9]';

🔢 第四章:找"重复的"字符

4.1 找连续出现的数字

bash 复制代码
sql
-- 查找包含"连续2个8"的手机号
SELECT * FROM practice_data 
WHERE phone REGEXP '88';

-- 但这样也会匹配到"888"、"1888"等
-- 如果我们想要"正好2个8"呢?

4.2 控制重复次数

bash 复制代码
sql
-- {n} 表示:正好重复n次
-- {n,} 表示:至少重复n次
-- {n,m} 表示:重复n到m次

-- 查找包含"正好3个连续数字"的记录
SELECT * FROM practice_data 
WHERE phone REGEXP '[0-9]{3}';

-- 查找包含"至少2个连续数字"的记录
SELECT * FROM practice_data 
WHERE phone REGEXP '[0-9]{2,}';

-- 查找包含"2到4个连续数字"的记录
SELECT * FROM practice_data 
WHERE phone REGEXP '[0-9]{2,4}';

4.3 特殊重复符号

bash 复制代码
sql
-- * 表示:0次或多次(可有可无)
-- + 表示:1次或多次(至少1次)
-- ? 表示:0次或1次(可有可无)

-- 查找形如"138-8888-9999"的电话
SELECT * FROM practice_data 
WHERE phone REGEXP '^[0-9]{3}-[0-9]{4}-[0-9]{4}$';

-- 查找包含字母和数字的用户名
SELECT * FROM practice_data 
WHERE username REGEXP '[a-zA-Z]+[0-9]+';

4.4 小练习

bash 复制代码
sql
-- 练习1:找出11位纯数字手机号
SELECT * FROM practice_data WHERE phone REGEXP '^[0-9]{11}$';

-- 练习2:找出用户名包含至少2个连续数字的
SELECT * FROM practice_data WHERE username REGEXP '[0-9]{2}';

-- 练习3:找出邮箱包含".com"或".cn"的
SELECT * FROM practice_data WHERE email REGEXP '\.(com|cn)$';
-- \. 表示真正的点号(不是任意字符)
-- | 表示"或者"

🏆 第五章:实战应用场景

5.1 验证手机号格式

sql 复制代码
sql
-- 验证中国大陆手机号(简单版)
SELECT 
    phone,
    CASE 
        WHEN phone REGEXP '^1[3-9][0-9]{9}$' 
        THEN '✅ 有效手机号'
        ELSE '❌ 无效手机号'
    END as 验证结果
FROM practice_data;

/* 规则解释:
^1        以1开头
[3-9]     第二位是3-9
[0-9]{9}  后面9位是数字
$         结束
*/

5.2 验证邮箱格式

sql 复制代码
sql
-- 验证邮箱格式(基础版)
SELECT 
    email,
    CASE 
        WHEN email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'
        THEN '✅ 有效邮箱'
        ELSE '❌ 无效邮箱'
    END as 验证结果
FROM practice_data;

/* 规则解释(拆开看):
^[A-Za-z0-9._%+-]+  用户名部分:字母数字和特殊符号,至少1个
@                   必须有@符号
[A-Za-z0-9.-]+      域名部分:字母数字点号减号,至少1个
\.                  必须有真正的点号
[A-Za-z]{2,}        后缀:字母,至少2个
$                   结束
*/

5.3 清理数据

sql 复制代码
sql
-- 找出所有纯数字手机号(清理脏数据)
SELECT * FROM practice_data 
WHERE phone REGEXP '^[0-9]+$' 
  AND LENGTH(phone) = 11;

-- 找出所有格式正确的邮箱
SELECT * FROM practice_data 
WHERE email REGEXP '@.+\..+';  -- 简单检查:有@和点号

-- 提取手机号中的纯数字
UPDATE practice_data 
SET phone = REPLACE(REPLACE(phone, '-', ''), ' ', '')
WHERE phone REGEXP '[0-9]';

🚀 第六章:常用正则表达式模板

6.1 常用模板速查

python 复制代码
sql
-- 1. 手机号验证
'^1[3-9][0-9]{9}$'

-- 2. 邮箱验证(基础)
'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'

-- 3. 身份证号(15位或18位)
'^[1-9][0-9]{14}$|^[1-9][0-9]{16}[0-9Xx]$'

-- 4. 日期格式(YYYY-MM-DD)
'^[0-9]{4}-[0-9]{2}-[0-9]{2}$'

-- 5. 中文姓名(2-4个汉字)
'^[\u4e00-\u9fa5]{2,4}$'

-- 6. 邮政编码
'^[1-9][0-9]{5}$'

-- 7. IP地址(简单版)
'^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'

6.2 模板使用示例

sql 复制代码
sql
-- 创建用户表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(20),
    phone VARCHAR(20),
    email VARCHAR(50),
    id_card VARCHAR(20)
);

-- 插入时验证数据
INSERT INTO users (name, phone, email, id_card)
SELECT 
    '张三', 
    '13800138000', 
    'zhangsan@qq.com', 
    '110101199001011234'
WHERE 
    '13800138000' REGEXP '^1[3-9][0-9]{9}$'
    AND 'zhangsan@qq.com' REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';

🧩 第七章:常见问题解答

Q1:正则表达式难学吗?

A: 就像学打字,开始慢,熟练了就快!建议每天学2-3个符号。

Q2:什么时候用LIKE,什么时候用REGEXP?

sql 复制代码
sql
-- 简单情况用LIKE(更快)
SELECT * FROM users WHERE name LIKE '张%';

-- 复杂情况用REGEXP(功能强)
SELECT * FROM users WHERE phone REGEXP '^1[3-9][0-9]{9}$';

-- 判断标准:如果需要"或者"、"重复次数"、"字符集",就用REGEXP

Q3:正则表达式符号太多记不住?

python 复制代码
sql
-- 制作自己的速查表
/*
^   开头         如:^张
$   结尾         如:com$
.   任意一个字符   如:张.
[]  选一个        如:[123]
{}  重复次数      如:[0-9]{11}
|   或者         如:com|cn
*/

Q4:写错了怎么办?

sql 复制代码
sql
-- 先测试,再使用!
-- 错误示例:忘记转义点号
SELECT 'abc.com' REGEXP 'com$';  -- ✅ 返回1(正确)
SELECT 'abc.com' REGEXP '\.com$'; -- ✅ 返回1(正确)
SELECT 'abccom' REGEXP '\.com$'; -- ❌ 返回0(正确)
sql 复制代码
-- 技巧:先用SELECT测试
SELECT '13800138000' REGEXP '^1[3-9][0-9]{9}$' as 是否手机号;
-- 返回1就是对的,返回0就是错的

常见错误

sql 复制代码
sql
-- ❌ 错误:点号没转义
SELECT 'abc.com' REGEXP 'com$';  -- 正确,但可能误匹配
SELECT 'abccom' REGEXP 'com$';   -- 也会匹配!

-- ✅ 正确:转义点号
SELECT 'abc.com' REGEXP '\.com$'; -- 只匹配.com结尾

-- ❌ 错误:忘记加^和$
SELECT phone REGEXP '1[3-9][0-9]{9}';  -- 可能匹配到中间
-- 如:abc13800138000def 也会匹配!

-- ✅ 正确:加^和$限制
SELECT phone REGEXP '^1[3-9][0-9]{9}$'; -- 完全匹配

调试技巧

sql 复制代码
sql
-- 技巧1:分步测试
-- 先测试部分正则
SELECT '13800138000' REGEXP '^1' as 步骤1;  -- 应该返回1
SELECT '13800138000' REGEXP '^1[3-9]' as 步骤2;  -- 应该返回1
SELECT '13800138000' REGEXP '^1[3-9][0-9]{9}$' as 步骤3;  -- 应该返回1

-- 技巧2:用变量存储正则
SET @手机号正则 = '^1[3-9][0-9]{9}$';
SELECT '13800138000' REGEXP @手机号正则 as 是否手机号;

🎉 最后的鼓励

学习正则表达式就像学骑自行车:

第一天:歪歪扭扭,老摔跤(符号太多记不住)

第一周:能骑走了,但不太稳(基本功能会用)

第一个月:能上路了,还能带人(熟练应用)

半年后:各种花样随便玩(成为高手)

记住:

不用一次学会所有符号

从最常用的开始(^ $ . [])

多练习,多实践

遇到问题先拆分,再组合

📌 快速参考卡片(打印贴在墙上)

text

bash 复制代码
最常用5个符号:
^   开头        例:^张    → 以"张"开头
$   结尾        例:com$  → 以"com"结尾
.   任意字符    例:张.   → "张"后面跟1个字符
[]  选一个      例:[123] → 1或2或3
{}  重复次数    例:[0-9]{11} → 11个数字

常用模板:

bash 复制代码
手机号:^1[3-9][0-9]{9}$
邮箱:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$

💪 现在就开始吧!打开MySQL,复制上面的例子,动手试试看!

记住:最好的学习方式就是动手实践! 🚀

祝你学习顺利,早日成为正则表达式高手! 🎯

相关推荐
小高不会迪斯科6 小时前
CMU 15445学习心得(二) 内存管理及数据移动--数据库系统如何玩转内存
数据库·oracle
e***8907 小时前
MySQL 8.0版本JDBC驱动Jar包
数据库·mysql·jar
l1t7 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
失忆爆表症8 小时前
03_数据库配置指南:PostgreSQL 17 + pgvector 向量存储
数据库·postgresql
AI_56788 小时前
Excel数据透视表提速:Power Query预处理百万数据
数据库·excel
SQL必知必会9 小时前
SQL 窗口帧:ROWS vs RANGE 深度解析
数据库·sql·性能优化
Gauss松鼠会10 小时前
【GaussDB】GaussDB数据库开发设计之JDBC高可用性
数据库·数据库开发·gaussdb
+VX:Fegn089510 小时前
计算机毕业设计|基于springboot + vue鲜花商城系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
识君啊10 小时前
SpringBoot 事务管理解析 - @Transactional 的正确用法与常见坑
java·数据库·spring boot·后端
一个天蝎座 白勺 程序猿11 小时前
破译JSON密码:KingbaseES全场景JSON数据处理实战指南
数据库·sql·json·kingbasees·金仓数据库