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