測試必備的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表
這裡沒有截全哈,因為資料比較多

栗子一:^
select * from product where product_name regexp '^2018';
栗子二:$
select * from product where product_name regexp '潮$';
先看看emp表有什麼資料
emp表
後面再解釋下為啥又換表了
栗子三: *、+
po*:查詢 name 字段包含字母 p ,且 p 後面出現字母 o 的記錄,而 * 可以表示0個字元,代表不出現
select * from emp where name regexp 'po*';
po+:查詢 name 字段包含字母 p ,且 p 後面出現字母 o 的記錄,但 + 表示至少出現1個字元
select * from emp where name regexp 'po+';
栗子四:[]
下面兩種寫法是一樣的,用 , 隔開每個字元,可能可讀性更高
select * from emp where name regexp '[p,s]';
select * from emp where name regexp '[ps]';
栗子五:[^]
注意:這裡的^是取反,不是開頭的意思哦!不要混淆
查詢 id >=10 且 開頭非字母 p 的記錄
select * from emp where id >=10 and name regexp '^[^p]';
為啥中途換表
因為,我發現正規表達式并不是對所有中文都生效,舉個下面的栗子
select * from emp where name regexp '[小]';
可以看到,name 字段需要比對到一個【小】才應該被傳回,但是除了紅框以外的資料都被傳回了,有問題有問題....
那為什麼會這樣呢?
- 原來,是因為 regexp 不支援多位元組比對,說白了,就是不支援中文編碼
- 要想查詢中文,最好通過 like 關鍵字進行模糊比對啦
當然啦,也不是沒有解決辦法
隻需要用小括号()把中文括起來就行了
select * from emp where name regexp '^(小)';
但,這種寫法在 [ ] 裡面還是不起作用
select * from emp where name regexp '[(小)]';
是以啊,還是推薦用 like 模糊比對中文字元吧!而且日常工作中也完全夠用啦!