1. 程式人生 > >MySQL——使用正則表示式查詢

MySQL——使用正則表示式查詢

      使用正則表示式可以檢索或替換符合某個模式的文字內容,根據指定的匹配模式匹配文字中符合要求的特殊字串。

      在MySQL中,使用  REGEXP  關鍵字指定正則表示式的字元匹配模式。

正則表示式常用的字元匹配列表
選項說明例子匹配值示例
^匹配文字的開始字元^bbook,big,banana
$匹配文字結束字元st$test,resist
.匹配任何單個字元b.tbit,bat,but
*匹配零個或多個在它前面的字元f*n:匹配字元n前面的0個或多個f字元的字串fn,fan,faan
+匹配前面的字元1次或多次ba+:匹配以 b 開頭後面緊跟1個或多個a的字串ba,bay,bare
<字串>匹配包含指定的字串的文字fa:匹配包含“fa”的字串fan,afa.faad
[字元集合]匹配字元集合中的任何一個字元'[xz]':匹配  x  或者  zdizzy,zebra
[^]匹配不在括號中的任何字元

'[^abc]':匹配任何不包含a、b、c的字串

desk,fox
字串{n,}匹配前面的字串至少n次b{2}:匹配有2個或更多的b字元的字串bbb,bbbb
字串{n,m}匹配前面的字串至少n次,至多m次。如果n為0,次引數為可選引數b{2,4}:匹配至少有2個,最多有4個b字元的字串

bb,bbb,bbbb

1.  查詢以特定字元或字串開頭的記錄

    字元^可以匹配以特定字元或者字串開頭的文字。

【例】在  fruits  表中,查詢  f_name  欄位以字母  b  開頭的記錄。SQL  語句如下:

mysql>  SELECT  *  FROM  fruits
    -> WHERE  f_name  REGEXP  '^b';
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| t1   |  102 | blanana    |   10.30 |
+------+------+------------+---------+
    

2.  查詢以特定字元或字串結尾的記錄

     字元 $ 可以匹配以特定字元或者字串結尾的文字。

    【例】在  fruits  表中,查詢  f_name  欄位以字母  y  結尾的記錄。SQL  語句如下:

mysql>  SELECT  *  FROM  fruits
    -> WHERE  f_name  REGEXP  'y$';
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| c0   |  101 | cherry     |    3.20 |
| m2   |  105 | xbabay     |    2.60 |
+------+------+------------+---------+

3.  代替字串中的任意一個字元

    字元‘.’可以匹配任意一個字元。

    【例】在  fruits  表中,查詢  f_name  欄位以包含字母  a  與  g  且兩個字母之間只有一個字母的記錄。SQL  語句如下

mysql>  SELECT  *  FROM  fruits
    -> WHERE  f_name  REGEXP  'a.g';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| bs1  |  102 | orange |   11.20 |
| m1   |  106 | mango  |   15.60 |
+------+------+--------+---------+


4.  匹配多個字元

    星號(*) 可以任意次匹配前面的字元,包括  0  次。加號(+)至少匹配前面的字元一次。

    【例】在  fruits  表中,查詢  f_name  欄位以包含字母  b  開頭,且  b  後面出現字母  a  的記錄。SQL  語句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  '^ba*';
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| t1   |  102 | banana     |   10.30 |
+------+------+------------+---------+

【例】在  fruits  表中,查詢  f_name  欄位以包含字母  b  開頭,且  b  後面至少出現一次字母  a  的記錄。SQL  語句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  '^ba+';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| t1   |  102 | banana |   10.30 |
+------+------+--------+---------+

5.  匹配指定字串

    正則表示式可以匹配指定字串,只要這個字串在查詢文字中即可,如要匹配多個字串,多個字串之間 使用分隔符“|”隔開。

    【例】在  fruits  表中,查詢  f_name  欄位值中包含字串  on 的記錄。SQL  語句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  'on';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| bs2  |  105 | melon   |    8.20 |
| l2   |  104 | lemon   |    6.40 |
| o2   |  103 | coconut |    9.20 |
+------+------+---------+---------+

【例】在  fruits  表中,查詢  f_name  欄位值中包含字串  on  或者  ap 的記錄。SQL  語句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  'on|ap';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| a1   |  101 | apple   |    5.20 |
| a2   |  103 | apricot |    2.20 |
| bs2  |  105 | melon   |    8.20 |
| l2   |  104 | lemon   |    6.40 |
| o2   |  103 | coconut |    9.20 |
| t2   |  102 | grape   |    5.30 |
+------+------+---------+---------+

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

【注】區分  LIKE  運算子

  LIKE 運算子用來匹配字串,語法格式為“expr LIKE 匹配條件”。如果 expr 滿足匹配條件,則返回值為 1(TRUE); 如果不匹配,則返回值為 0(FALSE)。 若 expr 或匹配條件中任何一個為 NULL,則結果為NULL。
    LIKE 運算子在進行匹配運算時,可以使用下面兩種萬用字元。
    (1) %:  匹配任意數目的字元,甚至包括零字元。
    (2)  _:  只能匹配一個字元。

【例】使用運算子 LIKE 進行字串匹配運算,SQL語句如下:

  1. mysql> select  'stud'  LIKE  'stud','stud'  LIKE  'stu_',  'stud'  LIKE  '%d',  'stud'  LIKE  't___','s'  LIKE  NULL;  
  2. +----------------------+----------------------+--------------------+----------------------+-----------------+  
  3. 'stud'  LIKE  'stud' | 'stud'  LIKE  'stu_' | 'stud'  LIKE  '%d' | 'stud'  LIKE  't___' | 's'  LIKE  NULL |  
  4. +----------------------+----------------------+--------------------+----------------------+-----------------+  
  5. |                    1 |                    1 |                  1 |                    0 |            NULL |  
  6. +----------------------+----------------------+--------------------+----------------------+-----------------+  

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    LIKE 運算子也可以匹配指定的字串,但與  REGEXP 不同,LIKE 匹配的字串如果在文字中間出現,則找不到它,相應的行也不會返回,而  REGEXP  可以在文字內進行匹配,如果被匹配的字串在文字中出現,REGEXP  將會找到它,相應的行也會被返回。

 【例】在  fruits  表中,使用  LIKE  運算子查詢  f_name  欄位值為 on 的記錄。SQL  語句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  LIKE  'on';
Empty set (0.00 sec)

6.  匹配指定字元中的任意一個

    方括號([])可以指定一個字元集合,只要匹配其中的任何一個字元,即為所查詢的文字。

【例】在  fruits  表中,查詢  f_name  欄位值中包含字母  o 或者 t 的記錄。SQL  語句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  '[ot]';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| a2   |  103 | apricot |    2.20 |
| bs1  |  102 | orange  |   11.20 |
| bs2  |  105 | melon   |    8.20 |
| l2   |  104 | lemon   |    6.40 |
| m1   |  106 | mango   |   15.60 |
| m3   |  105 | xxtt    |   11.60 |
| o2   |  103 | coconut |    9.20 |
+------+------+---------+---------+

7.  匹配指定字元以外的位元組

    [^字元集合]可以匹配不在指定集合中的任何字元。

    【例】在  fruits  表中,查詢  f_id  欄位值中包含字母  a~e  和數字  1~2 以外的字元的記錄。SQL  語句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_id  REGEXP  '[^a-e1-2]';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| b5   |  107 | xxxx    |    3.60 |
| bs1  |  102 | orange  |   11.20 |
| bs2  |  105 | melon   |    8.20 |
| c0   |  101 | cherry  |    3.20 |
| l2   |  104 | lemon   |    6.40 |
| m1   |  106 | mango   |   15.60 |
| m2   |  105 | xbabay  |    2.60 |
| m3   |  105 | xxtt    |   11.60 |
| o2   |  103 | coconut |    9.20 |
| t1   |  102 | banana  |   10.30 |
| t2   |  102 | grape   |    5.30 |
| t4   |  107 | xbababa |    3.60 |
+------+------+---------+---------+

8.  指定字串連續出現的次數

  “字串{n,}“  表示匹配前面的字串至少n次;“字串{n,m}”表示匹配前面的字串至少n次,至多m次。

    【例】在  fruits  表中,查詢  f_name  欄位值至少出現兩次字母‘x’ 的記錄。SQL  語句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  'x{2,}';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| b5   |  107 | xxxx   |    3.60 |
| m3   |  105 | xxtt   |   11.60 |
+------+------+--------+---------+
【例】在  fruits  表中,查詢  f_name  欄位值至少出現一次、最多出現3次  ba  字串的記錄。SQL  語句如下:
mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  'ba{1,3}';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| m2   |  105 | xbabay  |    2.60 |
| t1   |  102 | banana  |   10.30 |
| t4   |  107 | xbababa |    3.60 |
+------+------+---------+---------+

【注】參考於清華大學出版社《MySQL資料庫應用案例課堂》2016年1月第1版