15 SQL Like & Regexp
1. 定義
解釋:
Like
和Regexp
操作符一般與Where
搭配用於搜尋和匹配字元欄位
。
2. 前言
本小節中,我們將一起學習SQL Like
和 SQL Regexp
的基本使用。
很多時候,資料表中儲存了大量的字元型別欄位,如 varchar 和 char 。雖然它們可以和其它型別欄位一樣通過 > ,= 等基本運算子進行比較和操作。但是字串的特性較為複雜,當需要字串匹配時,基本運算子就無法滿足了,因此 SQL 提供了 Like 和 Regexp兩個特殊的操作來處理字元型別。
注意: Like 還可以作用於其它欄位型別,如 int ,但一般情況下 int 型別欄位直接使用基本運算子就足夠了。
本小節測試資料如下,請先在資料庫中執行:
DROP TABLE IF EXISTS imooc_user;
CREATE TABLE imooc_user
(
username varchar(20),
age int
);
INSERT INTO imooc_user(username,age) VALUES('pedro', 23), ('peter', 18), ('faker', 23);
3. SQL Like
我們可以直觀地將 like 這個單詞理解為像
,當與 Where 搭配時,SQL語句可以大概的翻譯為:搜尋某個欄位像什麼的結果。
SQL Like 的語法如下:
SELECT [col] FROM [table_name] WHERE [col] LIKE [val];
其中col
表示欄位名稱,table_name
表示資料表名稱,val
表示條件值。
3.1 例1 單獨使用 Like
Like 單獨使用時,作用與=
運算子一致。
請書寫 SQL 語句,查詢imooc_user
表中使用者名稱像pedro
的使用者。
分析:
題幹中明確的指出,查詢使用者名稱像 pedro 的使用者,可以得出username
是條件欄位,LIKE 是操作符,pedro 是條件值。
語句:
整理可得語句如下:
SELECT username, age FROM imooc_user WHERE username LIKE 'pedro';
查詢結果如下:
+----------+-----+
| username | age |
+----------+-----+
| pedro | 23 |
+----------+-----+
在上面例子中,Like 與 Where 搭配,搜尋出了 pedro 這個使用者。可在 imooc_user 表中不僅有 pedro ,其實還有 peter 這個使用者,你能否書寫一條 SQL 語句,使用 Like 將 pedro 和 peter 二人同時搜尋出來了。
單獨使用 Like 是無法做到的,但搭配萬用字元
就可以輕鬆完成。
4. 萬用字元
SQL 萬用字元
是用特殊的字元來表示一個或多個字元。
SQL 萬用字元必須與 Like 搭配使用。
常見的萬用字元如下:
萬用字元 | 描述 |
---|---|
% | 匹配一個或多個字元 |
— | 匹配一個字元 |
[char_list] | char_list是一個字元列表,其匹配列表中的任意一個字元 |
[^char_list] | char_list是一個字元列表,其匹配不在列表中的任意一個字元 |
提示:
[^char_list]
與[!char_list]
作用是一樣的,即^
和!
等價。
如果你是初次接觸萬用字元,可能還不甚明白,我們還是通過例子來學習。
4.1 例2 Like 搭配單個萬用字元%
Like 可搭配單個萬用字元%
,用於匹配特定模式下的字串。
請書寫一條 SQL 語句,使用 Like 將pedro
和peter
二人同時搜尋出來了。
分析:
現在有了萬用字元%
,我們就可以輕鬆的搞定。
語句:
SELECT username, age FROM imooc_user WHERE username LIKE 'pe%';
+----------+-----+
| username | age |
+----------+-----+
| pedro | 23 |
| peter | 18 |
+----------+-----+
%
表示匹配一個或多個字元,pe
是 pedro 和 peter 的字首,字尾dro
和ter
都以萬用字元%
來匹配,因此 Like 在匹配搜尋的時候迅速地找到了答案。
%
萬用字元的作用遠不止於此。
4.2 例3 Like 搭配兩個萬用字元%
Like 也可搭配兩個萬用字元%
,匹配特定模式下的字串。
請書寫 SQL 語句,找出使用者名稱
內(不包括首尾字元)含有e
的使用者。
分析:
既然是含有e
,因此e
可以出現在除首尾以外的任何地方,萬用字元可表示為%e%
。
語句:
SELECT username, age FROM imooc_user WHERE username LIKE '%e%';
結果如下:
+----------+-----+
| username | age |
+----------+-----+
| pedro | 23 |
| peter | 18 |
| faker | 23 |
+----------+-----+
%
是最常見的萬用字元,但有些時候我們也需要精確的位數匹配,這時_
的作用就體現出來了。
4.3 例4 Like 搭配萬用字元_和%
Like 還可搭配兩個不同的萬用字元%,_
,匹配特定模式下的字串。
請書寫 SQL 語句,找出第二個字元為e
的使用者。
分析:
查詢條件用萬用字元可表示為_e%
。
語句:
整理可得語句如下:
SELECT username, age FROM imooc_user WHERE username LIKE '_e%';
結果如下:
+----------+-----+
| username | age |
+----------+-----+
| pedro | 23 |
| peter | 18 |
+----------+-----+
注意: MySQL 與 PostgreSQL 均不支援
[char_list]
和[^char_list]
萬用字元,在實際場景中可以使用正則(Regexp)來替代。
5. SQL Regexp
正則表示式可謂是如雷貫耳,與 Like 對比起來,Regexp
更加強大,當然正則表示式的效能不如 Like。
同 Like 一樣,SQL Regexp 的語法如下:
SELECT [col] FROM [table_name] WHERE [col] REGEXP [val];
其中col
表示欄位名稱,table_name
表示資料表名稱,val
表示條件值。
正則表示式好用卻較為複雜,本小節不會介紹正則表示式具體的語法,如果你感興趣,可以查閱相關資料進行學習。
5.1 例5 使用 Regexp 查詢
Regexp 搭配正則表示式,可用於匹配特定模式下的字串。
請書寫 SQL 語句,找出imooc_user
表中使用者名稱以p
或f
開頭的使用者。
分析:
從題幹中可以得出,username
是條件欄位,條件值是使用者名稱以p
或f
開頭,用正則表示式可表示為^[pf]
。
語句:
整理可得語句如下:
SELECT username,age FROM imooc_user WHERE username REGEXP '^[pf]';
結果:
+----------+-----+
| username | age |
+----------+-----+
| pedro | 23 |
| peter | 18 |
| faker | 23 |
+----------+-----+
從例子中可以看到 Regexp 的用法幾乎與 Like 一致,只不過將條件值從萬用字元
換成了正則表示式
。
6. 小結
- Like 絕大多數情況下都是與萬用字元一起使用的,否則其作用與
=
是一樣的,無法發揮真正的威力。 %
萬用字元使用最為廣泛,也很好理解,多多練習即可掌握。- 正則表示式是塊難啃的骨頭,嘗試去理解它,在適當的時候查閱相關資料合理使用即可。
- PostgreSQL 除了 like 之外還有一個
ilike
,可以直接忽略大小寫進行匹配。