VB6基本資料庫應用(八):模糊搜尋與基於範圍的搜尋

幾羅星人發表於2015-09-15

同系列的第八篇,上一篇在: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


相關文章