MySQL SQL模式匹配

MySQL提供標準的SQL模式匹配,SQL模式匹配容許你使用「_」匹配任何單個字符,而「%」匹配任意數目字符(包括零字符)。。html

關於SQL模式匹配:http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html#pattern-matchingmysql

1.MySQL僅僅支持多數正則表達式實現的一個很小的子集。正則表達式

2.SQL模式匹配容許你使用「_」匹配任何單個字符,而「%」匹配任意數目字符(包括零字符)。;而REGEXP使用擴展正則表達式匹配列值的子串,若是被匹配的文本在列值中出現,REGEXP將會找到它,相應的行將被返回。sql

注意使用SQL模式時,不能使用=或!=;而應使用LIKE或NOT LIKE比較操做符。數據庫

看下面的例子:api

mysql> select * from tb;測試

+----+------------+-----+regexp

| id | Name       | Age |htm

+----+------------+-----+文檔

|  1 | changename |  20 |

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

1 row in set (0.02 sec)

要想找出正好包含5個字符的名字,使用「_」模式字符:

mysql> select * from tb where name like '_____';

Empty set (0.61 sec)

包含10個字符時,找出了匹配結果。

mysql> select * from tb where name like '__________';

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

| id | Name       | Age |

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

|  1 | changename |  20 |

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

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp 'cha';

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

| name       |

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

| changename |

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

1 row in set (0.06 sec)

 

mysql> select name from tb where name regexp 'chad';

Empty set (0.00 sec)

 

擴展正則表達式的一些字符是:

·         ‘.’匹配任何單個的字符。

·         字符類「[...]」匹配在方括號內的任何字符。例如,「[abc]」匹配「a」、「b」或「c」。爲了命名字符的範圍,使用一個「-」。「[a-z]」匹配任何字母,而「[0-9]」匹配任何數字。

·         「 * 」匹配零個或多個在它前面的字符。例如,「x*」匹配任何數量的「x」字符,「[0-9]*」匹配任何數量的數字,而「.*」匹配任何數量的任何字符。

    •  若是REGEXP模式與被測試值的任何地方匹配,模式就匹配(這不一樣於LIKE模式匹配,只有與整個值匹配,模式才匹配)。

    •  爲了定位一個模式以便它必須匹配被測試值的開始或結尾,在模式開始處使用「^」或在模式的結尾用「$」。

 

3.默認MySQL中的正則表達式匹配不區分大小寫,可以使用BINARY關鍵字區分大小寫,如

mysql> select name from tb where name regexp binary'cha';

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

| name       |

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

| changename |

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

1 row in set (0.08 sec)

 

mysql> select name from tb  where name regexp binary'Cha';

Empty set (0.00 sec)

 

四、進行OR匹配:爲搜索兩個串之一,使用|,以下所示:

mysql> select name from tb where name regexp 'c|a';

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

| name       |

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

| changename |

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

1 row in set (0.02 sec)

 

五、匹配幾個字符之一:

匹配任何單一字符。以下所示:

mysql> select name from tb where name regexp '[ca]';

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

| name       |

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

| changename |

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

1 row in set (0.02 sec)

 

正如所見,[]是另外一種形式的OR語句。'[ca]'與’c|a’是等價的。

 

匹配除給定字符外的字符:

 mysql> select name from tb where name regexp '^[ca]';

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

| name       |

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

| changename |

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

1 row in set (0.00 sec)

 

六、可以使用-來定義一個範圍。如[1-9],[a-b]。

mysql> select name from tb where name regexp '[a-c]';

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

| name       |

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

| changename |

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

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp '[w-z]';

Empty set (0.00 sec)

 

七、爲了匹配特殊字符,必須用\\爲前導,例如\\-,\\.等。這種處理即轉義(escaping)。

多數正則表達式實現使用單個反斜槓轉義特殊字符,但MYSQL要求兩個(MYSQL本身解釋一個,正則表達式庫解釋另外一個)。

\\也用來引用元字符(具備特殊含義的字符),以下表:

 

 

八、爲了更方便工做,能夠使用預約義的字符集,稱爲字符類(character class)。

mysql> select name from tb where name regexp '[[:alpha:]]';

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

| name       |

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

| changename |

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

1 row in set (0.00 sec)

 

九、使用正則表達式重複元字符匹配多個實例:

mysql> select name from tb where name regexp 'c{1}';

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

| name       |

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

| changename |

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

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp 'c{2}';

Empty set (0.00 sec)

 

十、定位符(爲了匹配特定位置的文本):

 mysql> select name from tb where name regexp 'e$';

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

| name       |

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

| changename |

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

1 row in set (0.00 sec)

 

mysql> select name from tb where name regexp 'a$';

Empty set (0.00 sec)



 

十一、使REGEXP起相似LIKE的做用,它們的區別在於LIKE匹配整個串而REGEXP匹配子串。利用定位符,經過用^開始每一個表達式,用$結束每一個表達式。

 

十二、簡單的正則表達式測試:能夠在不使用數據庫表的狀況下用SELECT來測試正則表達式。REGEXP檢查老是返回0或1(匹配)。

 

[sql] 

mysql> select 'hello' REGEXP'[0-9]';  

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

| 'hello' REGEXP '[0-9]' |  

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

|                      0 |  

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

1 row in set (0.00 sec)  

 

本文基於 <使用正則表達式搜索>整理造成。

官方文檔:Mysql正則表達式:http://dev.mysql.com/doc/refman/5.1/zh/regexp.html

相關文章
相關標籤/搜索