c3p0 参数 模糊查询_MySQL模糊查询用法大全(正则、通配符、内置函数等)
文章來源:MySQL模糊查詢用法大全(正則、通配符、內(nèi)置函數(shù)等)
原文作者:陳哈哈
來源平臺:CSDN
這是一條我們在MySQL中常用到的模糊查詢方法,通過通配符%來進行匹配,其實,這只是冰山一角,在MySQL中,支持模糊匹配的方法有很多,且各有各的優(yōu)點。好了,今天讓我?guī)Т蠹乙黄鹣破餗ySQL的小裙子,看一看模糊查詢下面還藏著多少鮮為人知的好東西。
一、MySQL通配符模糊查詢(%,_)
1-1. 通配符的分類
1-2. 通配符的使用
1) % 通配符:
-- 模糊匹配含有“網(wǎng)”字的數(shù)據(jù)
SELECT * from app_info where appName like '%網(wǎng)%';-- 模糊匹配以“網(wǎng)”字結(jié)尾的數(shù)據(jù)
SELECT * from app_info where appName like '%網(wǎng)';-- 模糊匹配以“網(wǎng)”字開頭的數(shù)據(jù)
SELECT * from app_info where appName like '網(wǎng)%';-- 精準(zhǔn)匹配,appName like '網(wǎng)' 等同于:appName = '網(wǎng)'
SELECT * from app_info where appName = '網(wǎng)'; -- 等同于 SELECT * from app_info where appName like '網(wǎng)';-- 模糊匹配含有“xxx網(wǎng)xxx車xxx”的數(shù)據(jù),如:"途途網(wǎng)約車司機端、網(wǎng)絡(luò)約車平臺"
SELECT * from app_info where appName like '%網(wǎng)%車%';2) _ 通配符:
-- 查詢以“網(wǎng)”為結(jié)尾的,長度為三個字的數(shù)據(jù),如:"鏈家網(wǎng)",
SELECT * from app_info where appName like '__網(wǎng)';-- 模糊匹配含有“xx網(wǎng)x車xxx”的數(shù)據(jù),如:"攜程網(wǎng)約車客戶端"
SELECT * from app_info where appName like '__網(wǎng)_車%';注意事項:
注意大小寫,在使用模糊匹配時,也就是匹配文本時,MySQL默認(rèn)配置是不區(qū)分大小寫的。當(dāng)你使用別人的MySQL數(shù)據(jù)庫時,要注意是否區(qū)分大小寫,是否區(qū)分大小寫取決于用戶對MySQL的配置方式.如果是區(qū)分大小寫,那么像Test12這樣記錄是不能被"test__"這樣的匹配條件匹配的。注意尾部空格,"%test"是不能匹配"test "這樣的記錄的。
注意NULL,%通配符可以匹配任意字符,但是不能匹配NULL,也就是說SELECT * FROM blog where title_name like '%';是匹配不到title_name為NULL的的記錄。
1-3. 技巧與建議:
正如所見,MySQL的通配符很有用。但這種功能是有代價的:通配符搜索的處理一般要比前面討論的其他搜索所花時間更長,消耗更多的內(nèi)存等資源。這里給出一些使用通配符要記住的技巧。
- 不要過度使用通配符。如果其他操作符能達到相同的目的,應(yīng)該使用其他操作符。
- 在確實需要使用通配符時,除非絕對有必要,否則不要把它們用在搜索模式的開始處。因為MySQL在where后面的執(zhí)行順序是從左往右執(zhí)行的,如果把通配符置于搜索模式的開始處(最左側(cè)),搜索起來是最慢的(因為要對全庫進行掃描)。
- 仔細(xì)注意通配符的位置。如果放錯地方,可能不會返回想要的數(shù)據(jù)。
有細(xì)心地朋友會發(fā)現(xiàn),如果數(shù)據(jù)中有“%”、“_”等符號,那豈不是和通配符沖突了?
SELECT * from app_info where appName LIKE '%%%';SELECT * from app_info where appName LIKE '%_%';確實如此,上面面兩條SQL語句查詢的都是全表數(shù)據(jù),而不是帶有"%"和"_"的指定數(shù)據(jù)。這里需要加 ESCAPE 關(guān)鍵字進行轉(zhuǎn)義。
如下,ESCAPE 后面跟著一個字符,里面寫著什么,MySQL就把那個符號當(dāng)做轉(zhuǎn)義符,一般我就寫成"/";然后就像 C語言中轉(zhuǎn)義字符一樣 例如 ‘n’,’t’, 把這個字符寫在你需要轉(zhuǎn)義的那個%號前就可以了;
SELECT * from app_info where appName LIKE '%/_%' ESCAPE '/';但是這種情況有沒有更高端點的解決辦法呢?能讓檢查你代碼的同事或領(lǐng)導(dǎo)對你刮目相看那種~~
當(dāng)然,下面我們就來看看MySQL的第二類模糊匹配方式 --- 內(nèi)置函數(shù)查詢
二、MySQL內(nèi)置函數(shù)檢索(locate,position,instr)
話接上文,通過內(nèi)置函數(shù)locate,position,instr進行匹配,相當(dāng)于Java中的str.contains()方法,返回的是匹配內(nèi)容在字符串中的位置,效率和可用性上都優(yōu)于通配符匹配。
SELECT * from app_info where INSTR(`appName`, '%') > 0;SELECT * from app_info where LOCATE('%', `appName`) > 0;SELECT * from app_info where POSITION( '%' IN `appName`) > 0;如上,三種內(nèi)置函數(shù)默認(rèn)都是:> 0,所以下列 > 0 可加可不加,加上可讀性更好。
OK,下面一起來看看這三種內(nèi)置函數(shù)的使用方法吧。
先明確一下,MySQL中的角標(biāo)從左往右是從1開始的,不像java最左邊第一位角標(biāo)是0,因此在MySQL中角標(biāo)為0時說明不存在。
2-1. LOCATE()函數(shù)
語法: LOCATE(substr,str)返回 substr 在 str 中第一次出現(xiàn)的位置。如果 substr 在 str 中不存在,返回值為 0,如果substr 在 str 中存在,返回值為:substr 在 str中第一次出現(xiàn)的位置。
注意:LOCATE(substr,str)與 POSITION(substr IN str)是同義詞,功能相同。
語法: LOCATE(substr, str, [pos])從位置pos開始的字符串str中第一次出現(xiàn)子字符串substr的位置。 如果substr不在str中,則返回0。 如果substr或str為NULL,則返回NULL。
SELECT locate('a', 'banana'); -- 2 SELECT locate('a', 'banana', 3); -- 4 SELECT locate('z', 'banana'); -- 0 SELECT locate(10, 'banana'); -- 0 SELECT locate(NULL , 'banana'); -- null SELECT locate('a' , NULL ); -- null實例:
-- 用LOCATE關(guān)鍵字進行模糊匹配,等同于:"like '%網(wǎng)%'"
SELECT * from app_info where LOCATE('網(wǎng)', `appName`) > 0;-- 用LOCATE關(guān)鍵字進行模糊匹配, 從第二個字符開始匹配"網(wǎng)",則"網(wǎng)易云游戲、網(wǎng)來商家"等數(shù)據(jù)就被過濾了
SELECT * from app_info where LOCATE('網(wǎng)', `appName`, 2) > 0;2-2. POSITION()方法
語法:POSITION(substr IN substr)這個方法可以理解為locate(substr,str)方法的別名,因為它和locate(substr,str)方法的作用是一樣的。
實例:
-- 用POSITION關(guān)鍵字進行模糊匹配,等同于:"like '%網(wǎng)%'"
SELECT * from app_info where POSITION( '網(wǎng)' IN `appName`);2-3. INSTR()方法
語法: INSTR(str,substr)返回字符串str中第一次出現(xiàn)子字符串substr的位置。INSTR()與LOCATE()的雙參數(shù)形式相同,只是參數(shù)的順序相反。
實例:
-- 用INSTR關(guān)鍵字進行模糊匹配,功能跟like一樣 ,等同于:"like '%網(wǎng)%'"
SELECT * from app_info where INSTR(`appName`, '網(wǎng)');-- instr函數(shù)作用,一般用于檢索某字符在某字符串中的位置,等同于:"like '%網(wǎng)%'"
SELECT * from app_info where INSTR(`appName`, '網(wǎng)') > 0;三、MySQL基于regexp、rlike的正則匹配查詢
MySQL中的regexp和rlike關(guān)鍵字屬于同義詞,功能相同。本文以regexp為準(zhǔn)。
REGEXP 不支持通配符"%、_",支持正則匹配規(guī)則,是一種更細(xì)力度且優(yōu)雅的匹配方式,一起來看看吧
-- 這里給出regexp包含的參數(shù)類型
-- REGEXP '網(wǎng)' 等同于 like '%網(wǎng)%'
SELECT * from app_info where appName REGEXP '網(wǎng)'; -- 等同于 SELECT * from app_info where appName like '%網(wǎng)%';3-1. regexp中的 OR : |
功能:可以搜索多個字符串之一,相當(dāng)于 or
-- 支持 "|" ‘或’符號,匹配包含“中國”或“互聯(lián)網(wǎng)”或“大學(xué)”的數(shù)據(jù),支持疊加多個
SELECT * from app_info where appName REGEXP '中國|互聯(lián)網(wǎng)|大學(xué)';-- 匹配同時命中“中國”、“網(wǎng)”的數(shù)據(jù)可以用".+"連接,代表中國xxxx網(wǎng),中間允許有任意個字符,順序不能反。
SELECT * from app_info where appName REGEXP '中國.+網(wǎng)';3-2. REGEXP中的正則匹配 : []
功能:匹配[]符號中幾個字符之一,支持解析正則表達式
-- 匹配包含英文字符的數(shù)據(jù),默認(rèn)不區(qū)分大小寫情況下
SELECT * from app_info where appName REGEXP '[a-z]';-- 跟like一樣,取反集加 "not REGEXP" 即可,下面不再贅述
SELECT * from app_info where appName not REGEXP '[a-z]';-- 匹配包含大寫英文字符的數(shù)據(jù),默認(rèn)忽略大小寫,需要加上"BINARY"關(guān)鍵字。如where appName REGEXP BINARY 'Hello'
-- 關(guān)于大小寫的區(qū)分:MySQL中正則表達式匹配(從版本3.23.4后)不區(qū)分大小寫 。SELECT * from app_info where appName REGEXP BINARY '[A-Z]';-- 匹配包含數(shù)字的數(shù)據(jù)
SELECT * from app_info where appName REGEXP '[0-9]';-- 匹配包含數(shù)字或英文的數(shù)據(jù),
SELECT * from app_info where appName REGEXP '[a-z0-9]';a-z、0-9都認(rèn)定為一個單位,不要加多余符號,前兩天就發(fā)現(xiàn)了一個特殊情況,很有意思的bug,跟他家分享一下
-- 之前寫查詢語句時多加了"|"符號,以為是"或",沒有在意,但萬萬沒想到,查出數(shù)量竟不同
一頭霧水,趕快看看差得是哪一條
-- 原來"|"符號也參與到了匹配中,認(rèn)定為一個單位。巧的是有一個數(shù)據(jù)為:“無線調(diào)音臺 | Wireless Mixer” 這個正好匹配上。臥槽了個DJ
SELECT * from app_info where appName REGEXP '[5|6|7]' and pid not in (SELECT pid from app_info where appName REGEXP '[567]');-- 查詢以5、6、7其中一個為開頭的數(shù)據(jù)
SELECT * from app_info where appName REGEXP '^[5|6|7]';溫馨提示:MySQL中,UTF-8的中文=3個字節(jié);GBK的中文=2個字節(jié)-- 查詢appName字節(jié)長度為10,任意內(nèi)容的數(shù)據(jù)
SELECT * from app_info where appName REGEXP '^.{10}$';- 查詢appName字節(jié)長度為10,且都為大寫英文的數(shù)據(jù),加上BINARY即可
SELECT * from app_info where appName REGEXP BINARY '^[A-Z]{10}$';-- 查詢version_name字節(jié)長度為6,且都為數(shù)字或"." 的數(shù)據(jù)
SELECT * from app_info where version_name REGEXP '^[0-9.]{6}$';-- 查詢version_name字節(jié)長度為6,且都為數(shù)字或"." 的數(shù)據(jù);要求首位為1,末位為7
SELECT * from app_info where version_name REGEXP '^1[0-9.]{4}7$' ;-- 查詢version_name字節(jié)長度為6位以上,且都為數(shù)字或"." 的數(shù)據(jù);要求首位為1,末位為7
SELECT * from app_info where version_name REGEXP '^1[0-9.]{4,}7$' ;-- 查詢version_name字節(jié)長度為 6 - 8 位,且都為數(shù)字或"." 的數(shù)據(jù);要求首位為1,末位為7
SELECT * from app_info where version_name REGEXP '^1[0-9.]{4,6}7$' ;-- 首位字符不是中文的
SELECT * from app_info where appName REGEXP '^[ -~]';-- 首位字符是中文的
SELECT * from app_info where appName REGEXP '^[^ -~]';-- 查詢不包含中文的數(shù)據(jù)
SELECT * from app_info where appName REGEXP '^([a-z]|[0-9]|[A-Z])+$';-- 以5或F開頭的,且包含英文的數(shù)據(jù)
SELECT * from app_info where appName REGEXP BINARY '^[5F][a-zA-Z].';特殊符號的匹配,例如.,需要加(注意是兩個斜杠),但是如果在[]中可以不加:
-- 匹配name中含有.的 select * from app_info where appName regexp '.'; -- 匹配name中含有.的 select * from app_info where appName regexp '[.]';3-3. 字符類匹配(posix)
mysql中有一些特殊含義的符號,可以代表不同類型的匹配:
-- 匹配name中含有數(shù)字的
select * from app_info where appName regexp '[[:digit:]]';其他的這種字符類還有:
這種字符類需要主要的外層要加一層[]。
3-4. [:<:]和[:>:]
上面的字符類中有兩個比較特殊的,這兩個是關(guān)于位置的,[:<:]匹配詞的開始,[:>:]匹配詞的結(jié)束,它們和 ^、$ 不同。
后者是匹配整個整體的開頭和結(jié)束,而前者是匹配一個單詞的開始和結(jié)束。
-- 只能匹配整體以a開頭的,例如abcd
select * from app_info where appName regexp '^a';-- 能匹配整體以a開頭的,也能匹配中間的單詞以a開頭,如:dance after。
select * from app_info where appName regexp '[[:<:]]a';[[:<:]] 、 [[:>:]] 分別匹配一個單詞開頭和結(jié)尾的空的字符串,這個單詞開頭和結(jié)尾都不是包含在alnum中的字符也不能是下劃線。
select "a word a" REGEXP "[[:<:]]word[[:>:]]"; -- 1(表示匹配) select "a xword a" REGEXP "[[:<:]]word[[:>:]]"; -- 0(表示不匹配) select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -- 1(表示匹配)四、總結(jié)
好啦,本篇文章就到這里了,能看到這里的都是有緣人,希望本文能幫助到你對MySQL的理解更進一步。請不要吝嗇手中的贊呦。謝謝支持!
總結(jié)
以上是生活随笔為你收集整理的c3p0 参数 模糊查询_MySQL模糊查询用法大全(正则、通配符、内置函数等)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梅雨季节装还是不装对症下药是装修关键
- 下一篇: 公职人员隐名买房有影响吗