新聞中心
正則表達式(Regular Expression)是一種用來匹配字符串和字符模式的特殊文本序列,廣泛應(yīng)用于文本匹配和替換、數(shù)據(jù)提取等領(lǐng)域。在數(shù)據(jù)庫的查詢和操作中,正則表達式也是一個非常有用的工具。其中,rlike是MySQL和Spark SQL中常用的正則表達式函數(shù)。

本文將從以下三個方面介紹rlike正則表達式的基本用法:語法結(jié)構(gòu)、匹配模式以及實戰(zhàn)應(yīng)用。
一、語法結(jié)構(gòu)
rlike函數(shù)的一般語法結(jié)構(gòu)如下:
rlike(pattern, string)
其中,pattern為正則表達式模式,string為需要匹配的字符串。函數(shù)返回值為1或0,分別表示string是否匹配pattern。
舉例說明,假設(shè)有如下的字符串:
“Hello, world! Good morning!”
我們可以用如下的rlike語句來匹配其中的單詞 “world”:
select ‘Hello, world! Good morning!’ rlike ‘world’
執(zhí)行結(jié)果是1,表示字符串中包含 “world”。
需要注意的是,rlike函數(shù)區(qū)分大小寫,因此如果要匹配不區(qū)分大小寫的字符串,可以使用regexp或ilike函數(shù)。
二、匹配模式
rlike函數(shù)的匹配模式主要包括通配符、字符類和限定符。
1. 通配符
rlike函數(shù)支持兩種通配符: “.” 和 ” * “。
“.” : 匹配任意單個字符。例如,rlike(“.e”, “here”)將返回1,表示”here”中包含以”e”結(jié)尾的兩個字符的組合。
“*” : 匹配一個或多個重復(fù)字符。例如,rlike(“l(fā)*”, “hello”)將返回1,表示”hello”中包含一個或多個 “l(fā)” 的組合。
2. 字符類
rlike函數(shù)支持多種字符類,用于匹配指定的字符集。主要包括以下幾種:
“[abc]” : 匹配方括號內(nèi)的任何一個字符。例如,rlike(“[abc]”, “defgabc”)將返回1,表示”defgabc”中包含字符 “a”、 “b” 或 “c” 中的任何一個。
“[a-z]” : 匹配某一單個字母,并指定其為小寫(a~z)。
“[A-Z]” : 匹配某一單個字母,并指定其為大寫(A~Z)。
“[0-9]” : 匹配任何數(shù)字字符(0~9)。
“[^abc]” : 匹配任何未出現(xiàn)在方括號內(nèi)的字符,”^”表示否定。例如,rlike(“[^abc]”, “defg”)將返回1,表示”defg”中不包含 “a”、 “b” 或 “c” 中的任何一個字符。
3. 限定符
rlike函數(shù)也支持多種限定符,用于指定匹配字符串的數(shù)量。主要包括以下幾種:
“?” : 匹配零個或一個重復(fù)字符。例如,rlike(“ab?”, “acb”)將返回1,表示”acb”中包含以 “a” 開始,且后面可能出現(xiàn) “b” 的組合。
“+” : 匹配一個或多個重復(fù)字符。例如,rlike(“bc+”, “abcbcb”)將返回1,表示”abcbcb”中含有至少一個 “b” 后面跟隨一個或多個 “c” 的組合。
“{}” : 匹配重復(fù)的指定數(shù)量字符。例如,rlike(“a{2,5}”, “a”)將返回0,表示字符串中沒有匹配 “a” 兩次到五次的組合。而rlike(“a{2,5}”, “aaa”)將返回1,表示字符串中匹配了 “a” 三次。
“^” : 匹配行首。例如,rlike(“^abc”, “abcdefg”)將返回1,表示字符串以 “abc” 開頭。
“$” : 匹配行尾。例如,rlike(“efg$”, “abcdefg”)將返回1,表示字符串以 “efg” 結(jié)尾。
三、實戰(zhàn)應(yīng)用
rlike正則表達式在實際生產(chǎn)中有許多應(yīng)用場景。在數(shù)據(jù)清洗和提取方面,可以用它來去除或查找某些非法字符或信息。以下是一些常見的實際應(yīng)用場景:
1. 去除非數(shù)字字符
例如,我們需要從某一數(shù)據(jù)庫中提取所有數(shù)字,可以使用如下的語句:
select regexp_replace(string, “[^0-9]+”, “”) from table_name;
其中,”[^0-9]+”表示匹配所有的非數(shù)字字符。
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}$”表示匹配中國手機?!盺” 匹配字符串開頭,”$” 匹配字符串結(jié)尾。”1[3456789]”匹配以”1″開頭,后面跟隨 “3” 至 “9” 的數(shù)字,”\\d{9}”匹配后面的 9 個任何數(shù)字字符。
:
本文對rlike正則表達式的基本語法結(jié)構(gòu)、匹配模式以及實際應(yīng)用場景做了簡單介紹。掌握這些基礎(chǔ)知識,可以更好的應(yīng)用rlike函數(shù)來處理復(fù)雜的字符串和文本數(shù)據(jù)。
相關(guān)問題拓展閱讀:
- 數(shù)據(jù)庫常用sql語句有哪些
數(shù)據(jù)庫常用sql語句有哪些
數(shù)據(jù)庫常用sql語句
Student(S#,Sname,Sage,Ssex) 學(xué)生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表
問題:
1、查詢“001”課程比“002”課程成績高的所有學(xué)生的學(xué)號;
逗仿 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分的同學(xué)的學(xué)號和平均成績;
select S#,avg(score)
from sc
group by S# having avg(score) >60;
3、查詢所有山帆纖同學(xué)的學(xué)號、姓名、選課數(shù)、總成績;
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、查詢姓“李”的老師的個數(shù);
select count(distinct(Tname))
from Teacher
where Tname like ‘李%’;
5、查詢沒學(xué)過“葉平”老師課的同學(xué)的學(xué)號、姓名;
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、查詢學(xué)過“001”并且也學(xué)過編號“002”課程的同學(xué)的學(xué)號、姓名;
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、查詢學(xué)過“葉平”老師所教的所有課的同學(xué)的學(xué)號、姓名;
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”課程低的所有同學(xué)的學(xué)號、姓名;
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、查詢沒有學(xué)全所有課的同學(xué)的學(xué)號、姓名;
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 及格百分數(shù)
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、查詢?nèi)缦抡n程平均成績和及格率的百分數(shù)(用”1行”顯示): 企業(yè)管理(001),馬克思(002),OO&UML (003),數(shù)據(jù)庫(004)
SELECT SUM(CASE WHEN C# =’001′ THEN score ELSE 0 END)/SUM(CASE C# WHEN ‘001’ THEN 1 ELSE 0 END) AS 企業(yè)管理平均分
,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 企業(yè)管理及格百分數(shù)
,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 馬克思及格百分數(shù)
,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及格百分數(shù)
,SUM(CASE WHEN C# = ‘004’ THEN score ELSE 0 END)/SUM(CASE C# WHEN ‘004’ THEN 1 ELSE 0 END) AS 數(shù)據(jù)庫平均分
,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 數(shù)據(jù)庫及格百分數(shù)
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、查詢?nèi)缦抡n程成績第 3 名到第 6 名的學(xué)生成績單:企業(yè)管理(001),馬克思(002),UML (003),數(shù)據(jù)庫(004)
,,企業(yè)管理,馬克思,UML,數(shù)據(jù)庫,平均成績
SELECT DISTINCT top 3
SC.S# As 學(xué)生學(xué)號,
Student.Sname AS 學(xué)生姓名 ,
T1.score AS 企業(yè)管理,
T2.score AS 馬克思,
T3.score AS UML,
T4.score AS 數(shù)據(jù)庫,
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、統(tǒng)計列印各科成績,各分數(shù)段人數(shù):課程ID,課程名稱,,,,
S# as 學(xué)生學(xué)號,平均成績
FROM (SELECT S#,AVG(score) 平均成績
FROM SC
GROUP BY S#
) AS T2
ORDER BY 平均成績 desc;
25、查詢各科成績前三名的記錄:(不考慮成績并列情況)
SELECT t1.S# as 學(xué)生ID,t1.C# as 課程ID,Score as 分數(shù)
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、查詢每門課程被選修的學(xué)生數(shù)
select c#,count(S#) from sc group by C#;
27、查詢出只選修了一門課程的全部學(xué)生的學(xué)號和姓名
select SC.S#,Student.Sname,count(C#) AS 選課數(shù)
from SC ,Student
where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;
28、查詢男生、女生人數(shù)
Select count(Ssex) as 男生人數(shù) from Student group by Ssex having Ssex=’男’;
Select count(Ssex) as 女生人數(shù) from Student group by Ssex having Ssex=’女’;
29、查詢姓“張”的學(xué)生名單
SELECT Sname FROM Student WHERE Sname like ‘張%’;
30、查詢同名同性學(xué)生名單,并統(tǒng)計同名人數(shù)
select Sname,count(*) from Student group by Sname having count(*)>1;;
31、1981年出生的學(xué)生名單(注:Student表中Sage列的類型是datetime)
select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age
from student
where CONVERT(11),DATEPART(year,Sage))=’1981′;
32、查詢每門課程的平均成績,結(jié)果按平均成績升序排列,平均成績相同時,按課程號降序排列
Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;
33、查詢平均成績大于85的所有學(xué)生的學(xué)號、姓名和平均成績
select Sname,SC.S# ,avg(score)
from Student,SC
where Student.S#=SC.S# group by SC.S#,Sname having avg(score)>85;
34、查詢課程名稱為“數(shù)據(jù)庫”,且分數(shù)低于60的學(xué)生姓名和分數(shù)
Select Sname,isnull(score,0)
from Student,SC,Course
where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname=’數(shù)據(jù)庫’and score=70 AND SC.S#=student.S#;
37、查詢不及格的課程,并按課程號從大到小排列
select c# from sc where scor e80 and C#=’003′;
39、求選了課程的學(xué)生人數(shù)
select count(*) from sc;
40、查詢選修“葉平”老師所授課程的學(xué)生中,成績更高的學(xué)生姓名及其成績
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、查詢各個課程及相應(yīng)的選修人數(shù)
select count(*) from sc group by C#;
42、查詢不同課程成績相同的學(xué)生的學(xué)號、課程號、學(xué)生成績
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 學(xué)生ID,t1.C# as 課程ID,Score as 分數(shù)
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、統(tǒng)計每門課程的學(xué)生選修人數(shù)(超過10人的課程才統(tǒng)計)。要求輸出課程號和選修人數(shù),查詢結(jié)果按人數(shù)降序排列,查詢結(jié)果按人數(shù)降序排列,若人數(shù)相同,按課程號升序排列
select C# as 課程號,count(*) as 人數(shù)
from sc
group by C#
order by count(*) desc,c#
45、檢索至少選修兩門課程的學(xué)生學(xué)號
select S#
from sc
group by s#
having count(*) > = 2
46、查詢?nèi)繉W(xué)生都選修的課程的’課程號和課程名
select C#,Cname
from Course
where C# in (select c# from sc group by c#)
47、查詢沒學(xué)過“葉平”老師講授的任一門課程的學(xué)生姓名
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、查詢兩門以上不及格課程的同學(xué)的學(xué)號及其平均成績
select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score2)group by S#;
49、檢索“004”課程分數(shù)小于60,按分數(shù)降序排列的同學(xué)學(xué)號
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、系統(tǒng)變量
系統(tǒng)變量分為全局系統(tǒng)變量和會話系統(tǒng)變量。
全局系統(tǒng)變量:針對所有默認設(shè)置
會話系統(tǒng)變量:針對當前用戶生效,用戶登錄MySQL會使用全局系統(tǒng)變量,如果會話中更改了變量值,使用更改后的值,不過只針對當前用戶生效。
show variables 顯示會話系統(tǒng)變量
show global variables 顯示全局系統(tǒng)變量
show session variables 顯示會話系統(tǒng)變量
show global variables like ‘sql_select_limit’;使用通配符顯示匹配的變量設(shè)置
show session variables like ‘sql_select_limit’;系統(tǒng)變量使用@@標識
select @@global.sql_select_limit 查看某個全局系統(tǒng)變量設(shè)置
select @@session.sql_select_limit 查看某個會話系統(tǒng)變量設(shè)置
set @@session.sql_select_limit=2 設(shè)置會話系統(tǒng)變量
數(shù)據(jù)庫rlike用法的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于數(shù)據(jù)庫rlike用法,了解數(shù)據(jù)庫rlike正則表達式的用法,數(shù)據(jù)庫常用sql語句有哪些的信息別忘了在本站進行查找喔。
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)公司提供專業(yè)的建站服務(wù),為您量身定制,歡迎來電(028-86922220)為您打造專屬于企業(yè)本身的網(wǎng)絡(luò)品牌形象。
成都創(chuàng)新互聯(lián)品牌官網(wǎng)提供專業(yè)的網(wǎng)站建設(shè)、設(shè)計、制作等服務(wù),是一家以網(wǎng)站建設(shè)為主要業(yè)務(wù)的公司,在網(wǎng)站建設(shè)、設(shè)計和制作領(lǐng)域具有豐富的經(jīng)驗。
名稱欄目:了解數(shù)據(jù)庫rlike正則表達式的用法(數(shù)據(jù)庫rlike用法)
網(wǎng)站路徑:http://m.fisionsoft.com.cn/article/cojgicg.html


咨詢
建站咨詢
