问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

快速学会SQL中正则表达式REGEXP的使用技巧

创作时间:
作者:
@小白创作中心

快速学会SQL中正则表达式REGEXP的使用技巧

引用
1
来源
1.
https://clicksun.com.cn/mis/bbs/showapp.asp?id=23084

在SQL查询中,REGEXP是一个强大的正则表达式匹配运算符,能够实现复杂的模式匹配。本文将详细介绍REGEXP的基本语法和各种用法,并通过具体的SQL语句和查询结果进行说明。

在 SQL 查询语句中,REGEXP 是一个强大的正则表达式匹配运算符,用于在字符串中执行复杂的模式匹配。通过 REGEXP,用户可以定义自己的匹配模式,对数据进行精确或模糊的搜索,从而有效地处理各种复杂模式的字符串搜索需求。这为数据提取和处理提供了极大的便利。

正则表达式使用REGEXP命令进行匹配时,匹配成功,则返回结果为真(1),否则返回结果为假(0)。

由于LIKE跟REGEXP都是用于字符串模式匹配,这里为了节省空间,本篇文章将沿用之前LIKE篇章中所采用的测试数据作为演示。

REGEXP的语法

在SQL查询语句中,REGEXP的基本语法如下:

SELECT 列名1, 列名2, ...  
FROM 表名  
WHERE 列名1 REGEXP '正则表达式匹配模式';  

其中:

  • SELECT 列名1, 列名2, ...:选择要检索的列。
  • FROM 表名:指定要从中检索数据的表。
  • WHERE 列名1 REGEXP '正则表达式匹配模式':这部分是查询的条件,使用REGEXP运算符来过滤结果。只有满足正则表达式匹配模式的行才会被返回。

正则表达式由特殊字符和元字符组成,用于定义搜索模式。以下是一些常见的正则表达式元字符。

  • ^:匹配字符串的开头
  • $:匹配字符串的结尾
  • .:匹配任意单个字符
  • |:跟or类似,表示或
  • *:匹配前面的字符或子模式零次或多次
  • +:匹配前面的字符或子模式1次或多次
  • ?:匹配前面的字符或子模式零次或1次
  • []:匹配括号内的任意一个字符
  • [^]:匹配不在括号内的任意一个字符
  • [a-z]:匹配范围内的任意一个字符

REGEXP的基本用法

在日常工作中,我们经常使用REGEXP进行复杂的数据匹配和筛选,以下是关于REGEXP操作符的常见用法。

1. 搜索以特定字符或字符串开头的值

倘若,我们想要查询名字中以"古"字开头的员工,可以使用以下SQL语句:

SELECT * FROM tb_employees WHERE name REGEXP '^古';  

查询结果如下:

2. 搜索以特定字符或字符串结尾的值

倘若,我们想要查询名字中以"音"字结尾的员工,可以使用以下SQL语句:

SELECT * FROM tb_employees WHERE name REGEXP '音$';  

查询结果如下:

3. 搜索包含特定字符或字符串的值

倘若,我们想要查询名字中包含"凤"字,且年龄大于16的员工,可以使用以下SQL语句:

SELECT * FROM tb_employees WHERE name REGEXP '凤' AND age > 16;  

可以看到,要查询名字中包含特定字(例如"凤")的员工,当我们使用 REGEXP 时,不需加任何匹配规则,只需用单引号或双引号来包围字符即可,相当于LIKE '%%',注意,REGEXP 中没有LIKE的%和_通配符。

查询结果如下:

那如果想要查询名字中含有下划线的员工,可以使用以下SQL语句。

SELECT * FROM tb_employees WHERE name REGEXP '_';  

可以看到,使用REGEXP进行模式匹配,不需要像LIKE那样要使用转义符。

查询结果如下:

倘若,我们想要查询名字中含有c,且c前面包含r或b的员工。可以使用以下SQL语句:

SELECT * FROM tb_employees WHERE name REGEXP '[br]c';  

这个查询会搜索name中包含 bc、rc 的记录。若调整c的位置,c[br],则会搜索name中包含cb、cr的记录。

这条语句的查询结果如下:

想要查找名字中含有小写字母的员工,可以使用以下SQL语句:

SELECT * FROM tb_employees WHERE name REGEXP '^[a-z]';  

默认情况下,REGEXP是不区分大小写的。查询结果跟上图一致,返回abc、abrc的记录。

如果我们想找到所有名字中包含"古"或"音"的员工,可以使用以下SQL语句:

-- 方法1  
SELECT * FROM tb_employees WHERE name REGEXP '[古音]';  
-- 方法2  
SELECT * FROM tb_employees WHERE name REGEXP '古|音';  

查询结果如下:

4. 搜索包含特定长度的字符或字符串的值

倘若,我们想要查询名字长度为2个字符的员工,可以使用以下SQL语句:

SELECT * FROM tb_employees WHERE name REGEXP '^. {2}$';  

在这个语句中,^ 表示字符串的开头,$ 表示字符串的结尾,.{2} 表示匹配任意两个字符,.表示任意字符,{2} 表示恰好匹配两次

查询结果同上图结果一致,只返回古晋跟阿音2人。

通过上述示例,我们发现REGEXP与LIKE功能相似,但更为强大。它能够实现复杂且独特的规则匹配。

注意事项

1、在正则表达式中,使用括号()可以创建捕获组,将括号内的内容作为一个整体进行匹配。例如,正则表达式(ABC)会匹配整个字符串"ABC"。

2、REGEXP默认采用部分匹配原则,即只要有一个匹配项,就会返回真。

3、尽管REGEXP的功能强大且灵活,在处理复杂模式匹配时也是不可或缺,但在处理大量数据时,其性能可能会受到影响。因此,在编写复杂的正则表达式时,我们应注重优化以提高查询效率。在必要时,还需考虑采用其他方法,如数据预处理或索引,以进一步改善查询性能。当然,对于简单的查询,使用LIKE操作符可能更为合适且高效。

关于SQL 中的正则表达式REGEXP,本次分享就到这了。希望这个系列能帮助大家更深入地理解和运用数据库。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号