国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL實現模糊查詢(REGEXP,LIKE)有2種方式

2024-07-24 12:37:03
字體:
來源:轉載
供稿:網友

在mysql中實現模糊查詢有兩種方法一種是LIKE/NOT LIKE,另一種是REGEXP/NOT REGEXP方法,下面我來給大家介紹它們的用法,希望此教程對各位同學會有所幫助.

一是用LIKE/NOT LIKE,二是用REGEXP/NOT REGEXP,或RLIKE/NOT RLIKE,它們是同義詞.

第一種:標準的SQL模式匹配.

它有2種通配符:“_”和“%”,“_”匹配任意單個字符,而“%”匹配任意多個字符(包括0個),舉例如下:

SELECT * FROM table_name WHERE column_name LIKE 'm%'; #查詢某字段中以???m或M開頭的所有記錄

????SELECT * FROM table_name WHERE column_name LIKE '%m%'; #查詢某字段中包含???m或M的所有記錄

?SELECT * FROM table_name WHERE column_name LIKE '%m'; #查詢某字段中以m或M結尾的所有記錄

SELECT * FROM table_name WHERE column_name LIKE '_m_'; #查詢某字段中3個字符且m或M在中間的所有記錄

如果我們想查詢包含通配符的字符串該怎么辦呢?比如,50%或_get.

答案就是:轉義,可以用來直接轉義,或用ESCAPE定義轉義字符來進行轉義,都只是轉義跟在后面的一個字符,例如,代碼如下:

?SELECT * FROM table_name WHERE column_name LIKE '%50%%'; /*第2個%被轉義,查詢某字段包含50%的所有記錄*/

????SELECT * FROM table_name WHERE column_name LIKE '%50/%%' ESCAPE '/'; #第2個%被轉義

SELECT * FROM table_name WHERE column_name LIKE '%_get%' ESCAPE '/'; /*“_”被轉義,查詢某字段包含_get的所有記錄*/

第二種:使用擴展正則表達式的模式匹配.

先來看下擴展正則表達式一些字符的含義:

“.”:匹配任意單個字符.

“?”:匹配前面的子表達式0次或1次.

“+”:匹配前面的子表達式1次或多次.

“*”:匹配前面的子表達式0次或多次,x*,表示0個或多個x字符;[0-9]*,匹配任何數量的數字.

“^”:表示匹配開始位置.

“$”:表示匹配結束位置.

“[]”:表示一個集合,[hi],表示匹配h或i;[a-d],表示匹配a、b、c、d中任一個.

“{}”:表示重復的次數。8{5},表示匹配5個8,即88888;[0-9]{5,11},表示匹配5到11個數字。

再來看個例子,代碼如下:

SELECT * FROM table_name WHERE column_name REGEXP '^50%{1,3}';

/*查詢某字段中以50%、50%%或50%%%開頭的所有記錄*/

方法三,如果要更高級的就是fulltext全文搜索了,下面我們通過實例來一步步把全文檢索的過程解釋清楚,首頁我們建立表與初始化數據,Sql代碼如下:

  1. CREATE TABLE IF NOT EXISTS `category` (         
  2.   `id` int(10) NOT NULL auto_increment,         
  3.   `fid` int(10) NOT NULL,         
  4.   `catname` char(255) NOT NULL,         
  5.   `addtime` char(10) NOT NULL,         
  6.   PRIMARY KEY  (`id`),         
  7.   FULLTEXT KEY `catname` (`catname`)         
  8. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
  9.         
  10. INSERT INTO `category` (`id`, `fid`, `catname`, `addtime`) VALUES        
  11. (1, 0, 'welcome to you!''1263363380'),         
  12. (2, 0, 'hello phpjs,you are welcome''1263363416'),         
  13. (3, 0, 'this is the fan site of you''1263363673');        
  14.      
  15. CREATE TABLE IF NOT EXISTS `category` ( `id` int(10) NOT NULL auto_increment, `fid` int(10) NOT NULL, `catname` char(255) NOT NULL, `addtime` char(10) NOT NULLPRIMARY KEY (`id`), FULLTEXT KEY `catname` (`catname`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; INSERT INTO `category` (`id`, `fid`, `catname`, `addtime`) VALUES (1, 0, 'welcome to you!''1263363380'), (2, 0, 'hello phpjs,you are welcome''1263363416'), (3, 0, 'this is the fan site of you''1263363673'); 

在具體實例之前,我們分析下msyql全文檢索的語法:函數 MATCH() 對照一個文本集(包含在一個 FULLTEXT 索引中的一個或多個列的列集)執行一個自然語言搜索一個字符串。搜索字符串做為 AGAINST() 的參數被給定。搜索以忽略字母大小寫的方式執行。說白了就是MATCH給定匹配的列(fulltext類型索引),AGAINST給定要匹配的字符串,多個用空格、標點分開,mysql會自動分隔.

SQL代碼如下:SELECT * FROM `category` WHERE MATCH(catname) AGAINST('phpjs')

返回結果,代碼如下:

id  fid  catname   addtime  

2   0    hello phpjs,you are welcome 1263363416

匹配出了含有phpjs關鍵字的行數據.

2、SQL代碼如下:SELECT * FROM `category` WHERE MATCH (catname) AGAINST ('this') //Vevb.com

按照上面的思路,第三行數據含有this,因此應該可以匹配出第三行數據的,但事實卻奇怪得很,返回結果為空,為什么呢?

原來是mysql指定了最小字符長度,默認是4,必須要匹配大于4的才會有返回結果,可以用SHOW VARIABLES LIKE 'ft_min_word_len' 來查看指定的字符長度,也可以在mysql配置文件my.ini 更改最小字符長度,方法是在my.ini 增加一行比如:ft_min_word_len = 2,改完后重啟mysql即可。

3、這里我們要確定把最小字符改為2了,因為3行記錄都有‘you’,因此心想,匹配‘you’就可以返回所有結果了.

SQL代碼如下:SELECT * FROM `category` WHERE MATCH (catname) AGAINST ('you')  

返回結果還是為空,大跌眼鏡了吧,這又是為什么呢?

原來mysql在集和查詢中的對每個合適的詞都會先計算它們的權重,一個出現在多個文檔中的詞將有較低的權重(可能甚至有一個零權重),因為在這個特定的集中,它有較低的語義值,否則,如果詞是較少的,它將得到一個較高的權重,mysql默認的閥值是50%,上面‘you’在每個文檔都出現,因此是100%,只有低于50%的才會出現在結果集中.

4、有人會想,我不去管權重大小,只要有匹配的就給我返回結果集中,那么該如何做呢?

mysql到 4.0.1 時,可以使用 IN BOOLEAN MODE 修飾語來執行一個邏輯全文搜索,SQL代碼如下:

SELECT * FROM `category` WHERE MATCH(catname) AGAINST('you' IN BOOLEAN MODE)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高唐县| 开鲁县| 颍上县| 嘉义市| 牙克石市| 龙川县| 蒙阴县| 肃北| 赣州市| 察雅县| 宾川县| 彩票| 含山县| 汕尾市| 莆田市| 吉安县| 唐山市| 年辖:市辖区| 阿克陶县| 刚察县| 宝山区| 洪江市| 会泽县| 深州市| 江都市| 鄢陵县| 德保县| 繁昌县| 尉氏县| 徐汇区| 石柱| 江油市| 团风县| 呼和浩特市| 古田县| 府谷县| 峨边| 丰顺县| 涿州市| 家居| 台北县|