MySQL中正則表達(dá)式(REGEXP)使用詳解
前言
有時(shí)候使用MySQL進(jìn)行數(shù)據(jù)庫(kù)查詢數(shù)據(jù)的時(shí)候,like查詢存在局限性,這時(shí)候就可以使用MySQL中的正則表達(dá)式查詢的方式。
正則表達(dá)式是用來(lái)匹配文本的特殊的串(字符集合),將一個(gè)模式(正則表達(dá)式)與一個(gè)文本串進(jìn)行比較。
- 從文本文件中提取電話號(hào)碼
- 查找名字中間帶有數(shù)字的文件
- 文本塊中重復(fù)出現(xiàn)的單詞
- 替換頁(yè)面的URL為這些URL的實(shí)際鏈接(一個(gè)或兩個(gè)正則表達(dá)式)
LIKE和REGEXP的區(qū)別
LIKE匹配整個(gè)列(like是模糊查詢),如果被匹配的文本僅在列值中出現(xiàn),LIKE并不會(huì)找到它,相應(yīng)的行也不會(huì)返回(當(dāng)然,使用通配符除外)
REGEXP在列值內(nèi)進(jìn)行匹配,如果被匹配的匹配的文本在列值中出現(xiàn),REGEXP將會(huì)找到它,相應(yīng)的行將被返回,這時(shí)一個(gè)非常重要的差別(當(dāng)然,如果適應(yīng)定位符號(hào)^和$,可以實(shí)現(xiàn)REGEXP匹配整個(gè)列而不是列的子集)
例如:
查詢一個(gè)表name列含有chen字符串的數(shù)據(jù),兩條sql語(yǔ)句如下
select * from stu_info where name like '小白'; select * from stu_info where name regexp '小白';
第一條的查詢結(jié)果是name值等于’小白‘的數(shù)據(jù),而第二條的查詢結(jié)果是name中包含’小白’的數(shù)據(jù),也可以用like(模糊查詢+通配符)來(lái)實(shí)現(xiàn)regexp查詢結(jié)果。
OR進(jìn)行匹配
select column from table where column regexp 'X|Y' order by column; select column from table where column regexp '[XY]test' order by column;
第一種寫法會(huì)將|應(yīng)用于整個(gè)串,只要字符串中有X或Y的數(shù)據(jù),都將被檢索出來(lái)
第二種寫法只將[XY]應(yīng)用于搜索模式的開(kāi)頭處
匹配范圍
([])集合可以用來(lái)定義要匹配的一個(gè)或多個(gè)字符,比如[0123456789],為了簡(jiǎn)化這種類型的集合,可使用(-)來(lái)定義一個(gè)范圍,即[0-9],[a-z]
匹配特殊字符
則表達(dá)式由具有特定含義的特殊字符構(gòu)成;如果要匹配這些特殊字符,就需要用\為前導(dǎo),這種處理方式就是所謂的轉(zhuǎn)義(escaping),正則表達(dá)式內(nèi)具有特殊意義的所有字符都必須以這種方式轉(zhuǎn)義;(為了匹配反斜杠{}字符本身,需要使用\\)
注意:多數(shù)正則表達(dá)式實(shí)現(xiàn)使用單個(gè)反斜杠轉(zhuǎn)義特殊字符,以便能夠使用這些字符本身,而MySQL要求兩個(gè)反斜杠(MySQL自己解釋一個(gè),正則表達(dá)式庫(kù)解釋一個(gè))
匹配字符類
有時(shí)候需要檢索出我們需要的數(shù)字、所有字母字符或所有數(shù)字字母字符等的匹配,我們可以使用預(yù)定義的字符集,稱為字符類。
匹配多個(gè)實(shí)例
有時(shí)候需要對(duì)匹配的數(shù)目進(jìn)行更強(qiáng)的控制,比如:尋找所有的數(shù),不管數(shù)中包含多少數(shù)字,或?qū)ふ乙粋€(gè)單詞并尾隨一個(gè)s(如果存在)等情況,我們可以利用正則表達(dá)式中的重復(fù)元字符來(lái)完成。
select column from table where column regexp '\\([0-9] sticks?\\)' order by column;
上面的正則表達(dá)式‘\([0-9] sticks?\)’意為:\匹配([0-9]匹配任意數(shù)字,這里指匹配的數(shù)值范圍,sticks?匹配stick和sticks{?使s可選,因?yàn)??匹配它前面任何字符?或者1次出現(xiàn)})。
定位符
有時(shí)候?yàn)榱似ヅ涮囟ㄎ恢玫奈谋?,需要使用定位符,常用定位符列表如下?/p>
找出一個(gè)以一個(gè)數(shù)(包括小數(shù)點(diǎn)開(kāi)始的數(shù))開(kāi)始的所有數(shù)值,簡(jiǎn)單搜索[0-9\.]或([[:digit:]\.])不行,因?yàn)樗鼘⒃谖谋緝?nèi)任意位置查找匹配,可以使用^定位符,如下:
select column from table where column regexp '^[0-9\\.]' order by column;
^有兩種用法
- 在集合中(用[和]定義),用它來(lái)否定該集合
- 用來(lái)指串的開(kāi)始處
使regexp和like起相同作用:like匹配整串二regexp匹配子串,可以利用定位符,用^開(kāi)始每個(gè)表達(dá)式,用$結(jié)束每個(gè)表達(dá)式,就可以使regexp和like作用一樣。
查詢admin表中的group字段,數(shù)據(jù)格式為:1,2,3;4,5,6;1,87,101
例如查詢101:
select * from xin_admin where `group` REGEXP '[,|;]?101[,|;]?';
附:Mysql字符串截取 和 截取字符進(jìn)行查詢
一、MySQL中字符串的截取
MySQL中有專門的字符串截取函數(shù):其中常用的有兩種:substring_index(str,delim,count) 和concat
1.substring_index(str,delim,count) 函數(shù)的使用較為普遍。
函數(shù)括號(hào)里面的依次為:要分隔截取的字符串(如:”aaa_bbb_ccc”)、分隔符(如:“_”)、位置(表示第幾個(gè)分隔符處,如:“1”)。
- count為正數(shù),那么就是從左邊開(kāi)始數(shù),函數(shù)返回第count個(gè)分隔符的左側(cè)的字符串;
- count為負(fù)數(shù),那么就是從右邊開(kāi)始數(shù),函數(shù)返回第count個(gè)分隔符右邊的所有內(nèi)容;
- count可以為0,返回為空。
例子:substring_index("aaa_bbb_ccc","_",1) ,返回為 aaa;
substring_index("aaa_bbb_ccc","_",2) ,返回為 aaa_bbb;
substring_index(substring_index("aaa_bbb_ccc","_",-2),"_",1) ,返回為 bbb;
2.concat是連接幾個(gè)字符串
例子:concat(‘m’,’y’,’s’,’q’,’l’);
返回:mysql
二、依據(jù)表中的某個(gè)字段查詢包含有這個(gè)字符的所有數(shù)據(jù)
1.find_in_set:SELECT * FROM user WHERE find_in_set(‘吳’,name);
查詢user表中所有name包含“吳”的數(shù)據(jù)
2.REGEXP:SELECT * FROM user WHERE name REGEXP ‘(‘吳’|‘劉’)’;
使用正則,查詢包含劉或者吳的數(shù)據(jù)
總結(jié)
到此這篇關(guān)于MySQL中正則表達(dá)式(REGEXP)使用的文章就介紹到這了,更多相關(guān)MySQL正則表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL快速禁用賬戶登入及如何復(fù)制/復(fù)用賬戶密碼(最新推薦)
這篇文章主要介紹了MySQL如何快速禁用賬戶登入及如何復(fù)制/復(fù)用賬戶密碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01Jmeter連接數(shù)據(jù)庫(kù)過(guò)程圖解
這篇文章主要介紹了jmeter連接數(shù)據(jù)庫(kù)過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10SSM實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)賬號(hào)密碼密文登錄功能
這篇文章主要介紹了SSM實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)賬號(hào)密碼密文登錄功能,本文分為三步給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08Mysql5.7.18版本(二進(jìn)制包安裝)自定義安裝路徑教程詳解
這篇文章主要介紹了Mysql5.7.18版本(二進(jìn)制包安裝)自定義安裝路徑教程詳解,需要的朋友可以參考下2017-07-07MySQL into_Mysql中replace與replace into用法案例詳解
這篇文章主要介紹了MySQL into_Mysql中replace與replace into用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09mysql:Can''t start server: can''t create PID file: No space
這篇文章主要介紹了mysql啟動(dòng)失敗不能正常啟動(dòng)并報(bào)錯(cuò)Can't start server: can't create PID file: No space left on device問(wèn)題解決方法,需要的朋友可以參考下2015-05-05MySQL按年/月/周/日/小時(shí)分組查詢、排序、limit及判空用法實(shí)例
我們?cè)谟肕ysql抽取數(shù)據(jù)時(shí)候,經(jīng)常需要按照天、周、月等不同的粒度對(duì)數(shù)據(jù)進(jìn)行分組統(tǒng)計(jì),下面這篇文章主要給大家介紹了關(guān)于MySQL按年/月/周/日/小時(shí)分組查詢、排序、limit及判空用法的相關(guān)資料,需要的朋友可以參考下2023-03-03MySQL 給用戶添加 ALTER VIEW 的權(quán)限的步驟
在 MySQL 中,用戶權(quán)限的管理是非常重要的,以確保數(shù)據(jù)庫(kù)安全性和數(shù)據(jù)完整性,這篇文章主要介紹了MySQL 給用戶添加 ALTER VIEW 的權(quán)限,需要的朋友可以參考下2024-05-05