主頁(yè) > 知識(shí)庫(kù) > MySQL模糊查詢用法大全(正則、通配符、內(nèi)置函數(shù))

MySQL模糊查詢用法大全(正則、通配符、內(nèi)置函數(shù))

熱門標(biāo)簽:常州電銷外呼系統(tǒng)一般多少錢 房產(chǎn)智能外呼系統(tǒng)品牌 福州呼叫中心外呼系統(tǒng)哪家好 地圖標(biāo)注被騙三百怎么辦 天智外呼系統(tǒng) 云南語(yǔ)音外呼系統(tǒng)平臺(tái) 北京人工外呼系統(tǒng)價(jià)錢 沃克斯電梯外呼線路圖 400電話鄭州申請(qǐng)
SELECT * from table where username like '%陳哈哈%' and hobby like '%牛逼'

這是一條我們?cè)贛ySQL中常用到的模糊查詢方法,通過(guò)通配符%來(lái)進(jìn)行匹配,其實(shí),這只是冰山一角,在MySQL中,支持模糊匹配的方法有很多,且各有各的優(yōu)點(diǎn)。好了,今天讓我?guī)Т蠹乙黄鹣破餗ySQL的小裙子,看一看模糊查詢下面還藏著多少鮮為人知的好東西。

一、MySQL通配符模糊查詢(%,_)

1-1. 通配符的分類

  • "%" 百分號(hào)通配符: 表示任何字符出現(xiàn)任意次數(shù) (可以是0次)。
  • "_" 下劃線通配符:表示只能匹配單個(gè)字符,不能多也不能少,就是一個(gè)字符。當(dāng)然,也可以like "陳____",數(shù)量不限。
  • like操作符:LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配進(jìn)行比較;但如果like后面沒(méi)出現(xiàn)通配符,則在SQL執(zhí)行優(yōu)化時(shí)將 like 默認(rèn)為 “=”執(zhí)行

注意: 如果在使用like操作符時(shí),后面沒(méi)有使用通用匹配符(%或_),那么效果是和“=”一致的。在SQL執(zhí)行優(yōu)化時(shí)查詢優(yōu)化器將 like 默認(rèn)為 “=”執(zhí)行,SELECT * FROM movies WHERE movie_name like '唐伯虎';只能匹配movie_name=“唐伯虎”的結(jié)果,而不能匹配像“唐伯虎點(diǎn)秋香”或“唐伯虎點(diǎn)香煙”這樣的結(jié)果.

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)”字開(kāi)頭的數(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)約車司機(jī)端、網(wǎng)絡(luò)約車平臺(tái)"

SELECT * from app_info where appName like '%網(wǎng)%車%';

2) _ 通配符:

-- 查詢以“網(wǎng)”為結(jié)尾的,長(zhǎng)度為三個(gè)字的數(shù)據(jù),如:"鏈家網(wǎng)",

SELECT * from app_info where appName like '__網(wǎng)';

注意:'%__網(wǎng)、__%網(wǎng)'  等同于 '%網(wǎng)'

-- 查詢前三個(gè)字符為XX網(wǎng),后面任意匹配,如:"城通網(wǎng)盤、模具網(wǎng)平臺(tái)"

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)_車%';

注意事項(xiàng):   

注意大小寫(xiě),在使用模糊匹配時(shí),也就是匹配文本時(shí),MySQL默認(rèn)配置是不區(qū)分大小寫(xiě)的。當(dāng)你使用別人的MySQL數(shù)據(jù)庫(kù)時(shí),要注意是否區(qū)分大小寫(xiě),是否區(qū)分大小寫(xiě)取決于用戶對(duì)MySQL的配置方式.如果是區(qū)分大小寫(xiě),那么像Test12這樣記錄是不能被"test__"這樣的匹配條件匹配的。
注意尾部空格,"%test"是不能匹配"test "這樣的記錄的。
注意NULL,%通配符可以匹配任意字符,但是不能匹配NULL,也就是說(shuō)SELECT * FROM blog where title_name like '%';是匹配不到title_name為NULL的的記錄。

1-3. 技巧與建議:

正如所見(jiàn),MySQL的通配符很有用。但這種功能是有代價(jià)的:通配符搜索的處理一般要比前面討論的其他搜索所花時(shí)間更長(zhǎng),消耗更多的內(nèi)存等資源。這里給出一些使用通配符要記住的技巧。

  • 不要過(guò)度使用通配符。如果其他操作符能達(dá)到相同的目的,應(yīng)該使用其他操作符。
  • 在確實(shí)需要使用通配符時(shí),除非絕對(duì)有必要,否則不要把它們用在搜索模式的開(kāi)始處。因?yàn)镸ySQL在where后面的執(zhí)行順序是從左往右執(zhí)行的,如果把通配符置于搜索模式的開(kāi)始處(最左側(cè)),搜索起來(lái)是最慢的(因?yàn)橐獙?duì)全庫(kù)進(jìn)行掃描)。
  • 仔細(xì)注意通配符的位置。如果放錯(cuò)地方,可能不會(huì)返回想要的數(shù)據(jù)。

