mysql怎么匹配 mysql怎么連接查詢

mysql字符串怎么完全正則匹配,用regexp

以前我要查找數(shù)據(jù)都是使用like后來發(fā)現(xiàn)mysql中也有正則表達式了并且感覺性能要好于like,下面我來給大家分享一下mysql REGEXP正則表達式使用詳解,希望此方法對大家有幫助。

創(chuàng)新互聯(lián)建站于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元錯那做網(wǎng)站,已為上家服務,為錯那各地企業(yè)和個人服務,聯(lián)系電話:18980820575

MySQL采用Henry Spencer的正則表達式實施,其目標是符合POSIX 1003.2。請參見附錄C:感謝。MySQL采用了擴展的版本,以支持在SQL語句中與REGEXP操作符一起使用的模式匹配操作。請參見3.3.4.7節(jié),“模式匹配”。

在本附錄中,歸納了在MySQL中可用于REGEXP操作的特殊字符和結構,并給出了一些示例。本附錄未包含可在Henry

Spencer的regex(7)手冊頁面中發(fā)現(xiàn)的所有細節(jié)。該手冊頁面包含在MySQL源碼分發(fā)版中,位于regex目錄下的regex.7文件中。

正則表達式描述了一組字符串。最簡單的正則表達式是不含任何特殊字符的正則表達式。例如,正則表達式hello匹配hello。

非平凡的正則表達式采用了特殊的特定結構,從而使得它們能夠與1個以上的字符串匹配。例如,正則表達式hello|word匹配字符串hello或字符串word。

作為一個更為復雜的示例,正則表達式B[an]*s匹配下述字符串中的任何一個:Bananas,Baaaaas,Bs,以及以B開始、以s結束、并在其中包含任意數(shù)目a或n字符的任何其他字符串。

以下是可用于隨REGEXP操作符的表的模式。

應用示例,查找用戶表中Email格式錯誤的用戶記錄:

SELECT *

FROM users

WHERE email NOT REGEXP '^[A-Z0-9._%-]+@[A-Z0-9.-]+.[A-Z]{2,4}$'

MySQL數(shù)據(jù)庫中正則表達式的語法,主要包括各種符號的含義。

(^)字符

匹配字符串的開始位置,如“^a”表示以字母a開頭的字符串。

mysql select 'xxxyyy' regexp '^xx';

+-----------------------+

| 'xxxyyy' regexp '^xx' |

+-----------------------+

| 1 |

+-----------------------+

1 row in set (0.00 sec)

查詢xxxyyy字符串中是否以xx開頭,結果值為1,表示值為true,滿足條件。

($)字符

匹配字符串的結束位置,如“X^”表示以字母X結尾的字符串。

(.)字符

這個字符就是英文下的點,它匹配任何一個字符,包括回車、換行等。

(*)字符

星號匹配0個或多個字符,在它之前必須有內(nèi)容。如:

mysql select 'xxxyyy' regexp 'x*';

這個SQL語句,正則匹配為true。

(+)字符

加號匹配1個或多個字符,在它之前也必須有內(nèi)容。加號跟星號的用法類似,只是星號允許出現(xiàn)0次,加號則必須至少出現(xiàn)一次。

(?)字符

問號匹配0次或1次。

實例:

現(xiàn)在根據(jù)上面的表,可以裝置各種不同類型的SQL查詢以滿足要求。在這里列出一些理解??紤]我們有一個表為person_tbl和有一個字段名為名稱:

查詢找到所有的名字以'st'開頭

mysql SELECT name FROM person_tbl WHERE name REGEXP '^st';

查詢找到所有的名字以'ok'結尾

mysql SELECT name FROM person_tbl WHERE name REGEXP 'ok$';

查詢找到所有的名字包函'mar'的字符串

mysql SELECT name FROM person_tbl WHERE name REGEXP 'mar';

查詢找到所有名稱以元音開始和'ok'結束 的

mysql SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

一個正則表達式中的可以使用以下保留字

^

所匹配的字符串以后面的字符串開頭

mysql select "fonfo" REGEXP "^fo$"; - 0(表示不匹配)

mysql select "fofo" REGEXP "^fo"; - 1(表示匹配)

$

所匹配的字符串以前面的字符串結尾

mysql select "fono" REGEXP "^fono$"; - 1(表示匹配)

mysql select "fono" REGEXP "^fo$"; - 0(表示不匹配)

.

匹配任何字符(包括新行)

mysql select "fofo" REGEXP "^f.*"; - 1(表示匹配)

mysql select "fonfo" REGEXP "^f.*"; - 1(表示匹配)

a*

匹配任意多個a(包括空串)

mysql select "Ban" REGEXP "^Ba*n"; - 1(表示匹配)

mysql select "Baaan" REGEXP "^Ba*n"; - 1(表示匹配)

mysql select "Bn" REGEXP "^Ba*n"; - 1(表示匹配)

a+

匹配任意多個a(不包括空串)

mysql select "Ban" REGEXP "^Ba+n"; - 1(表示匹配)

mysql select "Bn" REGEXP "^Ba+n"; - 0(表示不匹配)

a?

匹配一個或零個a

mysql select "Bn" REGEXP "^Ba?n"; - 1(表示匹配)

mysql select "Ban" REGEXP "^Ba?n"; - 1(表示匹配)

mysql select "Baan" REGEXP "^Ba?n"; - 0(表示不匹配)

de|abc

匹配de或abc

mysql select "pi" REGEXP "pi|apa"; - 1(表示匹配)

mysql select "axe" REGEXP "pi|apa"; - 0(表示不匹配)

mysql select "apa" REGEXP "pi|apa"; - 1(表示匹配)

mysql select "apa" REGEXP "^(pi|apa)$"; - 1(表示匹配)

mysql select "pi" REGEXP "^(pi|apa)$"; - 1(表示匹配)

mysql select "pix" REGEXP "^(pi|apa)$"; - 0(表示不匹配)

(abc)*

匹配任意多個abc(包括空串)

mysql select "pi" REGEXP "^(pi)*$"; - 1(表示匹配)

mysql select "pip" REGEXP "^(pi)*$"; - 0(表示不匹配)

mysql select "pipi" REGEXP "^(pi)*$"; - 1(表示匹配)

{1}

{2,3}

這是一個更全面的方法,它可以實現(xiàn)前面好幾種保留字的功能

a*

可以寫成a{0,}

a+

可以寫成a{1,}

a?

可以寫成a{0,1}

在{}內(nèi)只有一個整型參數(shù)i,表示字符只能出現(xiàn)i次;在{}內(nèi)有一個整型參數(shù)i,后面跟一個“,”,表示字符可以出現(xiàn)i次或i次以上;在{}內(nèi)只有一個整型參數(shù)i,后面跟一個“,”,再跟一個整型參數(shù)j,表示字符只能出現(xiàn)i次以上,j次以下(包括i次和j次)。其中的整型參數(shù)必須大于等于0,小于等于

RE_DUP_MAX(默認是255)。 如果有兩個參數(shù),第二個必須大于等于第一個

[a-dX]

匹配“a”、“b”、“c”、“d”或“X”

[^a-dX]

匹配除“a”、“b”、“c”、“d”、“X”以外的任何字符。

“[”、“]”必須成對使用

mysql select "aXbc" REGEXP "[a-dXYZ]"; - 1(表示匹配)

mysql select "aXbc" REGEXP "^[a-dXYZ]$"; - 0(表示不匹配)

mysql select "aXbc" REGEXP "^[a-dXYZ]+$"; - 1(表示匹配)

mysql select "aXbc" REGEXP "^[^a-dXYZ]+$"; - 0(表示不匹配)

mysql select "gheis" REGEXP "^[^a-dXYZ]+$"; - 1(表示匹配)

mysql select "gheisa" REGEXP "^[^a-dXYZ]+$"; - 0(表示不匹配)

MySQL正則表達式匹配

1. 基本字符匹配:

select name from user where name REGEXP '1000';

檢索name中包含文本1000的所有行。

select name from user where name REGEXP '.000';

.在正則表達式中表示匹配任意一個字符。

2. 進行OR匹配:

select name from user where name REGEXP '1000|2000';

