測試必備的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 模糊匹配中文字符吧!而且日常工作中也完全夠用啦!