MySQL使用正則表達式去檢索指定數(shù)據(jù)庫字段
使用MySQL正則表達式
基本字符匹配
例:檢索列prod_name 包含文本1000的所有行。
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
??REGEXP告訴MySQL,它后面跟著的是正則表達式。
SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;
??這個 . 可以說是正則表達式的一部分用途了。它表示匹配任一一個字符。
LIKE 和 REGEXP的區(qū)別:
- LIKE是匹配整個列,完全一樣或者帶通配符才可以匹配成功
- REGEXP是只要列中包含文本就可以匹配成功。當然REGEXP也可以匹配整個列值。
區(qū)分大小寫:
- 正則表達式的匹配是不區(qū)分大小寫的。為區(qū)分大小寫可使用BINARY關(guān)鍵字。
- 如:WHERE prod_name REGEXP BINARY 'JetPack .000'
進行OR匹配
使用符號 |:
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000' ORDER BY prod_name;
匹配幾個字符串之一
如果你只想匹配特定的字符,可以通過指定一組用 [ ] 括起來的字符完成。
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;
上面這個結(jié)果,還想說明一個問題,就是REGEXP雖然是可以匹配尾巴和頭部的空格,但是你在單引號之間的空格還是需要你自己寫上去的,單引號之間的空格你不寫可是匹配不到結(jié)果的。
如上面結(jié)果所示,[]其實就是另一種方式的or語句,【123】其實也就是【1|2|3】。當然你寫后者也是沒有任何問題的。
下面我們再看一個例子:
SELECT prod_name FROM products WHERE prod_name REGEXP '1|2|3 Ton' ORDER BY prod_name;
從結(jié)果上我們不難看出,你不用【】括起來,MySQL就會理解為1or2or3 Ton這樣的形式
而下面那三行能匹配到也就是因為里面有1or2。
??字符集也可以被否定:[ ^123 ]的意思就是匹配除了這些以外的任何東西。
這個 ^ 在【】括號里,就是除了的1,2,3,的意思,但是如果沒有【】,那就是定位符是文本的開始位置的意思。
你比如說下面這兩結(jié)果就是一樣的:
你再看一個理解定位符^
當時我有一個這樣的例子不明白,后來想明白了。
上面這個當時我就不明白,為什么都不包含1了,紅框里還有,這就是REGEXP,你不包含1or2or3.你有其他的元素呀,所以你就得顯示出來。
匹配范圍
集合可以用來定義要匹配的一個或者多個字符。
例如:下面的集合將匹配數(shù)字0到9
【0123456789】
為了簡化這種類型的集合,可使用 - 來定義一個范圍。
【0-9】
SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;
匹配特殊字符
也就是轉(zhuǎn)義。我們要匹配特殊字符必須用\為前導。
SELECT vend_name FROM vendors WHERE vend_name REGEXP '\.' ORDER BY vend_name;
??多數(shù)的正則表達式實現(xiàn)使用單個反斜杠轉(zhuǎn)義特殊字符,以便能使用這些字符本身。但是mysql要求兩個反斜杠(mysql自己解釋一個,正則表達式庫解釋一個)。
匹配字符類
存在找出你自己經(jīng)常使用的數(shù)字,所有字母字符或所有數(shù)字字母字符等的匹配。為方便工作,可以使用預定義的字符集,稱為字符類。
類 | 說明 |
---|---|
【:alnum:】 | 任意字母和數(shù)字(同【a-zA-Z0-9】) |
【:alpha:】 | 任意字符【a-zA-Z】 |
【:blank:】 | 空格和制表【\t】 |
[:cntrl:] | ASCII控制字符(ASCII0到31和127) |
【:digit:】 | 任意數(shù)字(【0-9】) |
【:graph:】 | 與【:print:】相同,但不包括空格 |
【:lower:】 | 任意小寫字母【a-z】 |
【:print:】 | 任意可打印字符 |
【:punct:】 | 既不在【:alnum:】也不在【:cntrl:】中的任意字符 |
【:space:】 | 包括空格在內(nèi)的任意空白符(同【\f\n\r\t\v】) |
[:upper:] | 任意大寫字母【A-Z】 |
【:xdigit:】 | 任意十六進制數(shù)字(同【a-fA-F0-9】) |
匹配多個實例
重復元字符
元字符 | 說明 |
---|---|
* | 0個或者多個匹配 |
+ | 1個或多個匹配(等于{1,}) |
? | 0個或1個匹配(等于{0,1}) |
{n} | 指定數(shù)目的匹配 |
{n,} | 不少于指定數(shù)目的匹配 |
{n,m} | 匹配數(shù)目的范圍 |
SELECT prod_name FROM products WHERE prod_name REGEXP '\([0-9] sticks?\)' ORDER BY prod_name;
??我覺得難理解的點就在于,那個?的匹配(s后的?使s可選,因為?匹配他前面的的任何字符0次或者1次)。這也就是會有第一條結(jié)果的原因。
例:匹配連在一起的的4位數(shù)字。
SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name;
定位符
之前的例子都是匹配任一一個串中任意位置的文本。為了匹配特定位置的文本,我們需要使用定位符。
元字符 | 說明 |
---|---|
^ | 文本的開始 |
$ | 文本的結(jié)束 |
[[:<:]] | 詞的開始 |
[[:>:]] | 詞的結(jié)束 |
例:找一個以數(shù)或小數(shù)點開始的所有產(chǎn)品
SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\.]' ORDER BY prod_name;
到此這篇關(guān)于MySQL使用正則表達式去檢索指定數(shù)據(jù)庫字段的文章就介紹到這了,更多相關(guān)MySQL檢索數(shù)據(jù)庫字段內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql觸發(fā)器簡介、創(chuàng)建觸發(fā)器及使用限制分析
這篇文章主要介紹了mysql觸發(fā)器簡介、創(chuàng)建觸發(fā)器及使用限制,結(jié)合實例形式分析了mysql觸發(fā)器的功能、原理、創(chuàng)建、用法及操作注意事項,需要的朋友可以參考下2019-12-12MYSQL?Binlog恢復誤刪數(shù)據(jù)庫詳解
MySQL一旦誤刪數(shù)據(jù)庫之后恢復數(shù)據(jù)很麻煩,這里記錄一下艱辛的恢復過程,這篇文章主要給大家介紹了關(guān)于如何利用MySQL的binlog恢復誤刪數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2022-11-11Slave memory leak and trigger oom-killer
這篇文章主要介紹了Slave memory leak and trigger oom-killer,需要的朋友可以參考下2016-07-07Mysql InnoDB引擎的索引與存儲結(jié)構(gòu)詳解
這篇文章主要給大家介紹了Mysql InnoDB引擎的索引與存儲結(jié)構(gòu)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧2019-01-01