檢索name中包含文本1000或2000的所有行。

3. 匹配幾個字符之一:

select name from user where name REGEXP '[123] Ton';

[123]定義一組字符,它的意思是匹配1或2或3。

select name from user where name REGEXP '[1-3] Ton';

-用來定義一個范圍。

4. 匹配特殊字符:

匹配特殊字符,必須用\為前導,\-表示查找-,\.表示查找.

5. 匹配多個實例:

*: 0個或多個匹配;

+:1個或多個匹配(等于{1,});

?:0個或1個匹配(等于{0,1});

{n}:指定數(shù)目的匹配;

{n,}:不少于指定數(shù)目的匹配;

{n,m}:匹配數(shù)目的范圍(m不超過255)。

6. 定位符:

^:文本的開始;

$:文本的結尾;

[[::]]:詞的開始;

[[::]]:詞的結尾;

^在集合中:用來否定該集合,例如[^0-9],表示不匹配數(shù)字

深入淺析Mysql聯(lián)合索引最左匹配原則

之前在網(wǎng)上看到過很多關于mysql聯(lián)合索引最左前綴匹配的文章,自以為就了解了其原理,最近面試時和面試官交流,發(fā)現(xiàn)遺漏了些東西,這里自己整理一下這方面的內(nèi)容。

最左前綴匹配原則

在mysql建立聯(lián)合索引時會遵循最左前綴匹配的原則,即最左優(yōu)先,在檢索數(shù)據(jù)時從聯(lián)合索引的最左邊開始匹配,示例:

對列col1、列col2和列col3建一個聯(lián)合索引

KEY test_col1_col2_col3 on test(col1,col2,col3);

聯(lián)合索引 test_col1_col2_col3 實際建立了 (col1)、(col1,col2)、(col,col2,col3) 三個索引。

SELECT * FROM test WHERE col1=“1” AND clo2=“2” AND clo4=“4”

上面這個查詢語句執(zhí)行時會依照最左前綴匹配原則,檢索時會使用索引(col1,col2)進行數(shù)據(jù)匹配。

注意

索引的字段可以是任意順序的,如:

SELECT * FROM test WHERE col1=“1” AND clo2=“2”

SELECT * FROM test WHERE col2=“2” AND clo1=“1”

這兩個查詢語句都會用到索引(col1,col2),mysql創(chuàng)建聯(lián)合索引的規(guī)則是首先會對聯(lián)合合索引的最左邊的,也就是第一個字段col1的數(shù)據(jù)進行排序,在第一個字段的排序基礎上,然后再對后面第二個字段col2進行排序。其實就相當于實現(xiàn)了類似 order by col1 col2這樣一種排序規(guī)則。

有人會疑惑第二個查詢語句不符合最左前綴匹配:首先可以肯定是兩個查詢語句都保函索引(col1,col2)中的col1、col2兩個字段,只是順序不一樣,查詢條件一樣,最后所查詢的結果肯定是一樣的。既然結果是一樣的,到底以何種順序的查詢方式最好呢?此時我們可以借助mysql查詢優(yōu)化器explain,explain會糾正sql語句該以什么樣的順序執(zhí)行效率最高,最后才生成真正的執(zhí)行計劃。

減少開銷 。建一個聯(lián)合索引(col1,col2,col3),實際相當于建了(col1),(col1,col2),(col1,col2,col3)三個索引。每多一個索引,都會增加寫操作的開銷和磁盤空間的開銷。對于大量數(shù)據(jù)的表,使用聯(lián)合索引會大大的減少開銷!

覆蓋索引 。對聯(lián)合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那么MySQL可以直接通過遍歷索引取得數(shù)據(jù),而無需回表,這減少了很多的隨機io操作。減少io操作,特別的隨機io其實是dba主要的優(yōu)化策略。所以,在真正的實際應用中,覆蓋索引是主要的提升性能的優(yōu)化手段之一。

