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

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資料庫