Like Share Discussion Bookmark Smile

J.J. Huang   2020-06-16   MySQL   瀏覽次數:

MySQL - 第九章 | 用正則表達式進行搜索

前言

關於正則表達式,老實說我也沒有深入去做過學習,都是有需要的時候才去上網做查詢和使用,畢竟這套語言我自認為不是這麼容易記住的;所以看文這篇文章後,僅僅做簡單的使用教學,但是我實際在在撰寫MySQL語法的時候,也是非常少使用正則表達式。

準備

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

DROP TABLE IF EXISTS `products`;

CREATE TABLE products
(
prod_id char(10) NOT NULL,
vend_id int NOT NULL ,
prod_name char(255) NOT NULL ,
prod_price decimal(8,2) NOT NULL ,
prod_desc text NULL ,
PRIMARY KEY(prod_id)
) ENGINE=InnoDB;

INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV01', 1001, '.5 ton anvil', 5.99, '.5 ton anvil, black, complete with handy hook');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV02', 1001, '1 ton anvil', 9.99, '1 ton anvil, black, complete with handy hook and carrying case');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV03', 1001, '2 ton anvil', 14.99, '2 ton anvil, black, complete with handy hook and carrying case');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('OL1', 1002, 'Oil can', 8.99, 'Oil can, red');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FU1', 1002, 'Fuses', 3.42, '1 dozen, extra long');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('SLING', 1003, 'Sling', 4.49, 'Sling, one size fits all');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('TNT1', 1003, 'TNT (1 stick)', 2.50, 'TNT, red, single stick');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('TNT2', 1003, 'TNT (5 sticks)', 10, 'TNT, red, pack of 10 sticks');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FB', 1003, 'Bird seed', 10, 'Large bag (suitable for road runners)');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FC', 1003, 'Carrots', 2.50, 'Carrots (rabbit hunting season only)');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('SAFE', 1003, 'Safe', 50, 'Safe with combination lock');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('DTNTR', 1003, 'Detonator', 13, 'Detonator (plunger powered), fuses not included');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('JP1000', 1005, 'JetPack 1000', 35, 'JetPack 1000, intended for single use');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('JP2000', 1005, 'JetPack 2000', 55, 'JetPack 2000, multi-use');

正則表達式介紹

前兩章中的過濾例子允許用匹配、比較和通配操作符尋找資料。對於基本的過濾(或者甚至是某些不那麼基本的過濾),這樣就足夠了。但隨著過濾條件的複雜性的增加,WHERE子句本身的複雜性也有必要增加。

這也就是正則表達式變得有用的地方。正則表達式是用來匹配文本的特殊的串(字符集合)。如果你想從一個文本文件中提取電話號碼,可以使用正則表達式。如果你需要查找名字中間有數字的所有文件,可以使用一個正則表達式。如果你想在一個文本塊中找到所有重複的單詞,可以使用一個正則表達式。如果你想替換一個頁面中的所有URL為這些URL的實際HTML連結,也可以使用一個正則表達式(對於最後這個例子,或者是兩個正則表達式)。

所有種類的程序設計語言、文本編輯器、操作系統等都支持正則表達式。正則表達式語言是用來完成剛討論的所有工作以及更多工作的一種特殊語言。與任意語言一樣,正則表達式具有你必須學習的特殊的語法和指令。

使用MySQL正則表達式

正則表達式的作用是匹配文本,將一個模式(正則表達式)與一個文本串進行比較。MySQL用WHERE子句對正則表達式提供了初步的支持,允許你指定正則表達式,過濾SELECT檢索出的資料。

基本字符匹配

我們從一個非常簡單的例子開始。下面的語句檢索列prod_name包含文本1000的所有行。

1
2
3
4
5
6
7
mysql> select prod_name from products where prod_name regexp '1000';
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.00 sec)

分析:除關鍵字LIKE被REGEXP替代外,這條語句看上去非常像使用LIKE的語句。它告訴MySQL:REGEXP後所跟的東西作為正則表達式(與文字正文1000匹配的一個正則表達式)處理。

為什麼要費力地使用正則表達式?在剛才的例子中,正則表達式確實沒有帶來太多好處(可能還會降低性能),請考慮下面的例子:

1
2
3
4
5
6
7
8
mysql> select prod_name from products where prod_name regexp '.000';
+--------------+
| prod_name |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)

分析:這裡使用了正則表達式.000。.是正則表達式語言中一個特殊的字符。它表示匹配任意一個字符,因此,1000和2000都匹配且返回。

結語

到這邊我想就簡單的介紹到這邊,先讓大家知道如何使用正則表示式就好。更進一步的深入研究我就不放在這邊了。後面將會找時間補上一篇正則表示式的深入研究教學筆記。

在專案上,我自己真的很少把正則表示式帶入並使用到SQL語法上。

註:以上參考了
MySQL必知必会 MySQL Crash Course