效率高 。索引列越多,通過索引篩選出的數(shù)據(jù)越少。有1000W條數(shù)據(jù)的表,有如下sql:select from table where col1=1 and col2=2 and col3=3,假設假設每個條件可以篩選出10%的數(shù)據(jù),如果只有單值索引,那么通過該索引能篩選出1000W10%=100w條數(shù)據(jù),然后再回表從100w條數(shù)據(jù)中找到符合col2=2 and col3= 3的數(shù)據(jù),然后再排序,再分頁;如果是聯(lián)合索引,通過索引篩選出1000w10% 10% *10%=1w,效率提升可想而知!

引申

對于聯(lián)合索引(col1,col2,col3),查詢語句 SELECT * FROM test WHERE col2=2; 是否能夠觸發(fā)索引?

大多數(shù)人都會說NO,實際上卻是YES。

原因:

EXPLAIN SELECT * FROM test WHERE col2=2;

EXPLAIN SELECT * FROM test WHERE col1=1;

觀察上述兩個explain結果中的type字段。查詢中分別是:

index: 這種類型表示mysql會對整個該索引進行掃描。要想用到這種類型的索引,對這個索引并無特別要求,只要是索引,或者某個聯(lián)合索引的一部分,mysql都可能會采用index類型的方式掃描。但是呢,缺點是效率不高,mysql會從索引中的第一個數(shù)據(jù)一個個的查找到最后一個數(shù)據(jù),直到找到符合判斷條件的某個索引。所以,上述語句會觸發(fā)索引。

ref: 這種類型表示mysql會根據(jù)特定的算法快速查找到某個符合條件的索引,而不是會對索引中每一個數(shù)據(jù)都進行一一的掃描判斷,也就是所謂你平常理解的使用索引查詢會更快的取出數(shù)據(jù)。而要想實現(xiàn)這種查找,索引卻是有要求的,要實現(xiàn)這種能快速查找的算法,索引就要滿足特定的數(shù)據(jù)結構。簡單說,也就是索引字段的數(shù)據(jù)必須是有序的,才能實現(xiàn)這種類型的查找,才能利用到索引。

以上所述是我給大家介紹的Mysql聯(lián)合索引最左匹配原則,希望對大家有所幫助,如果大家有任何疑問請給我留言,我會及時回復大家的。

《 兩個月拿到N個offer,看看我是如何做到的 》

《 面試總結:2019年最全面試題資料學習大全—(含答案) 》

《 淘寶面試回來,想對程序員們談談 》

《 看過太多大廠面試題,其實考的無非是這 3 點能力 》

mysql索引最左匹配原則

只要where有a的查詢就會用到上面的聯(lián)合索引,無關順序

比如:

explain select * from test where a10 ;

explain select * from test where b10 and a 10;

explain select * from test where b10 and a 10 and c10;

explain select * from test where a10 and c 10;(a走索引了,c沒走)

explain select * from test where a10 and b 10;

explain select * from test where a10 and b 10 and c10;

下面不會用到聯(lián)合索引(沒有用到a)

explain select * from test where b10 and c 10;

當b+樹的數(shù)據(jù)項是復合的數(shù)據(jù)結構,比如(name,age,sex)的時候,b+數(shù)是按照從左到右的順序來建立搜索樹的,比如當(張三,20,F)這樣的數(shù)據(jù)來檢索的時候,b+樹會優(yōu)先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex,最后得到檢索的數(shù)據(jù);

但當(20,F)這樣的沒有name的數(shù)據(jù)來的時候,b+樹就不知道下一步該查哪個節(jié)點,因為建立搜索樹的時候name就是第一個比較因子,必須要先根據(jù)name來搜索才能知道下一步去哪里查詢。

比如當(張三,F)這樣的數(shù)據(jù)來檢索時,b+樹可以用name來指定搜索方向,但下一個字段age的缺失,所以只能把名字等于張三的數(shù)據(jù)都找到,然后再匹配性別是F的數(shù)據(jù)了, 這個是非常重要的性質,即索引的最左匹配特性。

explain select * from test where a10 and b 10;

explain select * from test where b 10 and a10;

實際上只會用到index_a索引

網(wǎng)站欄目:mysql怎么匹配 mysql怎么連接查詢
文章分享:http://muchs.cn/article14/doesgde.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供自適應網(wǎng)站、電子商務、網(wǎng)站設計公司、軟件開發(fā)、Google、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務器托管