MySQL提供標準的SQL模式匹配,以及一種基於像Unix實用程序,如:vi、grep和sed的擴展正則表達式模式匹配的格式前端
1、SQL模式(% ,_)java
SQL的模式匹配容許你使用「_」匹配任何單個字符,而「%」匹配任意數目字符(包括零個字符)。在MySQL中,SQL的模式缺省是忽略大小寫的。git
注意:在你使用SQL模式時,你不能使用=或!=;而使用LIKE或NOT LIKE比較操做符。正則表達式
語法:SELECT 字段 FROM 表 WHERE 某字段 Like 條件函數
其中關於條件,SQL提供了兩種匹配模式:post
一、百分號(%):表示任意個或多個字符。可匹配任意類型和長度的字符。spa
示例1:blog
SELECT * FROM character WHERE name LIKE ‘%孫%'; 即匹配姓名爲「孫行者」,「行者孫,「行者孫」等包含「孫」類型的數據
示例2:字符串
SELECT * FROM character WHERE name LIke '%孫%' and name like '%行%'; 即匹配姓名爲「孫行者」,「行者孫,「行者孫」等包含「孫」和「行」的數據
示例3:it
SELECT * FROM character WHERE name LIke '%孫%行%‘; 只能匹配姓名爲「孫行者」等相似「...孫...行...」的數據
二、下劃線(_):表示任意單個字符。匹配單個任意字符,它經常使用來限制表達式的字符長度語句:(能夠表明一箇中文字符)
示例1:
SELECT * FROM character WHERE name LIKE ‘_三_'; 即匹配姓名爲「..三..」類型的數據,先後均只有一個字符
示例2:
SELECT * FROM character WHERE name LIKE ‘_三'; 即匹配姓名相似「...三」類型的數據,前面有且只有一個字符
2、正則模式
正則表達式做用是匹配文本,將一個模式(正則表達式)與一個文本穿進行比較。
MySQL用where子句對正則表達式提供了初步的支持,容許你指定用正則表達式過濾SELECT檢索出的數據。
一、MySQL正則表達式僅僅使SQL語言的一個子集,能夠匹配基本的字符、字符串。
select * from wp_posts where post_name REGEXP 'hello'; 能夠檢索出列post_name中全部包含hello的行
二、.匹配除\n以外的任意單個字符
select * from wp_posts where post_name REGEXP '.og';
注:.是正則表達式中的一個特殊字符。它表示匹配一個字符,所以bog,cog,dog等等都能匹配。
注意:
關於大小寫的區分:MySQL中正則表達式匹配(從版本3.23.4後)不區分大小寫。
若是要區分大小寫,應該使用BINARY關鍵字,例如:
where post_name REGEXP BINARY 'Hello .000'
三、^匹配字符串開始位置,如查詢全部姓王的人名
select name from 表名 where name REGEXP '^王';
四、$匹配字符串結束位置,如查詢全部姓名末尾是「明」的人名
select name from 表名 where name REGEXP '明$';
五、進行OR匹配
爲搜索兩個串之一(或者這個串,或者爲另一個串),使用|。
|做爲OR操做符,表示匹配其中之一。能夠給出兩個以上的OR條件。
select * from products where pro_id REGEXP '1000|2000'; 這樣就1000和2000都能匹配並返回,固然,使用多個|就能夠匹配多個串
六、[ ]匹配任何單一字符,是另外一種形式的OR語句,可縮寫的OR語句
例如,匹配範圍:[0123456789]能夠匹配0到9,[1-4][4-9]也是合法的範圍。
此外,範圍不必定只是數值的,[a-z]匹配任意字母字符。
例如,查詢出w/z/s開頭的人的人名
SELECT prod_name FROM products WHERE prod_name REGEXP '^[wzs]';
七、[^....]匹配不包含在[ ]的字符,如查詢出chenmin以外的人名
SELECT prod_name FROM products WHERE prod_name REGEXP '^[wzs]';
注:^的雙重用途:在集合中(用[ ]定義),它用來否認該集合。不然,用來指串的開始
八、匹配特殊字符使用\\進行轉義
\\爲前導。即轉義,正則表達式內具備特殊意義的全部字符都必須以這種方式轉義。
(1)\\- 表示查找- (2)\\. 表示查找. (3)\\f 表示換頁 (4)\\n 表示換行 (5)\\r 表示回車 (6)\\t 表示製表 (7)\\v 表示縱向製表
注:爲了匹配\自己,須要使用\\\
九、匹配字符類
(1)[:alnum:] 任意字母和數字(同[a-zA-Z0-9]) (2)[:alpha:] 任意字符(同[a-zA-A]) (3)[:blank:] 空格和製表符(同[\\t]) (4)[:digit:] 任意數字(同[0-9]) (5)[:lower:] 任意小寫字母(同[a-z]) (6)[:upper:] 任意大寫字母(同[A-Z]) (7)[:space:] 包括空格在內的任意空白字符(同 [\\f\\n\\t\\r\\v]) (8)[:cntrl:] ASCII控制字符(ASCII 0到31和127) (9)[:graph:] 與["print:]相同,但不包括空格 (10)[:print:] 任意可打印字符 (11)[:punct:] 既不在 [:alnum:] 又不在 [:cntrl:] 中的任意字符 (12)[:xdigit:] 任意十六進制數字(同 [a-fA-F0-9])
十、匹配多個示例,關於重複元字符
元字符 說明 * 0個或多個匹配 + 1個或多個匹配(等於 {1, }) ? 0個或1個匹配(等於 {0, 1}) {n} 指定數目的匹配 {n, } 很多於指定數目的匹配 {n ,m} 匹配數目的範圍(m不超過255)
例子:
select prod_name from products where prod_name REGEXP '[[:DIGIT:]]{4}';
如前所述,[:digit:]匹配任意數字,於是它爲數字的一個幾何。
[[:digit:]]{4}匹配連在一塊兒的任意4位數字,固然,上面的例子也能夠這樣寫REGEXP '[0-9][0-9][0-9][0-9]'
十一、定位符
^ 文本的開始 $ 文本的末尾 [[:<:]] 詞的開始 [[:>:]] 詞的結尾
注:like匹配整個串,而REGEXP匹配子串。
3、in查詢
叫in查詢不是很合理,更合理的說法是:in其實和=相似,區別在於:=後面是一個值。in後面能夠是多個值。
示例1:
select * from role where name in("唐三"); 即匹配姓名爲「唐三」一行數據;
示例2:
select * from role where name in("唐三","唐三藏"); 即匹配姓名爲「唐三」,「唐三藏」一行數據;
示例3:
select * from role where name in("唐三","%行者%") 只匹配姓名爲「唐三」一行數據;即in查詢不支持模糊查詢,如示例4
示例4:
select * from role where name in("%行者%") 無匹配結果
4、like contact模糊查詢
CONCAT(str1,str2,…) 函數返回結果爲鏈接參數產生的字符串。
select * from role where name like contact("%","三","%"); 即匹配姓名爲「唐三」,「唐三藏」等類型的數據數據;
like contact模糊查詢強大的地方在於能夠對傳進來的參數進行某查詢,好比經前端提交上的數據,賦值給參數name,則能夠select * from table where name like contact("%",${name},"%")