一般寫法:
SELECT * FROM `table` WHERE `name` like '%Tom%';
根據(jù)"最左匹配"原則,將上面的sql改變成
SELECT * FROM `table` WHERE `name` like 'Tom%';
這時(shí)候可以看見sql走了索引(后通配 走索引治专,前通配 走全表)卖陵,但是根據(jù)“最左匹配”原則CatTom是匹配不到的。
因此我們使用其他的模糊查詢寫法:
函數(shù)式寫法:
1.LOCATE
1.1.普通用法: locate() 只要找到返回的結(jié)果都大于0(即使是查詢的內(nèi)容就是最開始部分)张峰,沒有查找到才返回0赶促;
SELECT * FROM `table` WHERE LOCATE('ab', `remarks`)>0;
1.2. 指定其實(shí)位置:
SELECT * FROM `table` WHERE LOCATE('ab', `remarks`,1);
SELECT * FROM `table` WHERE LOCATE('ab', `remarks`,2);
LOCATE('substr',str,pos)方法,返回查詢字段在被查詢下的索引。第一個(gè)為需要查詢的內(nèi)容挟炬,第二個(gè)為字段名稱,第三個(gè)代表第幾個(gè)匹配(1就是返回第一個(gè)匹配到的值嗦哆,5就是第5個(gè)匹配到的值谤祖,最大不能超過最后一個(gè)匹配的索引,不然就是返回0老速。
remarks
,2) 是從字段remarks中第二索引位置開始查找ab,因此id=1的數(shù)據(jù)不能匹配到橘券。
2.POSITION('substr' IN field)方法
position可以看做是locate的別名额湘,功能跟locate一樣
SELECT * FROM `table` WHERE POSITION('Tom' IN `name`);
3.INSTR(str,'substr')方法
SELECT * FROM `table` WHERE INSTR(`name`, 'Tom' )>0 ;
功能跟locate一樣,唯一不同的是方法參數(shù)位置不同
4.FIND_IN_SET(str1,str2)方法
SELECT * FROM `table` WHERE FIND_IN_SET('Tom',`name`)>0;
返回str2中str1所在的位置索引卿吐,其中str2必須以","分割開。
輸出結(jié)果