正则表达式(Regular Expression)是一种用来匹配字符串和字符模式的特殊文本序列,广泛应用于文本匹配和替换、数据提取等领域。在数据库的查询和操作中,正则表达式也是一个非常有用的工具。其中,rlike是MySQL和Spark SQL中常用的正则表达式函数。
本文将从以下三个方面介绍rlike正则表达式的基本用法:语法结构、匹配模式以及实战应用。
一、语法结构
rlike函数的一般语法结构如下:
rlike(pattern, string)
其中,pattern为正则表达式模式,string为需要匹配的字符串。函数返回值为1或0,分别表示string是否匹配pattern。
举例说明,假设有如下的字符串:
“Hello, world! Good morning!”
我们可以用如下的rlike语句来匹配其中的单词 “world”:
select ‘Hello, world! Good morning!’ rlike ‘world’
执行结果是1,表示字符串中包含 “world”。
需要注意的是,rlike函数区分大小写,因此如果要匹配不区分大小写的字符串,可以使用regexp或ilike函数。
二、匹配模式
rlike函数的匹配模式主要包括通配符、字符类和限定符。
1. 通配符
rlike函数支持两种通配符: “.” 和 ” * “。
“.” : 匹配任意单个字符。例如,rlike(“.e”, “here”)将返回1,表示”here”中包含以”e”结尾的两个字符的组合。
“*” : 匹配一个或多个重复字符。例如,rlike(“l*”, “hello”)将返回1,表示”hello”中包含一个或多个 “l” 的组合。
2. 字符类
rlike函数支持多种字符类,用于匹配指定的字符集。主要包括以下几种:
“[abc]” : 匹配方括号内的任何一个字符。例如,rlike(“[abc]”, “defgabc”)将返回1,表示”defgabc”中包含字符 “a”、 “b” 或 “c” 中的任何一个。
“[a-z]” : 匹配某一单个字母,并指定其为小写(a~z)。
“[A-Z]” : 匹配某一单个字母,并指定其为大写(A~Z)。
“[0-9]” : 匹配任何数字字符(0~9)。
“[^abc]” : 匹配任何未出现在方括号内的字符,”^”表示否定。例如,rlike(“[^abc]”, “defg”)将返回1,表示”defg”中不包含 “a”、 “b” 或 “c” 中的任何一个字符。
3. 限定符
rlike函数也支持多种限定符,用于指定匹配字符串的数量。主要包括以下几种:
“?” : 匹配零个或一个重复字符。例如,rlike(“ab?”, “acb”)将返回1,表示”acb”中包含以 “a” 开始,且后面可能出现 “b” 的组合。
“+” : 匹配一个或多个重复字符。例如,rlike(“bc+”, “abcbcb”)将返回1,表示”abcbcb”中含有至少一个 “b” 后面跟随一个或多个 “c” 的组合。
“{}” : 匹配重复的指定数量字符。例如,rlike(“a{2,5}”, “a”)将返回0,表示字符串中没有匹配 “a” 两次到五次的组合。而rlike(“a{2,5}”, “aaa”)将返回1,表示字符串中匹配了 “a” 三次。
“^” : 匹配行首。例如,rlike(“^abc”, “abcdefg”)将返回1,表示字符串以 “abc” 开头。
“$” : 匹配行尾。例如,rlike(“efg$”, “abcdefg”)将返回1,表示字符串以 “efg” 结尾。
三、实战应用
rlike正则表达式在实际生产中有许多应用场景。在数据清洗和提取方面,可以用它来去除或查找某些非法字符或信息。以下是一些常见的实际应用场景:
1. 去除非数字字符
例如,我们需要从某一数据库中提取所有数字,可以使用如下的语句:
select regexp_replace(string, “[^0-9]+”, “”) from table_name;
其中,”[^0-9]+”表示匹配所有的非数字字符。
2. 查找邮件地址
例如,我们需要查找某一字符串中所有的邮件地址,可以使用如下的语句:
select * from table_name where string rlike ‘[A-Za-z0-9._%-]+@[A-Za-z]+\\.[A-Za-z]{2,4}’;
其中,”[A-Za-z0-9._%-]+@[A-Za-z]+\\.[A-Za-z]{2,4}”表示匹配邮件地址,其中 “[A-Za-z0-9._%-]+” 匹配用户名,”[A-Za-z]+” 匹配域名,”[A-Za-z]{2,4}” 匹配域名后缀。
3. 匹配中国手机号码
例如,我们需要查找某一字符串中所有的中国手机号码,可以使用如下的语句:
select * from table_name where string rlike ‘^1[3456789]\\d{9}$’
其中,”^1[3456789]\\d{9}$”表示匹配中国手机。”^” 匹配字符串开头,”$” 匹配字符串结尾。”1[3456789]”匹配以”1″开头,后面跟随 “3” 至 “9” 的数字,”\\d{9}”匹配后面的 9 个任何数字字符。
:
本文对rlike正则表达式的基本语法结构、匹配模式以及实际应用场景做了简单介绍。掌握这些基础知识,可以更好的应用rlike函数来处理复杂的字符串和文本数据。
相关问题拓展阅读:
数据库常用sql语句
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
问题:
1、查询“001”课程比“002”课程成绩高的所有学生的学号;
逗仿 select a.S# from (select s#,score from SC where C#=’001′) a,(select s#,score
from SC where C#=’002′) b
where a.score>b.score and a.s#=b.s#;
2、查询平均成绩大于60分的同学的学号和平均成绩;
select S#,avg(score)
from sc
group by S# having avg(score) >60;
3、查询所有山帆纤同学的学号、姓名、选课数、总成绩;
select Student.S#,Student.Sname,count(SC.C#),sum(score)
from Student left Outer join SC on Student.S#=SC.S#
group by Student.S#,Sname
4、查询姓“李”的老师的个数;
select count(distinct(Tname))
from Teacher
where Tname like ‘李%’;
5、查询没学过“叶平”老师课的同学的学号、姓名;
select Student.S#,Student.Sname
from Student
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’叶平’);
6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#=’001’and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#=’002′);
轿做 7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
select S#,Sname
from Student
where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’叶平’ group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname=’叶平’));
8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#=’002′) score2
from Student,SC where Student.S#=SC.S# and C#=’001′) S_2 where score260);
10、查询没有学全所有课的同学的学号、姓名;
select Student.S#,Student.Sname
from Student,SC
where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) =60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数
FROM SC T,Course
where t.C#=course.C#
GROUP BY t.C#
ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC
20、查询如下课程平均成绩和及格率的百分数(用”1行”显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)
SELECT SUM(CASE WHEN C# =’001′ THEN score ELSE 0 END)/SUM(CASE C# WHEN ‘001’ THEN 1 ELSE 0 END) AS 企业管理平均分
,100 * SUM(CASE WHEN C# = ‘001’ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = ‘001’ THEN 1 ELSE 0 END) AS 企业管理及格百分数
,SUM(CASE WHEN C# = ‘002’ THEN score ELSE 0 END)/SUM(CASE C# WHEN ‘002’ THEN 1 ELSE 0 END) AS 马克思平均分
,100 * SUM(CASE WHEN C# = ‘002’ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = ‘002’ THEN 1 ELSE 0 END) AS 马克思及格百分数
,SUM(CASE WHEN C# = ‘003’ THEN score ELSE 0 END)/SUM(CASE C# WHEN ‘003’ THEN 1 ELSE 0 END) AS UML平均分
,100 * SUM(CASE WHEN C# = ‘003’ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = ‘003’ THEN 1 ELSE 0 END) AS UML及格百分数
,SUM(CASE WHEN C# = ‘004’ THEN score ELSE 0 END)/SUM(CASE C# WHEN ‘004’ THEN 1 ELSE 0 END) AS 数据库平均分
,100 * SUM(CASE WHEN C# = ‘004’ AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = ‘004’ THEN 1 ELSE 0 END) AS 数据库及格百分数
FROM SC
21、查询不同老师所教不同课程平均分从高到低显示
SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS 平均成绩
FROM SC AS T,Course AS C ,Teacher AS Z
where T.C#=C.C# and C.T#=Z.T#
GROUP BY C.C#
ORDER BY AVG(Score) DESC
22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004)
,,企业管理,马克思,UML,数据库,平均成绩
SELECT DISTINCT top 3
SC.S# As 学生学号,
Student.Sname AS 学生姓名 ,
T1.score AS 企业管理,
T2.score AS 马克思,
T3.score AS UML,
T4.score AS 数据库,
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分
FROM Student,SC LEFT JOIN SC AS T1
ON SC.S# = T1.S# AND T1.C# = ‘001’
LEFT JOIN SC AS T2
ON SC.S# = T2.S# AND T2.C# = ‘002’
LEFT JOIN SC AS T3
ON SC.S# = T3.S# AND T3.C# = ‘003’
LEFT JOIN SC AS T4
ON SC.S# = T4.S# AND T4.C# = ‘004’
WHERE student.S#=SC.S# and
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
NOT IN
(SELECT
DISTINCT
TOP 15 WITH TIES
ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
FROM sc
LEFT JOIN sc AS T1
ON sc.S# = T1.S# AND T1.C# = ‘k1’
LEFT JOIN sc AS T2
ON sc.S# = T2.S# AND T2.C# = ‘k2’
LEFT JOIN sc AS T3
ON sc.S# = T3.S# AND T3.C# = ‘k3’
LEFT JOIN sc AS T4
ON sc.S# = T4.S# AND T4.C# = ‘k4’
ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);
23、统计列印各科成绩,各分数段人数:课程ID,课程名称,,,,
S# as 学生学号,平均成绩
FROM (SELECT S#,AVG(score) 平均成绩
FROM SC
GROUP BY S#
) AS T2
ORDER BY 平均成绩 desc;
25、查询各科成绩前三名的记录:(不考虑成绩并列情况)
SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 3 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
26、查询每门课程被选修的学生数
select c#,count(S#) from sc group by C#;
27、查询出只选修了一门课程的全部学生的学号和姓名
select SC.S#,Student.Sname,count(C#) AS 选课数
from SC ,Student
where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;
28、查询男生、女生人数
Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex=’男’;
Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex=’女’;
29、查询姓“张”的学生名单
SELECT Sname FROM Student WHERE Sname like ‘张%’;
30、查询同名同性学生名单,并统计同名人数
select Sname,count(*) from Student group by Sname having count(*)>1;;
31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)
select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age
from student
where CONVERT(11),DATEPART(year,Sage))=’1981′;
32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;
33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
select Sname,SC.S# ,avg(score)
from Student,SC
where Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85;
34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数
Select Sname,isnull(score,0)
from Student,SC,Course
where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname=’数据库’and score=70 AND SC.S#=student.S#;
37、查询不及格的课程,并按课程号从大到小排列
select c# from sc where scor e80 and C#=’003′;
39、求选了课程的学生人数
select count(*) from sc;
40、查询选修“叶平”老师所授课程的学生中,成绩更高的学生姓名及其成绩
select Student.Sname,score
from Student,SC,Course C,Teacher
where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname=’叶平’ and SC.score=(select max(score)from SC where C#=C.C# );
41、查询各个课程及相应的选修人数
select count(*) from sc group by C#;
42、查询不同课程成绩相同的学生的学号、课程号、学生成绩
select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# B.C# ;
43、查询每门功成绩更好的前两名
SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
FROM SC t1
WHERE score IN (SELECT TOP 2 score
FROM SC
WHERE t1.C#= C#
ORDER BY score DESC
)
ORDER BY t1.C#;
44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列
select C# as 课程号,count(*) as 人数
from sc
group by C#
order by count(*) desc,c#
45、检索至少选修两门课程的学生学号
select S#
from sc
group by s#
having count(*) > = 2
46、查询全部学生都选修的课程的’课程号和课程名
select C#,Cname
from Course
where C# in (select c# from sc group by c#)
47、查询没学过“叶平”老师讲授的任一门课程的学生姓名
select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname=’叶平’);
48、查询两门以上不及格课程的同学的学号及其平均成绩
select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score2)group by S#;
49、检索“004”课程分数小于60,按分数降序排列的同学学号
select S# from SC where C#=’004’and score200
select 100
2、变量
用户自定义变量使用@开始,使用set给变量赋值。
set @name=‘孙悟空’;
select @name;
select * from student;
into student values (6,‘孙悟空’,20);
into student values (8,@name,20);
set @sid=9,@nid=10
into student values (@sid,@name,20);
select @sid+@nid;
set @sid=@sid+1;
select @sid;
set @sname3=(select sname from student where sid=9);
select @sname3;
3、系统变量
系统变量分为全局系统变量和会话系统变量。
全局系统变量:针对所有默认设置
会话系统变量:针对当前用户生效,用户登录MySQL会使用全局系统变量,如果会话中更改了变量值,使用更改后的值,不过只针对当前用户生效。
show variables 显示会话系统变量
show global variables 显示全局系统变量
show session variables 显示会话系统变量
show global variables like ‘sql_select_limit’;使用通配符显示匹配的变量设置
show session variables like ‘sql_select_limit’;系统变量使用@@标识
select @@global.sql_select_limit 查看某个全局系统变量设置
select @@session.sql_select_limit 查看某个会话系统变量设置
set @@session.sql_select_limit=2 设置会话系统变量
数据库rlike用法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于数据库rlike用法,了解数据库rlike正则表达式的用法,数据库常用sql语句有哪些的信息别忘了在本站进行查找喔。
创新互联成都网站建设公司提供专业的建站服务,为您量身定制,欢迎来电(028-86922220)为您打造专属于企业本身的网络品牌形象。
成都创新互联品牌官网提供专业的网站建设、设计、制作等服务,是一家以网站建设为主要业务的公司,在网站建设、设计和制作领域具有丰富的经验。
网站栏目:了解数据库rlike正则表达式的用法(数据库rlike用法)
浏览路径:http://www.mswzjz.cn/qtweb/news5/417605.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能