有細(xì)心地朋友會(huì)發(fā)現(xiàn),如果數(shù)據(jù)中有“%”、“_”等符號(hào),那豈不是和通配符沖突了?

SELECT * from app_info where appName LIKE '%%%';
SELECT * from app_info where appName LIKE '%_%';

確實(shí)如此,上面面兩條SQL語(yǔ)句查詢的都是全表數(shù)據(jù),而不是帶有"%"和"_"的指定數(shù)據(jù)。這里需要加 ESCAPE 關(guān)鍵字進(jìn)行轉(zhuǎn)義。

如下,ESCAPE 后面跟著一個(gè)字符,里面寫(xiě)著什么,MySQL就把那個(gè)符號(hào)當(dāng)做轉(zhuǎn)義符,一般我就寫(xiě)成"/";然后就像 C語(yǔ)言中轉(zhuǎn)義字符一樣 例如 ‘\n','\t', 把這個(gè)字符寫(xiě)在你需要轉(zhuǎn)義的那個(gè)%號(hào)前就可以了;

SELECT * from app_info where appName LIKE '%/_%' ESCAPE '/'; 

但是這種情況有沒(méi)有更高端點(diǎn)的解決辦法呢?能讓檢查你代碼的同事或領(lǐng)導(dǎo)對(duì)你刮目相看那種~~

當(dāng)然,下面我們就來(lái)看看MySQL的第二類模糊匹配方式 --- 內(nèi)置函數(shù)查詢

二、MySQL內(nèi)置函數(shù)檢索(locate,position,instr)

話接上文,通過(guò)內(nèi)置函數(shù)locate,position,instr進(jìn)行匹配,相當(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,下面一起來(lái)看看這三種內(nèi)置函數(shù)的使用方法吧。

先明確一下,MySQL中的角標(biāo)從左往右是從1開(kāi)始的,不像java最左邊第一位角標(biāo)是0,因此在MySQL中角標(biāo)為0時(shí)說(shuō)明不存在。

2-1. LOCATE()函數(shù)

語(yǔ)法: LOCATE(substr,str)

返回 substr 在 str 中第一次出現(xiàn)的位置。如果 substr 在 str 中不存在,返回值為 0,如果substr 在 str 中存在,返回值為:substr 在 str中第一次出現(xiàn)的位置。
 

注意:LOCATE(substr,str)與 POSITION(substr IN str)是同義詞,功能相同。

語(yǔ)法: LOCATE(substr, str, [pos])

從位置pos開(kāi)始的字符串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

實(shí)例:

-- 用LOCATE關(guān)鍵字進(jìn)行模糊匹配,等同于:"like '%網(wǎng)%'"

SELECT * from app_info where LOCATE('網(wǎng)', `appName`) > 0;

-- 用LOCATE關(guān)鍵字進(jìn)行模糊匹配, 從第二個(gè)字符開(kāi)始匹配"網(wǎng)",則"網(wǎng)易云游戲、網(wǎng)來(lái)商家"等數(shù)據(jù)就被過(guò)濾了

SELECT * from app_info where LOCATE('網(wǎng)', `appName`, 2) > 0;

2-2. POSITION()方法

語(yǔ)法:POSITION(substr IN substr)

這個(gè)方法可以理解為locate(substr,str)方法的別名,因?yàn)樗蚻ocate(substr,str)方法的作用是一樣的。

實(shí)例:

-- 用POSITION關(guān)鍵字進(jìn)行模糊匹配,等同于:"like '%網(wǎng)%'" 

SELECT * from app_info where POSITION( '網(wǎng)' IN `appName`);

2-3. INSTR()方法

語(yǔ)法: INSTR(str,substr)

返回字符串str中第一次出現(xiàn)子字符串substr的位置。INSTR()與LOCATE()的雙參數(shù)形式相同,只是參數(shù)的順序相反。    

實(shí)例:

-- 用INSTR關(guān)鍵字進(jì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)雅的匹配方式,一起來(lái)看看吧

-- 這里給出regexp包含的參數(shù)類型

參數(shù)類型 作用
(^) 匹配字符串的開(kāi)始位置,如“^a”表示以字母a開(kāi)頭的字符串。
($) 匹配字符串的結(jié)束位置,如“X^”表示以字母X結(jié)尾的字符串。
(.) 這個(gè)字符就是英文下的點(diǎn),它匹配任何一個(gè)字符,包括回車、換行等。
(*) 星號(hào)匹配0個(gè)或多個(gè)字符,在它之前必須有內(nèi)容。如:select * from table where name regexp 'ba*'(可以命中“baaa”)
(+)

加號(hào)匹配1個(gè)或多個(gè)字符,在它之前也必須有內(nèi)容。加號(hào)跟星號(hào)的用法類似,只是星號(hào)允許出現(xiàn)0次,加號(hào)則必須至少出現(xiàn)一次。

(?) 問(wèn)號(hào)匹配0次或1次。
{n} 匹配指定n個(gè)
{n,} 匹配不少于n個(gè)
{n,m} 匹配n-m個(gè)

-- 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 : |   

功能:可以搜索多個(gè)字符串之一,相當(dāng)于 or

-- 支持 "|" ‘或'符號(hào),匹配包含“中國(guó)”或“互聯(lián)網(wǎng)”或“大學(xué)”的數(shù)據(jù),支持疊加多個(gè)

SELECT * from app_info where appName REGEXP '中國(guó)|互聯(lián)網(wǎng)|大學(xué)';

-- 匹配同時(shí)命中“中國(guó)”、“網(wǎng)”的數(shù)據(jù)可以用".+"連接,代表中國(guó)xxxx網(wǎng),中間允許有任意個(gè)字符,順序不能反。

SELECT * from app_info where appName REGEXP '中國(guó).+網(wǎng)';

3-2. REGEXP中的正則匹配 : [] 

功能:匹配[]符號(hào)中幾個(gè)字符之一,支持解析正則表達(dá)式

-- 匹配包含英文字符的數(shù)據(jù),默認(rèn)不區(qū)分大小寫(xiě)情況下

SELECT * from app_info where appName REGEXP '[a-z]';

-- 跟like一樣,取反集加 "not REGEXP" 即可,下面不再贅述

SELECT * from app_info where appName not REGEXP '[a-z]';

-- 匹配包含大寫(xiě)英文字符的數(shù)據(jù),默認(rèn)忽略大小寫(xiě),需要加上"BINARY"關(guān)鍵字。如where appName REGEXP BINARY 'Hello'

-- 關(guān)于大小寫(xiě)的區(qū)分:MySQL中正則表達(dá)式匹配(從版本3.23.4后)不區(qū)分大小寫(xiě) 。

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)定為一個(gè)單位,不要加多余符號(hào),前兩天就發(fā)現(xiàn)了一個(gè)特殊情況,很有意思的bug,跟他家分享一下

-- 之前寫(xiě)查詢語(yǔ)句時(shí)多加了"|"符號(hào),以為是"或",沒(méi)有在意,但萬(wàn)萬(wàn)沒(méi)想到,查出數(shù)量竟不同

SELECT * from app_info where appName REGEXP '[567]'; -- 87條
SELECT * from app_info where appName REGEXP '[5|6|7]'; -- 88條

一頭霧水,趕快看看差得是哪一條

-- 原來(lái)"|"符號(hào)也參與到了匹配中,認(rèn)定為一個(gè)單位。巧的是有一個(gè)數(shù)據(jù)為:“無(wú)線調(diào)音臺(tái) | Wireless Mixer” 這個(gè)正好匹配上。臥槽了個(gè)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其中一個(gè)為開(kāi)頭的數(shù)據(jù)

SELECT * from app_info where appName REGEXP '^[5|6|7]';

-- 查詢以5、6、7其中一個(gè)為結(jié)尾的數(shù)據(jù)

SELECT * from app_info where appName REGEXP '[5|6|7]$';

溫馨提示:MySQL中,UTF-8的中文=3個(gè)字節(jié);GBK的中文=2個(gè)字節(jié)

-- 查詢appName字節(jié)長(zhǎng)度為10,任意內(nèi)容的數(shù)據(jù)

SELECT * from app_info where appName REGEXP '^.{10}$';

-- 查詢appName字節(jié)長(zhǎng)度為10,且都為英文的數(shù)據(jù)

SELECT * from app_info where appName REGEXP '^[a-z]{10}$' ;

-- 查詢appName字節(jié)長(zhǎng)度為10,且都為大寫(xiě)英文的數(shù)據(jù),加上BINARY即可

SELECT * from app_info where appName REGEXP BINARY '^[A-Z]{10}$';

-- 查詢version_name字節(jié)長(zhǎng)度為6,且都為數(shù)字或"." 的數(shù)據(jù)

SELECT * from app_info where version_name REGEXP '^[0-9.]{6}$';

-- 查詢version_name字節(jié)長(zhǎng)度為6,且都為數(shù)字或"." 的數(shù)據(jù);要求首位為1

SELECT * from app_info where version_name REGEXP '^1[0-9.]{5}$' ;

-- 查詢version_name字節(jié)長(zhǎng)度為6,且都為數(shù)字或"." 的數(shù)據(jù);要求首位為1,末位為7

SELECT * from app_info where version_name REGEXP '^1[0-9.]{4}7$' ;

-- 查詢version_name字節(jié)長(zhǎng)度為6位以上,且都為數(shù)字或"." 的數(shù)據(jù);要求首位為1,末位為7

SELECT * from app_info where version_name REGEXP '^1[0-9.]{4,}7$' ;

-- 查詢version_name字節(jié)長(zhǎng)度為 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開(kāi)頭的,且包含英文的數(shù)據(jù)

SELECT * from app_info where appName REGEXP BINARY '^[5F][a-zA-Z].';

特殊符號(hào)的匹配,例如.,需要加\\(注意是兩個(gè)斜杠),但是如果在[]中可以不加:

-- 匹配name中含有.的
select * from app_info where appName regexp '\\.';
-- 匹配name中含有.的
select * from app_info where appName regexp '[.]';

3-3. 字符類匹配(posix)

mysql中有一些特殊含義的符號(hào),可以代表不同類型的匹配:

-- 匹配name中含有數(shù)字的

select * from app_info where appName regexp '[[:digit:]]';

其他的這種字符類還有:

字符類 作用
[:alnum:] 匹配字面和數(shù)字字符。(等同于[A~Za~z0~9])
[:alpha:] 匹配字母字符。(等同于[A~Za~z])
[:blank:] 匹配空格或制表符(同[\\\t])
[:cntrl:] 匹配控制字符(ASCII0到37和127)
[:digit:] 匹配十進(jìn)制數(shù)字。(等同于[0-9])
[:graph:] 匹配ASCII碼值范圍33~126的字符。與[:print:]相似,但不包括空格字符
[:print:] 任何可打印字符
[:lower:] 匹配小寫(xiě)字母,等同于[a-z]
[:upper:] 匹配大寫(xiě)字母,等同于[A-Z]
[:space:] 匹配空白字符(同[\\f\\n\\r\\t\\v])
[:xdigit:] 匹配十六進(jìn)制數(shù)字。等同于[0-9A-Fa-f]

這種字符類需要主要的外層要加一層[]。

3-4. [::]和[:>:]

上面的字符類中有兩個(gè)比較特殊的,這兩個(gè)是關(guān)于位置的,[::]匹配詞的開(kāi)始,[:>:]匹配詞的結(jié)束,它們和 ^、$ 不同。

后者是匹配整個(gè)整體的開(kāi)頭和結(jié)束,而前者是匹配一個(gè)單詞的開(kāi)始和結(jié)束。

-- 只能匹配整體以a開(kāi)頭的,例如abcd

select * from app_info where appName regexp '^a';

-- 能匹配整體以a開(kāi)頭的,也能匹配中間的單詞以a開(kāi)頭,如:dance after。

select * from app_info where appName regexp '[[::]]a';

[[::]] 、 [[:>:]] 分別匹配一個(gè)單詞開(kāi)頭和結(jié)尾的空的字符串,這個(gè)單詞開(kāi)頭和結(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é)

好啦,本篇文章就到這里了,能看到這里的都是有緣人,希望本文能幫助到你對(duì)MySQL的理解更進(jìn)一步。更多相關(guān)MySQL模糊查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • mysql中模糊查詢的四種用法介紹
  • MySql like模糊查詢通配符使用詳細(xì)介紹
  • 淺談MySQL模糊查詢中通配符的轉(zhuǎn)義
  • mysql中使用instr進(jìn)行模糊查詢方法介紹
  • PHP+MySQL實(shí)現(xiàn)模糊查詢員工信息功能示例
  • PHP MYSQL實(shí)現(xiàn)登陸和模糊查詢兩大功能
  • mysql模糊查詢like與REGEXP的使用詳細(xì)介紹
  • MySQL Like模糊查詢速度太慢如何解決
  • MySQL模糊查詢語(yǔ)句整理集合
  • Mysql| 使用通配符進(jìn)行模糊查詢?cè)斀?like,%,_)

標(biāo)簽:沈陽(yáng) 拉薩 鹽城 黔東 沈陽(yáng) 珠海 移動(dòng) 徐州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL模糊查詢用法大全(正則、通配符、內(nèi)置函數(shù))》,本文關(guān)鍵詞  MySQL,模糊,查詢,用法,大全,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL模糊查詢用法大全(正則、通配符、內(nèi)置函數(shù))》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于MySQL模糊查詢用法大全(正則、通配符、內(nèi)置函數(shù))的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章