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表

這里沒有截全哈,因為數據比較多

 

栗子一:^

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM