mySql完全手册2011022301
Like
Regexp(RLike)
mssql只有l(wèi)ike
個(gè)人感覺(jué)mssql的like比mysql的like強(qiáng)大一點(diǎn)~~~
舉例來(lái)看下
/*******************************************/
環(huán)境
1、
my SQL Server 5.0
建立表tbmembers
member_id??? name
1??? ??? ??? goboy
2、
Ms SQL Server 2000
已存在表tbfile
fileid??? ??? filename
1??? ??? ??? nobody
/*******************************************/
/*******************************************/
試驗(yàn)Sql:
1、
select * from tbmembers where name like 'g%';
select * from tbmembers where name like '%g%';
select * From tbfile where filename like 'n%';
select * From tbfile where filename like '%n%';
Result:
輸出對(duì)應(yīng)數(shù)據(jù)
2、
select * from tbmembers where name like 'g____';
select * from tbfile where filename like 'n_____';
Result:
輸出對(duì)應(yīng)數(shù)據(jù)
3、
select * from tbmembers where name like 'g[a-z]boy';
select * from tbmembers where name like 'g[^a-f]boy';
select * from tbfile where filename like 'n[a-z]body';
select * from tbfile where filename like 'n[^a-f]body';
Result:
mysql下沒(méi)有任何結(jié)果
mssql下輸出對(duì)應(yīng)結(jié)果
但:
mysql下可以這么寫:
select * from tbmembers where name regexp 'g[a-z]boy';
select * from tbmembers where name regexp 'g[^a-f]boy';
輸出對(duì)應(yīng)結(jié)果
【小結(jié)】
從上述例子可以看出mssql的like的確強(qiáng)大些,例子3的功能在mysql中使用regexp來(lái)實(shí)現(xiàn)的
/*******************************************/
/*******************************************/
既然mySql有了正則表達(dá)式,那么繼續(xù)試驗(yàn)正則表達(dá)式的功效如何?
環(huán)境
1、
my SQL Server 5.0
建立表tbmembers
member_id??? name
1??? ??? ??? goboy
2、
Html在線正則表達(dá)式
/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/
試驗(yàn):
| 測(cè)試項(xiàng) | Mysql執(zhí)行 | Html在線測(cè)試 |
| 以字母開頭的正則表達(dá)式,^[a-zA-Z] | Select 'a' Regexp '^[a-zA-Z]';(ok) | a(ok) |
| 以\w字符開頭的正則表達(dá)式,^\w | Select 'a' Regexp '^\w';(none)Select 'a' Regexp '^[:alnum:]';(ok) | abs1(ok);ws(none)1wse(ok) |
【小結(jié)】
看來(lái)在mysql中用了另外一種方式來(lái)處理正則表達(dá)式是的元數(shù)據(jù)
比如
\d??? ??? [:digit:]
\w??? ??? [:alnum:]
等
關(guān)于標(biāo)準(zhǔn)的類別名稱
alnum文字?jǐn)?shù)字字符
alpha文字字符
blank空白字符
cntrl控制字符
digit數(shù)字字符
graph圖形字符
lower小寫文字字符
print圖形或空格字符
punct標(biāo)點(diǎn)字符
space空格、制表符、新行、和回車
upper大寫文字字符
xdigit十六進(jìn)制數(shù)字字符
/*******************************************/
【總結(jié)】
關(guān)于搜索在sql標(biāo)準(zhǔn)中常用的通配符是_和%;
至于正則表達(dá)式以及[范圍]或[^范圍]的實(shí)現(xiàn)在各個(gè)數(shù)據(jù)庫(kù)實(shí)現(xiàn)不一樣,以及實(shí)現(xiàn)程度各有深淺。使用時(shí)候需要根據(jù)情況處理!!
/*******************************************/
補(bǔ)充下:
mysql中的模式匹配(標(biāo)準(zhǔn)sql匹配和正則表達(dá)式匹配)
一、 標(biāo)準(zhǔn)的sql模式匹配:
1. 使用like和not like比較操作符(注意不能使用=或!=);
2. 模式默認(rèn)是忽略大小寫的;
3. 允許使用”_”匹配任何單個(gè)字符,”%”匹配任意數(shù)目字符(包括零字符);
二、 mysql還提供象unix實(shí)用程序的擴(kuò)展正則表達(dá)式模式匹配的格式:
1. 使用regexp和not regexp操作符(或rlike和not rlike,他們是同義詞);
2. regexp模式匹配與被匹配字符的任何地方匹配,則匹配成功(即只要被匹配字符包含或者可以等于所定義的模式,就匹配成功);
不同于like模式匹配,只有和整個(gè)值匹配,才匹配成功(即只有被匹配字符完全和所定義的模式匹配,才匹配成功)
3. regexp默認(rèn)也是不區(qū)分大小寫,可以使用binary關(guān)鍵詞強(qiáng)制區(qū)分大小寫;
如:select * from pet where name regexp binary ‘^b’;
4. 正則表達(dá)式為一個(gè)表達(dá)式,它能夠描述一組字符串。regexp操作符完成mysql的擴(kuò)展正則表達(dá)式匹配。regexp實(shí)現(xiàn)的功能是如果被匹配字符中部分或完全符合所定義的表達(dá)式描述的字符,則表示匹配成功。
1)最簡(jiǎn)單的正則表達(dá)式是不含任何特殊字符的正則表達(dá)式,如hello。
select * from pet where name regexp ‘hello’;表示的意思是如果name這列的某一行包含hello這個(gè)單詞,則匹配就成功了。(注意和like的區(qū)別,like要求name這列的某一行必須完全等于hello,才匹配成功)。
2)非平凡的正則表達(dá)式,除了含有最簡(jiǎn)單表達(dá)式那些東西,還需要采用特殊的特殊結(jié)構(gòu),用到的字符,往下看。(因此,通常的正則表達(dá)式是普通單詞和這些正則表達(dá)式字符構(gòu)成的表達(dá)式)
5. 擴(kuò)展正則表達(dá)式的一些字符:
1) ‘.’匹配任何單個(gè)字符;
?
2) […]匹配在方括號(hào)內(nèi)的任何字符,可以使用’-’表示范圍,如[a-z],[0-9],而且可以混合[a-dxyz]表示匹配a,b,c,d,x,y,z 中的任何一個(gè);(注意使用括號(hào)以及’|’的方法也可以達(dá)到相同的效果,如(a|b|c)匹配a,b,c中的任何一個(gè));此外可以使用’^’表示否定,如 [^a-z]表示不含有a-z中間的任何一個(gè)字符;
?
3) ‘*’表示匹配0個(gè)或多個(gè)在它前面的字符。如x*表示0個(gè)或多個(gè)x字符,.*表示匹配任何數(shù)量的任何字符;
?
4) 可以將模式定位必須匹配被匹配字符的開始或結(jié)尾,在匹配模式前加”^”:表示匹配從被匹配字符的最開頭開始,在匹配模式后加”$”:表示匹配要進(jìn)行到被匹配字符的最末尾。
?
5) ‘+’表示匹配1個(gè)或多個(gè)在它前面的字符。如a+表示1個(gè)或多個(gè)a字符。
?
6) ‘?’表示匹配0個(gè)或1個(gè)在它前面的字符。如a?表示0個(gè)或1個(gè)a字符。
?
7) ‘|’如de|abc表示匹配序列de或者abc。注意雖然[…]也可以表示匹配中的某一個(gè),但是每次僅僅能表示單個(gè)字符及[a-bxyz]實(shí)際每一次只代表了一個(gè)字符。
?
8) ()括號(hào)可以應(yīng)用在表達(dá)式中,使得更容易理解。
?
9) a{5}表示匹配共5個(gè)a,a{2,8}表示匹配2~8個(gè)a。
a*可以寫成a{0, } 第二個(gè)參數(shù)省略表示沒(méi)有上界;a+可以寫成a{1,};a?可以寫成a{0,1}
更準(zhǔn)確地講,a{n}與a的n個(gè)實(shí)例準(zhǔn)確匹配。a{n,}匹配a的n個(gè)或更多實(shí)例。a{m,n}匹配a的m~n個(gè)實(shí)例,包含m和n
m和n必須位于0~re_dup_max(默認(rèn)為255)的范圍內(nèi),包含0和re_dup_max。如果同時(shí)給定了m和n,m必須小于或等于n。
10) 標(biāo)準(zhǔn)類別[:character_class:]:
常用的一些標(biāo)準(zhǔn)類別,一般在[]中使用,由于用在[]中故和[a-z]類似,每一次只能頂替一個(gè)字符。(這個(gè)有點(diǎn)類似perl里面定義的常用的一些標(biāo)準(zhǔn)類別:\w表示一個(gè)單詞字符即[a-za-z0-9];\w一個(gè)非單詞字符與\w相反; \d一個(gè)數(shù)字即[0-9];\d一個(gè)非數(shù)字;\s一個(gè)白空間字符即[\t\f\r\n];\f為換頁(yè)符;\s一個(gè)非白空間字符)
標(biāo)準(zhǔn)的類別名稱:
alnum
???
文字?jǐn)?shù)字字符
alpha
???
文字字符
blank
???
空白字符
cntrl
???
控制字符
digit
???
數(shù)字字符
graph
???
圖形字符
lower
???
小寫文字字符
print
???
圖形或空格字符
punct
???
標(biāo)點(diǎn)字符
space
???
空格、制表符、新行、和回車
upper
???
大寫文字字符
xdigit
???
十六進(jìn)制數(shù)字字符
使用實(shí)例:
select 'justalnums' regexp '[[:alnum:]]+';
解釋其中[[:alnum:]]由于[:alnum:]表示文字?jǐn)?shù)字字符,它又用在[]中,故[[:alnum:]]代表一個(gè)字符它為一個(gè)文字或者數(shù)字。后面的+號(hào)表示1個(gè)或多個(gè)這樣的文字或數(shù)字。
上述語(yǔ)句返回1.那是因?yàn)閖ustalnums中是由字母組成的。
11)字邊界:[[:<:]]表示開始,[[:>:]]表示結(jié)束:
其定義了一個(gè)單詞的開始和結(jié)束邊界,這個(gè)單詞為字字符,這樣[[:<:]]代表這個(gè)字字符前面的部分,[[:>:]]代表這個(gè)字字符后面的部分。字字符為alnum類的字母數(shù)字字符或下劃線(_);因此[[:<:]], [[:>:]]均代表不是字字符的字符,即只要不是字母數(shù)字字符以及下劃線(_)即可。因此其可以為什么都不是。因此 [[:<:]]word[[:>:]]能夠匹配如下的所有情況:
即word單詞本身,word*** 解釋***代表不是字母數(shù)字以及_的任何字符(如,word-net);***word(如,micorsoft word);***word***(如,this is a word program.)
舉例:[[:<:]]word[[:>:]]:
select 'a word a' regexp '[[:<:]]word[[:>:]]'; 結(jié)果為真
select 'a xword a' regexp '[[:<:]]word[[:>:]]'; 結(jié)果為假
?
最后注意的注意:
要在正則表達(dá)式中使用特殊字符,需要在這些字符前面添加2個(gè)反斜杠’\’,
舉例:
select '1+2' regexp '1+2'; 結(jié)果為0
select '1+2' regexp '1\+2'; 結(jié)果為0
select '1+2' regexp '1\\+2'; 結(jié)果為1
解釋:
這是因?yàn)閙ysql解析程序解析該sql語(yǔ)句時(shí):
首先將字符串’1\\+2’解析為1\+2;
然后把1\+2當(dāng)作正則表達(dá)式,由正則表達(dá)式庫(kù)來(lái)解析,它代表1+2。
因此需要加上2個(gè)反斜杠。
?
不要經(jīng)常犯加一個(gè)反斜杠的錯(cuò)誤,加一個(gè)反斜杠會(huì)莫名其妙:
如select '1t2' regexp '1\t2';
結(jié)果會(huì)返回1
本來(lái)的意思是匹配1制表符\t以及2,但是由于只添加了一個(gè)\所以,解析以后編程了1t2,所以匹配成功。
12)
[.characters.]和[=character_class=]
?
參考資料:
http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html#pattern-matching mysql的模式匹配
http://dev.mysql.com/doc/refman/5.1/zh/regexp.html mysql的正則表達(dá)式匹配
轉(zhuǎn)載于:https://www.cnblogs.com/GoGoagg/archive/2011/02/23/1962353.html
總結(jié)
以上是生活随笔為你收集整理的mySql完全手册2011022301的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为啥泰山云海如此梦幻?
- 下一篇: 为啥泰山如此陡峭?