MySQL使用正則表示式查詢
正則表示式是用某種模式去匹配一類字串的一個方式。正則表示式的查詢能力比通配字元的查詢能力更強大,而且更加的靈活。
建立資料表tb_book(圖書資訊表),並新增相關資料,用於後續的示例使用。
CREATE TABLE tb_book ( id INT AUTO_INCREMENT PRIMARY KEY, books VARCHAR(30) NOT NULL ); INSERT INTO tb_book(books) VALUES('Java程式設計') ,('深入Java程式設計'),('MySQL資料庫'),('深入SQL Server資料庫') ,('C#高階程式設計'),('Oracle資料庫');
在MySQL中,使用REGEXP關鍵字來匹配查詢正則表示式。其基本形式如下:
欄位名 REGEXP '匹配方式'
(1)欄位名:表示需要查詢的欄位名稱。
(2)匹配方式:表示一哪種方式來進行匹配查詢。
正則表示式的模式字元:
模式字元 | 含義 | 應用舉例 |
---|---|---|
^ | 匹配以特定字元或字串開頭的記錄 | 使用“^”表示式查詢已字母“Java”開頭的記錄,語句如下: SELECT * FROM tb_book WHERE books REGEXP '^Java'; |
$ | 匹配以特定字元或字串結尾的記錄 | 使用“$”表示式查詢已“資料庫”結尾的記錄,語句如下: SELECT * FROM tb_book WHERE books REGEXP '資料庫$'; |
. | 匹配字串的任意一個字元,包括回車和換行符 | 使用“.”表示式查詢包括“J”字元的記錄,語句如下: SELECT * FROM tb_book WHERE books REGEXP 'J.'; |
[字元集合] | 匹配字元集合中的任意一個字元 | 使用“[]”表示式查詢包含“MCQ”字元的記錄,語句如下: SELECT * FROM tb_book WHERE books REGEXP '[MCQ]'; |
[^字元集合] | 匹配排除“字元集合”以外的任意一個字串 | 查詢排除包括c-z字母以外的記錄,語句如下: SELECT * FROM tb_book WHERE books REGEXP '[^c-z]'; |
S1|S2|S3 | 匹配S1、S2和S3中的任意一個字串 | 查詢包含“Java”、“C#”、“Oracle”字元中任意一個字元的記錄,語句如下:SELECT * FROM tb_book WHERE books REGEXP 'JAVA|C#|ORACLE'; |
* | 匹配多個該符號之前的字元,包括0和1個 | 使用“*”表示式查詢“A”字元前面可能出現過J字元的記錄,語句如下: SELECT * FROM tb_book WHERE books REGEXP 'J*A'; |
+ | 匹配多個該符號之前的字元,至少包括1個 | 使用“+”表示式查詢“A”字元前面至少出現過一個“J”字元的記錄,語句如下:SELECT * FROM tb_book WHERE books REGEXP 'J+A'; |
字串{N} | 匹配字串出現N次 | 使用“{N}”表示式查詢連續出現3次“a”字元的記錄,語句如下: SELECT * FROM tb_book WHERE books REGEXP 'a{3}'; |
字串{M,N} | 匹配字串出現至少M次,最多N次 | 使用“{M,N}”表示式查詢至少出現2次,最多出現4次“a”字元的記錄,語句如下:SELECT * FROM tb_book WHERE books REGEXP 'a{2,4}'; |
注意:關於大小寫的區分,MySQL中正則表示式匹配(從版本3.23.4後)不區分大小寫。如果要區分大小寫,應該使用BINARY關鍵字。
例如:使用“.”表示式查詢包括大寫“L”字元的記錄,語句如下:
SELECT * FROM tb_book WHERE books REGEXP BINARY 'L.';
1、匹配指定字元中的任意一個
使用方括號([])可以將需要查詢字元組成一個字符集。只要記錄中包含方括號中的任意字元,該記錄將會被查詢出來。
示例:查詢名稱中包括a、b、c字母中任意一個的記錄。
SELECT * FROM tb_book WHERE books REGEXP '[abc]';
2、使用“*”和“+”來匹配多個字元
正則表示式中,“*”和“+”都可以匹配多個該符號之前的字元。但是,“+”至少表示一個字元,而“*”可以表示0個字元。
示例:使用“*”表示式查詢“A”字元前面可能出現過J字元的記錄。
SELECT * FROM tb_book WHERE books REGEXP 'J*A';
執行結果:
Java程式設計
深入Java程式設計
Oracle資料庫
查詢結果顯示,“Oracle資料庫”該記錄中字母A之前並沒有字母J。因為“*”可以表示0個,所以字母A前面有0個或者多個字母J出現。
示例:使用“+”表示式查詢“A”字元前面至少出現過一個“J”字元的記錄。
SELECT * FROM tb_book WHERE books REGEXP 'J+A';
執行結果:
Java程式設計
深入Java程式設計
3、匹配以指定的字元開頭和結束的記錄
正則表示式中,^表示字串的開始位置,$表示字串的結束位置。
示例:查詢以“My”開頭,以“資料庫”結尾的記錄。
SELECT * FROM tb_book WHERE books REGEXP '^My.+資料庫$';
執行結果:
MySQL資料庫