天天看點

Mysql常用sql語句(21)- regexp 正規表達式查詢

測試必備的Mysql常用sql語句系列

https://www.cnblogs.com/poloyy/category/1683347.html

前言

正則的強大不言而喻,Mysql中也提供了 regexp 關鍵字來進行正則查詢

正則查詢的文法格式

<列名> regexp '正規表達式'      

常用的正規表達式

選項 說明 例子 比對值示例
^ 比對文本的開始字元 '^b' 比對以字母 b 開頭的字元串 book、big、banana、bike
$ 比對文本的結束字元 'st$' 比對以 st 結尾的字元串 test、resist、persist
. 比對任何單個字元 'b.t' 比對任何 b 和 t 之間有一個字元 bit、bat、but、bite
* 比對零個或多個在它前面的字元 'f*n' 比對字元 n 前面有任意個字元 f fn、fan、faan、abcn
+ 比對前面的字元 1 次或多次 'ba+' 比對以 b 開頭,後面至少緊跟一個 a ba、bay、bare、battle
<字元串> 比對包含指定字元的文本 'fa' 比對包含‘fa’的文本 fan、afa、faad
[字元集合] 比對字元集合中的任何一個字元 '[xz]' 比對 x 或者 z dizzy、zebra、x-ray、extra
[^] 比對不在括号中的任何字元 '[^abc]' 比對任何不包含 a、b 或 c 的字元串 desk、fox、f8ke
字元串{n,} 比對前面的字元串至少 n 次 'b{2}' 比對 2 個或更多的 b bbb、bbbb、bbbbbbb

字元串

{n,m}

比對前面的字元串至少 n 次, 至多 m 次 'b{2,4}' 比對最少 2 個,最多 4 個 b bbb、bbbb

先看看product表有什麼資料

product表

這裡沒有截全哈,因為資料比較多

Mysql常用sql語句(21)- regexp 正規表達式查詢

栗子一:^

select * from product where product_name regexp '^2018';      
Mysql常用sql語句(21)- regexp 正規表達式查詢

栗子二:$

select * from product where product_name regexp '潮$';      

先看看emp表有什麼資料

emp表

Mysql常用sql語句(21)- regexp 正規表達式查詢

後面再解釋下為啥又換表了

栗子三: *、+

po*:查詢 name 字段包含字母 p ,且 p 後面出現字母 o 的記錄,而 * 可以表示0個字元,代表不出現

select * from emp where name regexp 'po*';      
Mysql常用sql語句(21)- regexp 正規表達式查詢

po+:查詢 name 字段包含字母 p ,且 p 後面出現字母 o 的記錄,但 + 表示至少出現1個字元

select * from emp where name regexp 'po+';      
Mysql常用sql語句(21)- regexp 正規表達式查詢

栗子四:[]

下面兩種寫法是一樣的,用 , 隔開每個字元,可能可讀性更高

select * from emp where name regexp '[p,s]';
select * from emp where name regexp '[ps]';      
Mysql常用sql語句(21)- regexp 正規表達式查詢

栗子五:[^]

注意:這裡的^是取反,不是開頭的意思哦!不要混淆

查詢 id >=10 且 開頭非字母 p 的記錄

select * from emp where id >=10 and  name regexp '^[^p]';      
Mysql常用sql語句(21)- regexp 正規表達式查詢

為啥中途換表

因為,我發現正規表達式并不是對所有中文都生效,舉個下面的栗子

select * from emp where name regexp '[小]';      
Mysql常用sql語句(21)- regexp 正規表達式查詢

可以看到,name 字段需要比對到一個【小】才應該被傳回,但是除了紅框以外的資料都被傳回了,有問題有問題....

那為什麼會這樣呢?

  • 原來,是因為 regexp 不支援多位元組比對,說白了,就是不支援中文編碼
  • 要想查詢中文,最好通過 like 關鍵字進行模糊比對啦

當然啦,也不是沒有解決辦法

隻需要用小括号()把中文括起來就行了

select * from emp where name regexp '^(小)';      
Mysql常用sql語句(21)- regexp 正規表達式查詢

但,這種寫法在 [ ] 裡面還是不起作用

select * from emp where name regexp '[(小)]';      
Mysql常用sql語句(21)- regexp 正規表達式查詢

是以啊,還是推薦用 like 模糊比對中文字元吧!而且日常工作中也完全夠用啦!