MySQL——使用正則表示式查詢
使用正則表示式可以檢索或替換符合某個模式的文字內容,根據指定的匹配模式匹配文字中符合要求的特殊字串。
在MySQL中,使用 REGEXP 關鍵字指定正則表示式的字元匹配模式。
選項 | 說明 | 例子 | 匹配值示例 |
^ | 匹配文字的開始字元 | ^b | book,big,banana |
$ | 匹配文字結束字元 | st$ | test,resist |
. | 匹配任何單個字元 | b.t | bit,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 或者 z | dizzy,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語句如下:
- mysql> select 'stud' LIKE 'stud','stud' LIKE 'stu_', 'stud' LIKE '%d', 'stud' LIKE 't___','s' LIKE NULL;
- +----------------------+----------------------+--------------------+----------------------+-----------------+
- | 'stud' LIKE 'stud' | 'stud' LIKE 'stu_' | 'stud' LIKE '%d' | 'stud' LIKE 't___' | 's' LIKE NULL |
- +----------------------+----------------------+--------------------+----------------------+-----------------+
- | 1 | 1 | 1 | 0 | NULL |
- +----------------------+----------------------+--------------------+----------------------+-----------------+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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版