1. 程式人生 > 資料庫 >MySQL高效模糊搜尋之內建函式locate instr position find_in_set使用詳解

MySQL高效模糊搜尋之內建函式locate instr position find_in_set使用詳解

常用的一共有4個方法,如下:

1.使用locate()方法

普通用法:

SELECT`column`from`table`wherelocate('keyword',`condition`)>0

類似於java的indexOf();

不過locate()只要找到返回的結果都大於0(即使是查詢的內容就是最開始部分),沒有查詢到才返回0;

指定起始位置:

SELECT LOCATE('bar','foobarbar',5);(從foobarbar的第五個位置開始查詢)

2.使用instr()函式(據說是locate()的別名函式)

SELECT `column` from `table` where instr(`condition`,‘keyword')>0

唯一不同的是查詢內容的位置不同

3.使用position()方法,(據說也是locate()方法的別名函式,功能一樣)

SELECT `column` from `table` where position(‘keyword' IN `condition`)

不過它不再是通過返回值來判斷,而是使用關鍵字in

4.使用find_in_set()函式

如:find_in_set(str,strlist),strlist必須要是以逗號分隔的字串

如果字串str是在的strlist組成的N子串的字串列表,返回值的範圍為1到N

SQL>SELECTFIND_IN_SET('b','a,b,c,d');
---------------------------------------------------------+
|SELECTFIND_IN_SET('b',d')|
---------------------------------------------------------+
|2|
---------------------------------------------------------+
1rowinset(0.00sec)

總結:locate、position和instr的差別只是引數的位置不同,同時locate多一個起始位置的引數外,兩者是一樣的。

find_in_set()比較特殊,但它們都是返回要查詢的子字串在指定字串中的位置。

速度上前3個要比用like稍快一點。(不過這四個函式都不能使用索引)

下面為再為大家介紹一下Mysql中Like的使用方法

MySQL的like語句中的萬用字元:百分號、下劃線和escape

%:表示任意個或多個字元。可匹配任意型別和長度的字元。

Sql程式碼

select * from user where username like '%huxiao';

select * from user where username like 'huxiao%';

select * from user where username like '%huxiao%';

另外,如果需要找出u_name中既有“三”又有“貓”的記錄,請使用and條件

SELECT * FROM [user] WHERE u_name LIKE ‘%三%' AND u_name LIKE ‘%貓%'

若使用 SELECT * FROM [user] WHERE u_name LIKE ‘%三%貓%'

雖然能搜尋出“三腳貓”,但不能搜尋出符合條件的“張貓三”。

_:表示任意單個字元。匹配單個任意字元,它常用來限制表示式的字元長度語句:(可以代表一箇中文字元)

Sql程式碼

select * from user where username like '_';

select * from user where username like 'huxia_';

select * from user where username like 'h_xiao';

如果我就真的要查%或者_,怎麼辦呢?使用escape,轉義字元後面的%或_就不作為萬用字元了,注意前面沒有轉義字元的%和_仍然起萬用字元作用

Sql程式碼

select username from gg_user where username like '%xiao/_%' escape '/';

select username from gg_user where username like '%xiao/%%' escape '/';

MySQL 萬用字元

SQL的模式匹配允許你使用“_”匹配任何單個字元,而“%”匹配任意數目字元(包括零個字元)。在 MySQL中,SQL的模式預設是忽略大小寫的。下面顯示一些例子。

注意在你使用SQL模式時,你不能使用=或!=;而使用LIKE或NOT LIKE比較操作符。

為了找出以“b”開頭的名字:

mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

為了找出以“fy”結尾的名字:

mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+

為了找出包含一個“w”的名字:

mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+

為了找出包含正好5個字元的名字,使用“_”模式字元:

mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+

由MySQL提供的模式匹配的其他型別是使用擴充套件正則表示式。當你對這類模式進行匹配測試時,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它們是同義詞)。

擴充套件正則表示式的一些字元是:

“.”匹配任何單個的字元。

一個字元類“[...]”匹配在方括號內的任何字元。

例如,“[abc]”匹配“a”、“b”或“c”。為了命名字元的一個範圍,使用一個“-”。“[a-z]” 匹配任何小寫字母,而“[0-9]”匹配任何數字。

“*”匹配零個或多個在它前面的東西。

例如,“x*”匹配任何數量的“x”字元,“[0-9]*”匹配的任何數量的數字,而“.*”匹配任何數量的任何東西。

正則表示式是區分大小寫的,但是如果你希望,你能使用一個字元類匹配兩種寫法。

例如,“[aA]”匹配小寫或大寫的“a”而“[a-zA-Z]”匹配兩種寫法的任何字母。

如果它出現在被測試值的任何地方,模式就匹配(只要他們匹配整個值,SQL模式匹配)。

為了定位一個模式以便它必須匹配被測試值的開始或結尾,在模式開始處使用“^”或在模式的結尾用“$”。

為了說明擴充套件正則表示式如何工作,上面所示的LIKE查詢在下面使用REGEXP重寫:

為了找出以“b”開頭的名字,使用“^”匹配名字的開始並且“[bB]”匹配小寫或大寫的“b”:

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

為了找出以“fy”結尾的名字,使用“$”匹配名字的結尾:

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+

為了找出包含一個“w”的名字,使用“[wW]”匹配小寫或大寫的“w”:

mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+

既然如果一個正規表示式出現在值的任何地方,其模式匹配了,就不必再先前的查詢中在模式的兩方面放置一個萬用字元以使得它匹配整個值,就像如果你使用了一個SQL模式那樣。

為了找出包含正好5個字元的名字,使用“^”和“$”匹配名字的開始和結尾,和5個“.”例項在兩者之間:

mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+

你也可以使用“{n}”“重複n次”操作符重寫先前的查詢:

mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+

以上是Mysql模糊搜尋方法Like的使用方法,與前locate instr position這三個內建函式相比效能上要慢些,無論哪種模糊搜尋在查詢時都會消耗大量伺服器資源所以在實際工作中我們應儘量少用模糊搜尋