MySQL必知必會 —— 使用通配符進行過濾 使用正則表達式進行搜索

第八章 使用通配符進行過濾

1. like通配符

通配符(wildcard) 用來匹配值的一部分的特殊字符。
搜索模式(search pattern) 由字面值、通配符或兩者組合構成的搜索條件

1.1 百分號(%)通配符

最常使用的通配符是百分號(%)。在搜索串中, %表示任何字符出現任意次數。
爲了找出所有以詞jet起頭的產品,可使用以下SELECT語句:

select prod_id,prod_name from products
where prod_name like 'jet%';

在這裏插入圖片描述
區分大小寫 根據MySQL的配置方式,搜索可以是區分大小寫的。如果區分大小寫,'jet%’與JetPack 1000將不匹配

注意尾空格 尾空格可能會干擾通配符匹配。例如,在保存詞anvil時,如果它後面有一個或多個空格,則子句WHERE prod_name LIKE '%anvil’將不會匹配它們,因爲在最後的l後有多餘的字符。解決這個問題的一個簡單的辦法是在搜索模式最後附加一個%。一個更好的辦法是使用函數(第11章將會介紹)去掉首尾空格。

注意NULL 雖然似乎%通配符可以匹配任何東西,但有一個例外,即NULL。即使是WHERE prod_name LIKE '%’也不能匹配用值NULL作爲產品名的行

1.2 下劃線(_)通配符

下劃線的用途與%一樣,但 下劃線只匹配單個字符而不是多個字符

select prod_id,prod_name from products
where prod_name like '_ ton anvil';

在這裏插入圖片描述

select prod_id,prod_name from products
where prod_name like '% ton anvil';

在這裏插入圖片描述

使用通配符的技巧

❑ 不要過度使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。
❑ 在確實需要使用通配符時,除非絕對有必要,否則不要把它們用在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起來是最慢的。
❑ 仔細注意通配符的位置。如果放錯地方,可能不會返回想要的數據。

第九章 使用正則表達式進行搜索

1. 正則表達式

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

2. 使用MySQL正則表達式

2.1 基本字符匹配

檢索列prod_name包含文本1000的所有行:

select prod_name from products
where prod_name regexp '1000'
order by prod_name;

在這裏插入圖片描述

select prod_name from products
where prod_name regexp '.000'
order by prod_name;

在這裏插入圖片描述
匹配不區分大小寫 MySQL中的正則表達式匹配(自版本3.23.4後)不區分大小寫(即,大寫和小寫都匹配)。爲區分大小寫,可使用BINARY關鍵字,如WHERE prod_nameREGEXP BINARY ‘JetPack .000’。

2.2 進行or匹配

爲搜索兩個串之一(或者爲這個串,或者爲另一個串),使用|,如下所示:

select prod_name from products
where prod_name regexp '1000|2000'
order by prod_name;

在這裏插入圖片描述
兩個以上的OR條件 可以給出兩個以上的OR條件。例如,'1000 | 2000 | 3000’將匹配1000或2000或3000。

2.3 匹配幾個字符之一

可通過指定一組用[和]括起來的字符來完成, 如下所示:

select prod_name from products
where prod_name regexp '[123] Ton'
order by prod_name;

在這裏插入圖片描述

2.4 匹配範圍

集合可用來定義要匹配的一個或多個字符。
例如,下面的集合將匹配數字0到9:
[0-9]

select prod_name from products
where prod_name regexp '[1-5] Ton'
order by prod_name;

在這裏插入圖片描述

2.5 匹配特殊字符

爲了匹配特殊字符,必須用\爲前導。\-表示查找-, \.表示查找 .

select prod_name from products
where prod_name regexp '\\.'
order by prod_name;

在這裏插入圖片描述
在這裏插入圖片描述
*匹配* 爲了匹配反斜槓(\)字符本身,需要使用\\。

\或\? 多數正則表達式實現使用單個反斜槓轉義特殊字符,以便能使用這些字符本身。但MySQL要求兩個反斜槓(MySQL自己解釋一個,正則表達式庫解釋另一個)。

2.6 匹配字符類

在這裏插入圖片描述

2.7 匹配多個實例

目前爲止使用的所有正則表達式都試圖匹配單次出現。如果存在一個匹配,該行被檢索出來,如果不存在,檢索不出任何行。但有時需要對匹配的數目進行更強的控制。例如,你可能需要尋找所有的數,不管數中包含多少數字,或者你可能想尋找一個單詞並且還能夠適應一個尾隨的s(如果存在),等等。
在這裏插入圖片描述

select prod_name from products
where prod_name regexp '\\([0-9] sticks?\\)'
order by prod_name;

在這裏插入圖片描述

2.8 定位符

爲了匹配特定位置的文本,需要使用定位符。
在這裏插入圖片描述

select prod_name from products
where prod_name regexp '^[0-9\\.]'
order by prod_name;

在這裏插入圖片描述
^的雙重用途   ^有兩種用法。在集合中(用[和]定義),用它來否定該集合,否則,用來指串的開始處。

使REGEXP起類似LIKE的作用 LIKE和REGEXP的不同在於,LIKE匹配整個串而REGEXP匹配子串。利用定位符,通過用^開始每個表達式,用$結束每個表達式,可以使REGEXP的作用與LIKE一樣。

簡單的正則表達式測試 可以在不使用數據庫表的情況下用SELECT來測試正則表達式。REGEXP檢查總是返回0(沒有匹配)或1(匹配)。可以用帶文字串的REGEXP來測試表達式,並試驗它們

select 'hello' regexp [0-9]

這個例子顯然將返回0(因爲文本hello中沒有數字)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章