?
同系列的第五篇,上一篇在:http://blog.csdn.net/jiluoxingren/article/details/9633139
?
數(shù)據(jù)的查找與篩選
第4篇發(fā)布到現(xiàn)在已經(jīng)過(guò)了4天,很抱歉,學(xué)生黨,還是悲催的高三,沒(méi)辦法,8月1就開(kāi)學(xué)了。以后更新文章的速度可能會(huì)更慢,而且出完這套數(shù)據(jù)庫(kù)教程之后,未來(lái)一年都可能不會(huì)有新的教程了。就我而言是想寫下去,多寫點(diǎn)的,一是記錄下自己會(huì)的,另一方面把自己會(huì)的知識(shí)傳播出去,不過(guò)高三這段時(shí)間可能力不從心了。
?
繼續(xù)吧,看標(biāo)題“包含表中局部數(shù)據(jù)的數(shù)據(jù)集,數(shù)據(jù)的查找”,看上去是兩項(xiàng)內(nèi)容,實(shí)際上是一項(xiàng)。查找,篩選,實(shí)際上都是為了獲取我們需要的數(shù)據(jù),而不是將所有數(shù)據(jù)都提取出來(lái)。在這一章,我們將再次體會(huì)到SQL:Select語(yǔ)句的強(qiáng)大。
?
取得表中前n個(gè)或前n%的記錄
之前,我說(shuō)過(guò)SQL:Select語(yǔ)句的一個(gè)簡(jiǎn)化的語(yǔ)法,這已經(jīng)是第三章的內(nèi)容了,還記得嗎?復(fù)習(xí)一下:
SELECT?fieldnamelist? FROM? tablename
要獲得表中前n個(gè)或前n%個(gè)記錄,盡管我們可以打開(kāi)整張表的數(shù)據(jù),然后在用循環(huán)顯示數(shù)據(jù)的時(shí)候最大值為n,n為我們想要的條數(shù)這種方式來(lái)實(shí)現(xiàn),但是SQL:Select語(yǔ)句提供一個(gè)直接的方法來(lái)讓我們獲得表中前n個(gè)或前n%個(gè)記錄。這時(shí)候我們要擴(kuò)充SQL:Select語(yǔ)句的語(yǔ)法了。我們來(lái)看新的語(yǔ)法:
SELECT TOP n [PRECENT]?fieldnamelist? FROM? tablename
?
我們發(fā)現(xiàn)新的語(yǔ)法在fieldnamelist前面加入了TOP n [PRECENT]這一部分,TOP和PRECENT都是SQL的關(guān)鍵字,所以我也按照我之前所說(shuō)的習(xí)慣:SQL語(yǔ)句的關(guān)鍵字用大寫。需要先說(shuō)[PRECENT],[]這樣的語(yǔ)法表示的是可選,也就是說(shuō)TOP這樣一個(gè)關(guān)鍵字加進(jìn)去之后,n是必須的了,但是PRECENT依然是可選的,如果寫上他,那n就代表前n%,是一個(gè)百分?jǐn)?shù),可取的范圍是0<n<100;而如果沒(méi)有PRECENT,那么n就代表前n條,可取的范圍是0<n<4294967295,也就是說(shuō)如果表中有10000000000(不用數(shù)了,比4294967295多一位數(shù)字)條記錄(假設(shè)吧,Access一張表最多能有多少條記錄真沒(méi)查過(guò),說(shuō)不定最多只能有4294967295條,知道確切數(shù)字的告訴我一下,不過(guò)先假設(shè)他能儲(chǔ)存不止4294967295條吧),那么你最多也只能選出前面4294967295條。
?
讓我們來(lái)實(shí)踐一下吧,假設(shè)我們要取出前30%的記錄,那么我們可以這樣寫(還是在Student表,取出全部字段)
SELECT? TOP 30PRECENT? * FROM Student
前面說(shuō)到的[PRECENT]的[]代表的是可省略,其實(shí)[]僅僅是語(yǔ)法表達(dá)的需要,實(shí)際上寫SQL語(yǔ)句是不需要寫上去的。就像我上面的SQL語(yǔ)句一樣。
?
說(shuō)完語(yǔ)法,照例是要上VB代碼的。不上代碼的話大家可能會(huì)產(chǎn)生疑惑,SQL的語(yǔ)法換了,那么這個(gè)SQL語(yǔ)句又應(yīng)該寫在哪里??別急,下面會(huì)回答你這個(gè)問(wèn)題。
?
數(shù)據(jù)的條件查找
要實(shí)現(xiàn)數(shù)據(jù)的查找,就必須要使用更復(fù)雜語(yǔ)法的SQL:Select語(yǔ)句。我們來(lái)看下面的語(yǔ)法:
SELECT?fieldnamelist? FROM? tablename?WHERE 條件
?
會(huì)發(fā)現(xiàn),這個(gè)語(yǔ)法比最初的語(yǔ)法多了一個(gè)“WHERE 條件”,但又沒(méi)有了第一節(jié)的TOP n [PRECENT]這一部分,實(shí)際上除了最初給出來(lái)的語(yǔ)法內(nèi)容是必須的,其他都是可以根據(jù)需要增添上去的。就是這個(gè)條件實(shí)現(xiàn)了數(shù)據(jù)的查找,也就是實(shí)現(xiàn)了把我們需要的數(shù)據(jù)從表里面取出來(lái),而不是像之前那樣取出一張表的全部數(shù)據(jù)。語(yǔ)法中“條件”兩個(gè)字實(shí)際上很虛無(wú),到底這個(gè)條件怎么寫呢?最簡(jiǎn)單的是“ 字段名='內(nèi)容'”,留意里面的一對(duì)單引號(hào),當(dāng)內(nèi)容是中文的時(shí)候就需要用單引號(hào)引起來(lái),如果不是的話與一般來(lái)說(shuō)可以不用單引號(hào)。一定要注意這是單引號(hào)!
?
我們來(lái)寫一個(gè)語(yǔ)句實(shí)踐一下吧。假設(shè)我們要找出Student表中的StudentName為“黃飛鴻”的記錄,我們可以這樣寫:
SELECT? *? FROM?Student? WHERE? StudentName='黃飛鴻'
前面 SELECT * FROMStudent 的部分之前已經(jīng)說(shuō)過(guò),光是這樣沒(méi)有Where關(guān)鍵字就是選出全部的記錄。WHEREStudentName='黃飛鴻',就表示選出StudentName字段中內(nèi)容為“黃飛鴻”的記錄。
?
還是上面的實(shí)踐中的例子,需要留意的是,認(rèn)真看一下實(shí)踐中我所寫的SQL語(yǔ)句,Select后面跟著的字段名列表是用*的,也就是全部字段都選出來(lái)。然后再看我SQL語(yǔ)句后面的解釋:“我們選出的是……的記錄”,注意是記錄,一個(gè)記錄有多個(gè)字段的數(shù)據(jù)組成。所以,上面我寫的語(yǔ)句的作用不僅僅是把StudentName字段中的“黃飛鴻”這個(gè)文本內(nèi)容選了出來(lái),同時(shí)還有StudentID字段中他所對(duì)應(yīng)的的數(shù)據(jù)662356也被選了出來(lái)。這體現(xiàn)了數(shù)據(jù)庫(kù)的對(duì)應(yīng)關(guān)系。
?
現(xiàn)在來(lái)回答上一節(jié)的最后,提出的語(yǔ)法改變了,那么新的SQL語(yǔ)句又要寫在什么地方的問(wèn)題。其實(shí)還是老地方,其實(shí)每調(diào)用一次SQL:Select語(yǔ)句,無(wú)論是之前的簡(jiǎn)單語(yǔ)法,還是現(xiàn)在有Where的語(yǔ)法,甚至以后更復(fù)雜的語(yǔ)法,SQL:Select語(yǔ)句的作用都是返回一個(gè)數(shù)據(jù)集(如果符合Where條件的記錄找不到,那這個(gè)數(shù)據(jù)集就是空的)。所以,所有的SQL:Select語(yǔ)句都可以作為參數(shù)傳遞給Recordset對(duì)象的Open方法。
?
照樣,現(xiàn)在我們把實(shí)踐中寫的那個(gè)SQL語(yǔ)句作為參數(shù)傳遞給Recordset對(duì)象的Open方法,并顯示在表格里。這個(gè)還是寫在Load事件里吧。這次我把Load事件里的代碼全都列出來(lái),包括之前的連接數(shù)據(jù)庫(kù)的,還有打開(kāi)整張表的代碼,這樣做是為了給大家一個(gè)提醒,具體提醒是什么?認(rèn)真看看注釋吧,代碼后面還會(huì)說(shuō)的。
VB代碼開(kāi)始:
Private SubForm_Load()
'創(chuàng)建新的Connection對(duì)象
Set Cnn = NewADODB.Connection
?
'注意要記住該數(shù)據(jù)庫(kù)目錄為你數(shù)據(jù)庫(kù)文件當(dāng)前的位置
Cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=E:\Sample.mdb;Persist Security Info=False"
'創(chuàng)建新的Recordset對(duì)象
Set rec = NewADODB.Recordset
?
'打開(kāi)student表的全部字段的全部?jī)?nèi)容
rec.Open"SELECT * FROM Student", Cnn, adOpenStatic, adLockOptimistic
?
'---------------------------------------------------------------------
'“----”注釋里的是第五章新加的代碼
'---------------------------------------------------------------------
?
'注意了!!如果使用之前的Recordset對(duì)象變量rec
'而且之前的rec已經(jīng)被Open過(guò)了,那么必須調(diào)用Close
'將其關(guān)閉之后才能再調(diào)用Open方法
rec.Close
?
'打開(kāi)student表中StudentName為“黃飛鴻”的記錄
rec.Open"SELECT * FROM Student Where StudentName='黃飛鴻'", Cnn, adOpenStatic, adLockOptimistic
?
'---------------------------------------------------------------------
'這一章新加的代碼就到這里,下面的還是之前的代碼
'---------------------------------------------------------------------
?
'數(shù)據(jù)的提取
Do Until rec.EOF =True
??? List1.AddItemrec.Fields("StudentID").Value
??????? 'Fields對(duì)象,括號(hào)里的是索引(Index),索引填寫的內(nèi)容為字段的名稱
??????? 'Item屬性是Fields對(duì)象的默認(rèn)屬性,他的一個(gè)參數(shù)就是Index
??????? 'Fields("Student")表示一個(gè)Field對(duì)象
??????? 'Fields("Student")等價(jià)于
??????? 'rec.Fields.Item ("Student")或
??????? 'rec.Fields! ("Student")
??????? '!表示默認(rèn)屬性
?
??? List2.AddItemrec.Fields("StudentName").Value
??? '移動(dòng)下一條記錄為當(dāng)前記錄
??? rec.MoveNext
Loop
End Sub
VB代碼結(jié)束:
這里我們可以看到3行的紅色注釋(雖然VB的IDE里的注釋是用綠色顯示的,不過(guò)這里為了強(qiáng)調(diào)就用紅色),非常顯眼。這就是我要提醒大家的地方。實(shí)際的數(shù)據(jù)庫(kù)應(yīng)用里,往往需要將Recordset對(duì)象回收再用。例如這里我需要顯示出全部的人名,待會(huì)我可能又根據(jù)用戶的需要去找某個(gè)人的記錄,或者待會(huì)可能還要排一下序。我們不可能創(chuàng)建那么多的Recordset對(duì)象,如果要的話就意味著我們需要聲明很多個(gè)Recordset對(duì)象變量,這很可能會(huì)很混亂。所以Close之后重新用Open執(zhí)行其他的操作,這樣的手段是經(jīng)常用到的。
?
我們可以看到,之前的打開(kāi)整張表的代碼我沒(méi)有去掉,然后就是在一堆注釋之后直接Close,再用Open來(lái)寫今天的代碼了。而后面的輸出到List控件的代碼也被保留了下來(lái),接在了今天新的代碼之后。所以現(xiàn)在的輸出List1里就只有662356,List2就只有”黃飛鴻“了。
?
當(dāng)前的代碼運(yùn)行結(jié)果如下圖:
?
最后,給大家留個(gè)作業(yè)吧。第一節(jié)“取得表中前n個(gè)或前n%的記錄”的SQL語(yǔ)句我一直沒(méi)寫用在VB上的代碼,既然都知道了還是作為參數(shù)傳遞給Recordset對(duì)象的Open方法,那么自己去試一下吧。以為WHERE關(guān)鍵字的作用就怎么點(diǎn)??還沒(méi)完呢!下一章,我們將來(lái)講述:多重條件搜索,模糊搜索和給定范圍內(nèi)的搜索。本套教程未完,待續(xù)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
