8.1 查詢(xún)和統(tǒng)計(jì)
目的與要求: 通過(guò)本次課的學(xué)習(xí),掌握數(shù)據(jù)表查詢(xún)和數(shù)據(jù)統(tǒng)計(jì)。 | ||
教學(xué)內(nèi)容與時(shí)間安排、教學(xué)方法: 教學(xué)安排: 查詢(xún) 40分鐘 統(tǒng)計(jì) 40分鐘 教學(xué)方法: CAI、圖形、表格 | ||
教學(xué)重點(diǎn)及如何突出重點(diǎn)、難點(diǎn)及如何突破難點(diǎn): 教學(xué)重點(diǎn): 表查詢(xún)、統(tǒng)計(jì) 教學(xué)難點(diǎn): 表的查詢(xún) | ||
基本內(nèi)容 | 教學(xué) | 課堂設(shè)計(jì) |
5.3查詢(xún) 對(duì)建立的數(shù)據(jù)表,VFP提供了兩種查詢(xún)的方法:順序查詢(xún)和索引查詢(xún) 一、順序查詢(xún)(也稱(chēng)條件定位查詢(xún)) 【格式】LOCATE [范圍] [FOR〈條件〉] [WHILE〈條件〉] 【功能】在當(dāng)前表文件中按照記錄的物理順序,由上到下依次查找在指定范圍內(nèi)的滿(mǎn)足條件的第一條記錄(因此可以對(duì)查找表不建立索引),若找到(即查找成功),則將記錄指針定位到該記錄,可用DISP命令或BROWSE命令進(jìn)行顯示。此時(shí)FOUND()=.T. (查找成功),若FOUND()=.F. (查找不成功) 說(shuō)明: 1)若省略范圍,系統(tǒng)默認(rèn)為ALL,此時(shí),若查不到,記錄指針定位于最后一個(gè)記錄的后邊(即文件尾),EOF()=.T. ;FOUND()=.F. 2)若指定范圍(除ALL外):查不到時(shí),記錄指針定位到指定范圍的最后一條記錄上EOF()=.F.;FOUND()=.F. 3)若在查找前執(zhí)行了“SET EXACT ON”命令,用LOCATE查找字符串時(shí)一定要將字符串寫(xiě)的和庫(kù)中查找的數(shù)據(jù)一致,即不能模糊查找 4)當(dāng)找到一條符合條件的記錄時(shí),可用DISPLAY命令進(jìn)行顯示該記錄 二、繼續(xù)查找命令 【格式】CONTINUE 【功能】繼續(xù)執(zhí)行LOCATE命令的查找,找到后,將記錄指針定位到LOCATE命令中指定條件的下一個(gè)記錄 說(shuō)明: 1)使用該命令前,必須使用一次LOCATE命令,即所謂的LOCATE和CONTINUE匹配使用問(wèn)題 2)CONTINUE命令可多次使用,直到超出查找范圍或遇到文件尾為止 3)本命令查找是否成功,可用FOUND()函數(shù)檢測(cè),.T.——成功;.F.——失敗 本命令查找是否成功,可用eof()函數(shù)檢測(cè),.F.——成功;.T.——失敗 【例】在student.dbf表中查找年齡大于18的所有記錄 USE STUDENT LOCATE FOR 年齡>18 DISP 姓名, 年齡 CONTINUE DISP 姓名, 年齡 CONTINUE ?EOF() ?FOUND()
三、索引查詢(xún) 索引查詢(xún)是在索引文件中進(jìn)行查詢(xún)的一種方法。VFP提供了兩條查詢(xún)命令:FIND和SEEK命令。 1. FIND查找命令 【格式】FIND〈常量〉 功能:查找打開(kāi)索引文件的數(shù)據(jù)表中,是否有與命令中的〈常量〉相一致的關(guān)鍵字值的第一個(gè)記錄,找到后,把記錄指針指向該記錄號(hào),便停止查找,如果沒(méi)找到“則給出有關(guān)沒(méi)有找到”的信息,此時(shí),記錄指針指向尾記錄的下面(即記錄總和值+1),函數(shù)EOF()=.T.,F(xiàn)OUND()=.F. 【說(shuō)明】 1) 當(dāng)庫(kù)中有多個(gè)索引關(guān)鍵字的值與命令中字符串相一致的記錄時(shí),F(xiàn)IND只找相一致的第一個(gè),可使用DISPLAY命令將該記錄顯示出來(lái) 2) FIND命令只能查找C型和N型索引關(guān)鍵字段的值,不能查找日期型、邏輯型和MEMO型關(guān)鍵字的值 3) FIND命令查找字符串(字符常量)時(shí),如果無(wú)前導(dǎo)空格時(shí),可以不用限界符(單引號(hào)、雙引號(hào)或方括號(hào))括起來(lái),如果字符串有前導(dǎo)空格時(shí),應(yīng)使用限界符(單引號(hào)、雙引號(hào)或方括號(hào))括起來(lái) 如:查找姓名的值: 王海 用 FIND " 王海" 張洋 用 FIND 張洋 4) 查找的字符串可以是關(guān)鍵字的全部,也可以是最左邊的一部分字符(稱(chēng)模糊查詢(xún)) 例:FIND 李 5) 查找的常數(shù)為N型關(guān)鍵字的值時(shí),命令中的數(shù)據(jù)一定按確切的值寫(xiě)。如:128.28不能寫(xiě)成:FIND 128.00 6) FIND可以查找復(fù)合索引關(guān)鍵字的值,可寫(xiě)成字符串或字符串表達(dá)式的形式,但給出的字符串的寬度一定要與庫(kù)中的寬度相一致,否則找不到 【例】打開(kāi)student1.dbf表文件,按姓名和高考成績(jī)建立索引(.idx)其中:姓名字段寬度=8,高考成績(jī)寬度=6, 1位小數(shù)。 查找姓名為"王琪",高考成績(jī)?yōu)?10分的記錄. use student1 INDEX ON 姓名+STR(高考成績(jī),6,1) TO xmcj FIND "王琪 610" 或FIND "王琪 "+" 610" 5) FIND 不能直接查找內(nèi)存變量的值,對(duì)于C型內(nèi)存變量,要用宏代換函數(shù)代換出其值,對(duì)N型變量,應(yīng)將其轉(zhuǎn)換成C型后,再用宏代換函數(shù)代換出其值后查找 【例】FIND 查找示例 USE D:\MYVFP\STUDENT INDEX ON 姓名 TO D:\MYVFP\xm FIND 周慶國(guó) ? found() &&函數(shù)返回值為.T.時(shí),表示查找成功. DISP
2.SEEK查找命令 格式: SEEK <表達(dá)式> SEEK命令的作用和使用方法與FIND基本一致,但SEEK功能更強(qiáng),它們的區(qū)別: 1)FIND只能查找C型和N型的索引關(guān)鍵字的值;SEEK表達(dá)式>可以查找:N、C、L、D型索引關(guān)鍵字的值。 2) FIND查找C型索引關(guān)鍵字的值時(shí),可用或不用限界符('、"、[ ])括起來(lái)或不括起來(lái);SEEK查找字符型索引關(guān)鍵字的值時(shí),必須用單引號(hào)或雙引號(hào)或方括號(hào)限界符括起來(lái) 3) FIND命令不能直接查找字符型內(nèi)存變量的值,需使用宏代換函數(shù),對(duì)數(shù)值型內(nèi)存變量值需用轉(zhuǎn)換成字符串后,再用宏代換代換后查找。如:高考成績(jī)=570,應(yīng)高考成績(jī)=STR(高考成績(jī),6,1), FIND &高考成績(jī);SEEK可以直接查找內(nèi)存變量的值,如:SEEK 高考成績(jī) 說(shuō)明: 1)不管是FIND還是SEEK查找,找到后,記錄指針定位到該記錄,可用DISPLAY或BROWSE命令顯示出找到的記錄內(nèi)容,若數(shù)據(jù)庫(kù)中還有符合條件的記錄,可以用SKIP 命令繼續(xù)定位到符合條件的記錄,再用DISP或BROWSE顯示其內(nèi)容,若一個(gè)也沒(méi)找到,記錄指針定位到索引文件尾部 2)SEEK 和FIND查詢(xún)后,可使用FOUND()函數(shù)檢測(cè)查找是否成功 【例】 SEEK查找示例 SET DEFAULT TO D:\MYVFP USE STUDENT1 INDEX XM,GK,XMCJ,RQ SEEK " 秦飛" DISP SET ORDER TO 2 SEEK 610 DISP GK=586.6 SEEK GK &&直接查找數(shù)值型內(nèi)存變量的值,不用&函數(shù) DISP
-----------本節(jié)課結(jié)束-----------
5.4 計(jì)算與統(tǒng)計(jì)命令 計(jì)算和統(tǒng)計(jì)是數(shù)據(jù)庫(kù)應(yīng)用的重要內(nèi)容,VFP具有多項(xiàng)計(jì)算統(tǒng)計(jì)功能,,如按指定條件統(tǒng)計(jì)數(shù)據(jù)表中記錄的個(gè)數(shù),對(duì)指定數(shù)值字段的全部或部分值求和或求平均計(jì)算,以及按要求對(duì)其中的某些數(shù)據(jù)做綜合匯總等。本節(jié)主要介紹VFP提供的“記錄個(gè)數(shù)的統(tǒng)計(jì)、求和求平均值、匯總求和及綜合統(tǒng)計(jì)命令的使用。 1. 統(tǒng)計(jì)命令 【格式】COUNT [<范圍>] [FOR <條件表達(dá)式1>] [WHILE <條件表達(dá)式2>][TO <內(nèi)存變量名表>] 【功能】計(jì)算當(dāng)前表中指定范圍內(nèi)符合條件的記錄數(shù)。 【說(shuō)明】 FOR <條件表達(dá)式1>或WHILE <條件表達(dá)式2>項(xiàng):表示對(duì)符合條件的記錄進(jìn)行統(tǒng)計(jì)個(gè)數(shù),省略,統(tǒng)計(jì)整個(gè)表中記錄的個(gè)數(shù)。 省略范圍和條件短語(yǔ)時(shí),則對(duì)表中所有記錄進(jìn)行統(tǒng)計(jì)。 TO <內(nèi)存變量名表>項(xiàng):選,表示將統(tǒng)計(jì)的結(jié)果依次存入變量中。 省略TO <內(nèi)存變量名表>項(xiàng),只將統(tǒng)計(jì)的結(jié)果顯示在屏幕上。 【例】統(tǒng)計(jì)STUDENT.DBF表中年齡大于18歲的記錄。 SET DEFAULT TO D:\myvfp USE STUDENT COUNT ALL FOR 年齡>18 &&統(tǒng)計(jì)結(jié)果顯示在狀態(tài)欄上。 2. 求和及求平均值 【格式】SUM|AVERAGE [<數(shù)值表達(dá)式表>] [<范圍>][FOR <條件表達(dá)式1>] [WHILE <條件表達(dá)式2>] [TO <內(nèi)存變量名表>|ARRAY <數(shù)組名>] 【功能】對(duì)<數(shù)值表達(dá)式表>的各個(gè)表達(dá)式求和(SUM)或者求平均值(AVERAGE)。 【說(shuō)明】 <范圍>:有四種情況:RECORD<n>,NEXT <N>,REST,ALL <數(shù)值表達(dá)式表>中各表達(dá)式的和或均值可依次存入<內(nèi)存變量表>或數(shù)組中,內(nèi)存變量的數(shù)目要與表達(dá)式表的數(shù)量相同,其間用逗號(hào)分隔。如果省略表達(dá)式表,則對(duì)當(dāng)前表的所有數(shù)值型字段求和(或求平均值)。 缺省范圍和條件短語(yǔ),則對(duì)所有數(shù)值字段進(jìn)行列向求和或求平均值。 3. 綜合計(jì)算 綜合計(jì)算,指通過(guò)調(diào)用函數(shù)計(jì)算某個(gè)字段或某些字段的計(jì)數(shù)值、累加值、平均值、最大值和最小值等。 【格式】calculate [<表達(dá)式表>][<范圍>][FOR <條件表達(dá)式1>][WHILE <條件表達(dá)式2>][TO <內(nèi)存變量名表>|ARRAY <數(shù)組名>] 【功能】分別計(jì)算<表達(dá)式表>中各個(gè)表達(dá)式的值。 【說(shuō)明】表達(dá)式常用的函數(shù)分別為別有:計(jì)數(shù)值函數(shù)cnt()、累加值函數(shù)sum()、平均值函數(shù)avg()、最大值函數(shù)max()和最小值函數(shù)min()。除cnt()函數(shù)外,其余四個(gè)函數(shù)的括號(hào)內(nèi)都需指定字段名或表達(dá)式。 1)〈范圍〉有四種情況:同SUM命令 2)〈條件〉:選對(duì)符合條件的記錄的字段組成的表達(dá)式作統(tǒng)計(jì)計(jì)算 3) 范圍和條件都省略時(shí)對(duì)所有記錄 4)〈表達(dá)式〉必選項(xiàng),由下列函數(shù)組成: CNT():無(wú)參數(shù),用于計(jì)算數(shù)據(jù)庫(kù)中記錄的個(gè)數(shù); MAX(〈表達(dá)式〉):返回〈表達(dá)式〉中的最大值,〈表達(dá)式〉的內(nèi)容可以是數(shù)值型、字符型、日期型、邏輯型字段; MIN(〈表達(dá)式〉):返回〈表達(dá)式〉中的最小值,〈表達(dá)式〉可以是數(shù)值型、字符型、日期型、邏輯型字段; AVG(〈數(shù)值表達(dá)式〉):計(jì)算數(shù)值表達(dá)式的平均值 SUM(〈數(shù)值表達(dá)式〉):計(jì)算數(shù)值表達(dá)式的和值 5) 命令中使用上述函數(shù)時(shí),若不選〈條件〉和〈范圍〉項(xiàng)時(shí),則對(duì)數(shù)據(jù)庫(kù)中的全部記錄進(jìn)行操作,否則,對(duì)范圍內(nèi)符合條件的記錄進(jìn)行操作 6) TO〈內(nèi)存變量表〉子句:選將各函數(shù)求出的表達(dá)式的值依次賦值給各個(gè)內(nèi)存變量,省略TO〈內(nèi)存變量〉統(tǒng)計(jì)計(jì)算的結(jié)果不保存。 【例】要計(jì)算表student.dbf的記錄數(shù),統(tǒng)計(jì)所有學(xué)生的最小年齡和平均年齡。 use student calculate cnt(),min(年齡),avg(年齡) TO JS,ZXNL,PJNL 4. 分類(lèi)匯總 【格式】TOTAL TO 〈匯總表文件名〉 [范圍] ON〈關(guān)鍵字〉[FIELDS〈數(shù)值表達(dá)式〉] [FOR〈條件〉] [WHILE 〈條件〉] 【功能】對(duì)當(dāng)前表文件中的數(shù)值字段進(jìn)行分類(lèi)匯總,并產(chǎn)生一個(gè)新的匯總表文件(.dbf) 【說(shuō)明】 1) TO 〈匯總表文件名〉:表示匯總結(jié)果的新表文件名 2) ON〈關(guān)鍵字〉:表示分類(lèi)匯總的表文件必須按〈關(guān)鍵字〉字段排序或索引(按哪個(gè)字段分類(lèi),就需按哪個(gè)字段排序或索引) 3) 范圍:選表示分類(lèi)匯總表記錄的范圍 4) FOR〈條件〉:用來(lái)指定一個(gè)條件,表示只有對(duì)符合條件的記錄進(jìn)行分類(lèi)匯總 5) WHILE〈條件〉:表示表中的記錄一直被分類(lèi)匯總,直到WHILE中規(guī)定的條件為假,即執(zhí)行到第一個(gè)條件為假的記錄,便停止操作 6) 若條件、范圍子句都不選,則對(duì)全部記錄 7) TOTAL匯總時(shí),每遇到一個(gè)新〈關(guān)鍵字〉的值(即分類(lèi)的類(lèi)別)改變,就將具有該值的第一條記錄存入?yún)R總表文件,然后對(duì)該值的記錄指定的N型字段匯總,匯總結(jié)果填入?yún)R總表中相應(yīng)字段內(nèi),即把具有該關(guān)鍵字值的第一個(gè)記錄存入〈匯總表〉文件中。 【例】對(duì)STUDENT。DBF表按性別字段分類(lèi),對(duì)高考成績(jī)匯總,產(chǎn)生新的匯總表文件為XBGKHZ.DBF, 要求把匯總表保存到D:\MYVFP文件夾中. USE D:\MYVFP\STUDENT INDEX ON 性別 TO D:\MYVFP\XBSY LIST TOTAL ON 性別 TO D:\MYVFP\XBGKHZ FIELDS 高考成績(jī) USE D:\MYVFP\XBGKHZ LIST
-----------本節(jié)課結(jié)束-----------
|
講述
|
順序查詢(xún)
繼續(xù)查找命令5分鐘
Find查找命令10分鐘
Seek查找命令15分鐘
統(tǒng)計(jì)命令
求和及平均值8分鐘
綜合計(jì)算
分類(lèi)匯總
|