SQL Like & Regexp
1. 定義
慕課解釋?zhuān)?code>Like和
Regexp
操作符一般與Where
搭配用于搜索和匹配字符字段
。
2. 前言
本小節(jié)中,我們將一起學(xué)習(xí)SQL Like
和 SQL Regexp
的基本使用。
很多時(shí)候,數(shù)據(jù)表中存儲(chǔ)了大量的字符類(lèi)型字段,如 varchar 和 char 。雖然它們可以和其它類(lèi)型字段一樣通過(guò) > ,= 等基本運(yùn)算符進(jìn)行比較和操作。但是字符串的特性較為復(fù)雜,當(dāng)需要字符串匹配時(shí),基本運(yùn)算符就無(wú)法滿(mǎn)足了,因此 SQL 提供了 Like 和 Regexp兩個(gè)特殊的操作來(lái)處理字符類(lèi)型。
注意: Like 還可以作用于其它字段類(lèi)型,如 int ,但一般情況下 int 類(lèi)型字段直接使用基本運(yùn)算符就足夠了。
本小節(jié)測(cè)試數(shù)據(jù)如下,請(qǐng)先在數(shù)據(jù)庫(kù)中執(zhí)行:
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 這個(gè)單詞理解為像
,當(dāng)與 Where 搭配時(shí),SQL語(yǔ)句可以大概的翻譯為:搜索某個(gè)字段像什么的結(jié)果。
SQL Like 的語(yǔ)法如下:
SELECT [col] FROM [table_name] WHERE [col] LIKE [val];
其中col
表示字段名稱(chēng),table_name
表示數(shù)據(jù)表名稱(chēng),val
表示條件值。
3.1 例1 單獨(dú)使用 Like
Like 單獨(dú)使用時(shí),作用與=
運(yùn)算符一致。
請(qǐng)書(shū)寫(xiě) SQL 語(yǔ)句,查詢(xún)imooc_user
表中用戶(hù)名像pedro
的用戶(hù)。
分析:
題干中明確的指出,查詢(xún)用戶(hù)名像 pedro 的用戶(hù),可以得出username
是條件字段,LIKE 是操作符,pedro 是條件值。
語(yǔ)句:
整理可得語(yǔ)句如下:
SELECT username, age FROM imooc_user WHERE username LIKE 'pedro';
查詢(xún)結(jié)果如下:
+----------+-----+
| username | age |
+----------+-----+
| pedro | 23 |
+----------+-----+
在上面例子中,Like 與 Where 搭配,搜索出了 pedro 這個(gè)用戶(hù)??稍?imooc_user 表中不僅有 pedro ,其實(shí)還有 peter 這個(gè)用戶(hù),你能否書(shū)寫(xiě)一條 SQL 語(yǔ)句,使用 Like 將 pedro 和 peter 二人同時(shí)搜索出來(lái)了。
單獨(dú)使用 Like 是無(wú)法做到的,但搭配通配符
就可以輕松完成。
4. 通配符
SQL 通配符
是用特殊的字符來(lái)表示一個(gè)或多個(gè)字符。
SQL 通配符必須與 Like 搭配使用。
常見(jiàn)的通配符如下:
通配符 | 描述 |
---|---|
% | 匹配一個(gè)或多個(gè)字符 |
— | 匹配一個(gè)字符 |
[char_list] | char_list是一個(gè)字符列表,其匹配列表中的任意一個(gè)字符 |
[^char_list] | char_list是一個(gè)字符列表,其匹配不在列表中的任意一個(gè)字符 |
提示:
[^char_list]
與[!char_list]
作用是一樣的,即^
和!
等價(jià)。
如果你是初次接觸通配符,可能還不甚明白,我們還是通過(guò)例子來(lái)學(xué)習(xí)。
4.1 例2 Like 搭配單個(gè)通配符%
Like 可搭配單個(gè)通配符%
,用于匹配特定模式下的字符串。
請(qǐng)書(shū)寫(xiě)一條 SQL 語(yǔ)句,使用 Like 將pedro
和peter
二人同時(shí)搜索出來(lái)了。
分析:
現(xiàn)在有了通配符%
,我們就可以輕松的搞定。
語(yǔ)句:
SELECT username, age FROM imooc_user WHERE username LIKE 'pe%';
+----------+-----+
| username | age |
+----------+-----+
| pedro | 23 |
| peter | 18 |
+----------+-----+
%
表示匹配一個(gè)或多個(gè)字符,pe
是 pedro 和 peter 的前綴,后綴dro
和ter
都以通配符%
來(lái)匹配,因此 Like 在匹配搜索的時(shí)候迅速地找到了答案。
%
通配符的作用遠(yuǎn)不止于此。
4.2 例3 Like 搭配兩個(gè)通配符%
Like 也可搭配兩個(gè)通配符%
,匹配特定模式下的字符串。
請(qǐng)書(shū)寫(xiě) SQL 語(yǔ)句,找出用戶(hù)名
內(nèi)(不包括首尾字符)含有e
的用戶(hù)。
分析:
既然是含有e
,因此e
可以出現(xiàn)在除首尾以外的任何地方,通配符可表示為%e%
。
語(yǔ)句:
SELECT username, age FROM imooc_user WHERE username LIKE '%e%';
結(jié)果如下:
+----------+-----+
| username | age |
+----------+-----+
| pedro | 23 |
| peter | 18 |
| faker | 23 |
+----------+-----+
%
是最常見(jiàn)的通配符,但有些時(shí)候我們也需要精確的位數(shù)匹配,這時(shí)_
的作用就體現(xiàn)出來(lái)了。
4.3 例4 Like 搭配通配符_和%
Like 還可搭配兩個(gè)不同的通配符%,_
,匹配特定模式下的字符串。
請(qǐng)書(shū)寫(xiě) SQL 語(yǔ)句,找出第二個(gè)字符為e
的用戶(hù)。
分析:
查詢(xún)條件用通配符可表示為_e%
。
語(yǔ)句:
整理可得語(yǔ)句如下:
SELECT username, age FROM imooc_user WHERE username LIKE '_e%';
結(jié)果如下:
+----------+-----+
| username | age |
+----------+-----+
| pedro | 23 |
| peter | 18 |
+----------+-----+
注意: MySQL 與 PostgreSQL 均不支持
[char_list]
和[^char_list]
通配符,在實(shí)際場(chǎng)景中可以使用正則(Regexp)來(lái)替代。
5. SQL Regexp
正則表達(dá)式可謂是如雷貫耳,與 Like 對(duì)比起來(lái),Regexp
更加強(qiáng)大,當(dāng)然正則表達(dá)式的性能不如 Like。
同 Like 一樣,SQL Regexp 的語(yǔ)法如下:
SELECT [col] FROM [table_name] WHERE [col] REGEXP [val];
其中col
表示字段名稱(chēng),table_name
表示數(shù)據(jù)表名稱(chēng),val
表示條件值。
正則表達(dá)式好用卻較為復(fù)雜,本小節(jié)不會(huì)介紹正則表達(dá)式具體的語(yǔ)法,如果你感興趣,可以查閱相關(guān)資料進(jìn)行學(xué)習(xí)。
5.1 例5 使用 Regexp 查詢(xún)
Regexp 搭配正則表達(dá)式,可用于匹配特定模式下的字符串。
請(qǐng)書(shū)寫(xiě) SQL 語(yǔ)句,找出imooc_user
表中用戶(hù)名以p
或f
開(kāi)頭的用戶(hù)。
分析:
從題干中可以得出,username
是條件字段,條件值是用戶(hù)名以p
或f
開(kāi)頭,用正則表達(dá)式可表示為^[pf]
。
語(yǔ)句:
整理可得語(yǔ)句如下:
SELECT username,age FROM imooc_user WHERE username REGEXP '^[pf]';
結(jié)果:
+----------+-----+
| username | age |
+----------+-----+
| pedro | 23 |
| peter | 18 |
| faker | 23 |
+----------+-----+
從例子中可以看到 Regexp 的用法幾乎與 Like 一致,只不過(guò)將條件值從通配符
換成了正則表達(dá)式
。
6. 小結(jié)
- Like 絕大多數(shù)情況下都是與通配符一起使用的,否則其作用與
=
是一樣的,無(wú)法發(fā)揮真正的威力。 %
通配符使用最為廣泛,也很好理解,多多練習(xí)即可掌握。- 正則表達(dá)式是塊難啃的骨頭,嘗試去理解它,在適當(dāng)?shù)臅r(shí)候查閱相關(guān)資料合理使用即可。
- PostgreSQL 除了 like 之外還有一個(gè)
ilike
,可以直接忽略大小寫(xiě)進(jìn)行匹配。