了解数据库rlike正则表达式的用法 (数据库rlike用法)

正则表达式(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语句有哪些

数据库常用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语句有哪些的信息别忘了在本站进行查找喔。


数据运维技术 » 了解数据库rlike正则表达式的用法 (数据库rlike用法)