VB6基本資料庫應用(八):模糊搜尋與基於範圍的搜尋
同系列的第八篇,上一篇在:http://blog.csdn.net/jiluoxingren/article/details/48402885
VB6基本資料庫應用(八):模糊搜尋與基於範圍的搜尋
前面的幾章講解了搜尋的許多複雜的用法。然而提供再多的條件,還是無法滿足我們的需求。因為我們不一定能夠獲得一個精確的條件來對資料進行檢索。所以如果能夠提供模糊的匹配,能使我們的搜尋更加容易。
不等條件
此前我們使用的條件都是用“=”來確定的,實際上對於數字型別(包括時間與日期)的資料,我們更多的是使用“>”(大於),“<”(小於),“>=”(大於等於),“<=”(小於等於),“<>”(不等於)。
例如我們可以按上一篇的方法,新增一個年齡Age欄位,資料型別是數字;還有一個建立日期CreateDate欄位,資料型別是日期與時間。如下圖。
然後填寫好資料,所需的資料如下,這一章的內容都使用這些資料。其中藍色的資料是以前的。
StudentID |
StudentName |
PhoneNo |
Age |
CreateDate |
123456 |
林則徐 |
13888080088 |
21 |
2015/9/25 |
562893 |
葉劍英 |
13920171101 |
15 |
2015/7/13 |
662356 |
黃飛鴻 |
13427103456 |
18 |
2015/9/4 |
785714 |
黃飛鴻 |
13978569013 |
12 |
2015/9/7 |
736375 |
霍金 |
13739475815 |
23 |
2015/8/13 |
284626 |
賈伯斯 |
18382195632 |
22 |
2015/6/19 |
563992 |
陸遜 |
13795720163 |
19 |
2015/8/21 |
318264 |
喬森 |
15843956272 |
13 |
2015/5/30 |
248369 |
歐陽峰 |
19472747288 |
16 |
2015/7/16 |
473610 |
愛因斯坦 |
13329177473 |
25 |
2015/9/4 |
現在,我們可以來查詢年齡大於等於18歲的,就可以用如下的語句:
SELECT * FROM Student WHERE Age>=18
結果是顯而易見的。SQL語句的執行結果如下
其他比較符的用法也是一樣的。而且還可以與上一章所說的關係連線詞一同使用。
例如:要查詢15歲(包括)到21歲(不包括)之間的人,SQL可以這樣寫:
SELECT * FROM Student WHERE Age>=15 AND Age<21
查詢結果如下:
基於範圍的搜尋(1)
上面要查詢查詢15歲(包括)到21歲(不包括)之間的人,如果兩個數值都是包括的,我們就可以使用BETWEEN…AND語句來實現。其基本語法是
SELECT* FROM Student WHERE 欄位名 BETWEEN 數值1 AND 數值2
BETWEEN…AND語句相當於是下面的語句:
SELECT* FROM Student WHERE 欄位名>=數值1 AND 欄位名<=數值2
我們還可以在BETWEEN前面加NOT,來表示不在此範圍內。必須注意的是,加了NOT之後,兩個數值都是不包括的。如果加了NOT,就相當於下面的語句:
SELECT* FROM Student WHERE 欄位名<數值1 AND 欄位名>數值2
可以寫一下NOT的語句檢驗一下。如下:
SELECT * FROM Student WHERE Age NOT BETWEEN 15 AND 21
結果如下圖所示,可以發現15和21的都沒有出現在結果當中。而沒有NOT的情況則交給讀者自己去驗證了。
基於範圍的搜尋(2)
多個OR邏輯連線詞連線起來的條件可以用更簡單的方法來表示。現在先來溫習一下OR邏輯連線詞。例如現在需要電話號碼是19472747288(歐陽鋒),或15843956272(喬森),或17639284669,或18856350376的人。後面專門加了2個資料中沒有對應的人的電話。現在來看一下用OR邏輯連線詞如何書寫SQL語句:
SELECT * FROM Student WHERE PhoneNo=19472747288 OR PhoneNo =15843956272 OR PhoneNo=17639284669 OR PhoneNo=18856350376
語句執行的結果當然是歐陽鋒和喬森這兩個人的記錄顯示出來。然而,這樣的SQL語句非常冗長,PhoneNo重複出現好多次,看起來也不好看。所以我們可以使用IN語句來實現。
IN語句的基本語法是:
SELECT* FROM Student WHERE 欄位名 IN(值1,值2,值3……)
這個語法的值1,值2……不要求是數值,BETWEEN…AND之所以強調是數值,是因為只有數值才有大小的比較,但是IN代表的是欄位的資料與值1,或值2,或值3……相等,所以既然是相等的話,任何資料都是可以的。
(值1,值2,值3)構成了一個範圍,與BETWEEN…AND語句不同的是,這個範圍不是連續的,而是分立的。所以,上面用OR連線詞書寫的語句就可以寫成:
SELECT * FROM Student WHERE PhoneNo IN(19472747288,15843956272,17639284669,8856350376)
當前的程式碼顯得更加清晰,寫起來也不那麼麻煩了。正如我所給出的四個電話號碼中,最後的兩個是資料中沒有對應的人的電話號碼,既然是搜尋就存在搜尋不到的問題,所以這個範圍不一定全都是有效的(在資料中存在的)值,也就是說當前的記錄中不會有任何記錄的電話號碼匹配最後這兩個值。
模糊搜尋
這裡的模糊搜尋,準確的稱呼應該是模式匹配。實際上很多人都在其他的軟體中使用過這樣的搜尋。例如,我們要找出全部姓“黃”的人。這樣的需要是常有的。在SQL中可以用LIKE關鍵字提出一個模糊搜尋。基本的語法如下:
SELECT* FROM Student WHERE 欄位名 LIKE ‘匹配字串’
與此前的語法不同,匹配字串中並沒有給出完整的搜尋條件,而是使用萬用字元代替了不確定的部分。例如找出全部姓“黃”的人,SQL語句如下:
SELECT * FROM Student WHERE 欄位名 LIKE ‘黃*’
注意模糊搜尋單引號是必須的!而上面的語句中“*”就是萬用字元,表示任意個字元。所以’黃*’這個匹配字串的意思是開頭第一個字是黃,後面有多少個字,是什麼字都隨便。
支援的萬用字元如下[1]:
匹配型別 |
模式 |
匹配舉例(返回 True) |
不匹配舉例 (返回 False) |
多個字元 |
a*a |
aa、aBa 和 aBBBa |
aBC |
|
*ab* |
abc、AABB 和 Xab |
aZb 和 bac |
|
ab* |
abcdefg 和 abc |
cab 和 aab |
特殊字元 |
a[*]a |
a*a |
aaa |
單個字元 |
a?a |
aaa、a3a 和 aBa |
aBBBa |
單個數字 |
a#a |
a0a、a1a 和 a2a |
aaa 和 a10a |
字元範圍 |
[a-z] |
f、p 和 j |
2 和 & |
範圍之外 |
[!a-z] |
9、& 和 % |
b 和 a |
數字值 |
[0-9] |
0, 1, 9 |
A、a、& 和 ~ |
非數字值 |
[!0-9] |
A、a、& 和 ~ |
0, 1, 9 |
複合值 |
a[!b-m]# |
An9、az0 和 a99 |
abc 和 aj0 |
這裡解釋一下最後的複合值。第一個字元是a,固定的。但是可以發現,在匹配舉例的第一個An9,字母“a”是大寫的,這證明LIKE是不識別大小寫的,大小寫按照同一個字元識別。然後[!b-m]是指不在b到m(即不是b、c、d、e、f、g、h、i、j、k、l、m)這12個字母的其他字元。需要注意的是a99也是匹配的,那就意味著不在b-m裡指的是除了那12個字母之外的一切符號都是成立的,不僅限於字母。最後的#是一位的數字。
再舉個例子,我們要尋找StudentID尾數是25,26的兩個人(在資料中確實存在),可以這樣寫SQL語句:
SELECT * FROM Student WHERE StudentID LIKE '####25' OR StudentID LIKE '####26'
兩個匹配字串的前四位都是#,表示前4個數字(目前的StudentID共6位)任意,然後後面給出來的25,26就是確定的。
搜尋結果如下圖所示:
這一節,先不給出程式碼,也先不用在VB執行,直接在Access執行SQL語句觀察效果即可。隨著欄位的增多,光使用ListBox已經不能滿足我們的需要。在第九章,我將會講述控制元件與資料庫繫結,屆時,我們將可以用表格控制元件完整呈現所有資料。同時還可以讓ListBox自己更新資料庫中的某個欄位的內容,而不是使用ListBox的AddItem方法將Select返回的資料逐個新增到ListBox中。
在此佈置一項作業吧。將上面的語句改成這樣
SELECT* FROM Student WHERE StudentID LIKE '###25' OR StudentID LIKE '####26'。
25前面只有3個“#”,看看執行之後的結果是怎麼樣的。
參考文獻:
[1] https://msdn.microsoft.com/zh-cn/library/office/ff195752(v=office.15).aspx
相關文章
- jQuery 模糊搜尋jQuery
- 海量資料搜尋---搜尋引擎
- iOS - 模糊搜尋 2iOS
- Nebula 基於 ElasticSearch 的全文搜尋引擎的文字搜尋Elasticsearch
- 雲搜尋服務在APP搜尋場景的應用APP
- 加速Webpack-縮小檔案搜尋範圍Web
- [LeetCode] Search for a Range 搜尋一個範圍LeetCode
- Win10系統怎麼設定搜尋功能指定日期範圍搜尋Win10
- Vim模糊檔案搜尋fzf
- 搜尋引擎es-分詞與搜尋分詞
- 強化學習(十八) 基於模擬的搜尋與蒙特卡羅樹搜尋(MCTS)強化學習
- 小程式雲開發模糊查詢,實現資料庫多欄位的模糊搜尋資料庫
- 解決 PbootCMS 搜尋未搜尋到任何資料的問題boot
- 使用PHP與SQL搭建可搜尋的加密資料庫PHPSQL加密資料庫
- Lucene : 基於Java的全文搜尋引擎Java
- layui資料表格搜尋UI
- 基於SSH框架專案使用模糊查詢的搜尋功能開發框架
- elasticsearch實現基於拼音搜尋Elasticsearch
- webpack構建優化:縮小檔案搜尋範圍Web優化
- Solr搜尋基礎Solr
- 基於 Kafka 的實時數倉在搜尋的實踐應用Kafka
- SAP Fiori應用的搜尋問題
- 大資料HBase在阿里搜尋中的應用實踐大資料阿里
- 對 JSON 資料的搜尋JSON
- 海量資料搜尋---demo展示百度、谷歌搜尋引擎的實現谷歌
- 9個基於Java的搜尋引擎框架Java框架
- tiktok商品搜尋資料
- 【資料結構】搜尋樹資料結構
- Elasticsearch搜尋資料彙總Elasticsearch
- 基於Elasticsearch實現搜尋建議Elasticsearch
- 自建搜尋引擎-基於美麗雲
- 搜尋引擎-03-搜尋引擎原理
- 轉:google搜尋聯盟與adsense搜尋廣告的區別Go
- 直播平臺開發,基礎搜尋方式之拼音搜尋
- 搜尋引擎工作的基礎流程與原理
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(上篇)Elasticsearch
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(下篇)Elasticsearch
- 【搜尋引擎】 PostgreSQL 10 實時全文檢索和分詞、相似搜尋、模糊匹配實現類似Google搜尋自動提示SQL分詞Go