《數(shù)據(jù)庫基礎(chǔ)與Visual FoxPro9.0程序設(shè)計》課件第5章_第1頁
《數(shù)據(jù)庫基礎(chǔ)與Visual FoxPro9.0程序設(shè)計》課件第5章_第2頁
《數(shù)據(jù)庫基礎(chǔ)與Visual FoxPro9.0程序設(shè)計》課件第5章_第3頁
《數(shù)據(jù)庫基礎(chǔ)與Visual FoxPro9.0程序設(shè)計》課件第5章_第4頁
《數(shù)據(jù)庫基礎(chǔ)與Visual FoxPro9.0程序設(shè)計》課件第5章_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第5章表的索引5.1索引5.2多個表聯(lián)訪練習(xí)五5.1索引

把按表達(dá)式值進(jìn)行物理排序生成新表的操作稱為表的排序。由于表的排序要生成一個新表,而新表將占據(jù)大量的磁盤空間,且造成數(shù)據(jù)大量冗余,會產(chǎn)生意想不到的插入異常、刪除異常、修改異常等潛在危險,與關(guān)系型數(shù)據(jù)庫的要求相矛盾,因此目前已極少使用。而數(shù)據(jù)表的索引正好可以克服這些缺點。5.1.1索引的概念及類型

1.索引的概念

按照某個表達(dá)式的值對表進(jìn)行邏輯排序,稱為索引,該表達(dá)式稱為索引表達(dá)式。索引表達(dá)式可以是字段名、字段的組合、記錄號函數(shù)等。

索引并不改變表中記錄的物理順序,僅生成一個索引文件或標(biāo)記。在索引中,僅有兩個字段,即索引表達(dá)式值和一個指向表的對應(yīng)記錄的指針。顯然,它把數(shù)據(jù)冗余壓縮到了最小程度。也正因為索引僅有兩個字段,所以它不能單獨使用,必須在表打開后才起作用。表以索引形式打開后,記錄將按邏輯次序顯示并操作;編輯原表的記錄時,所有打開的索引都會自動更新,從而自動保持了表數(shù)據(jù)與索引文件數(shù)據(jù)的一致性。

在數(shù)據(jù)庫中,索引可以用來建立數(shù)據(jù)庫表之間的相互永久關(guān)聯(lián),實現(xiàn)表間的參照完整性,所以索引得到了廣泛的使用。

但過多的索引會降低表的更新速度,因此揚長避短,適當(dāng)?shù)囟皇沁^多地使用索引,達(dá)到既可保持?jǐn)?shù)據(jù)的一致性,又可提高查詢速度,還可避免降低表數(shù)據(jù)的更新速度,則顯得非常重要。

2.索引的分類

索引的類型是指將索引按索引表達(dá)式的值是否允許重復(fù)及表允許索引的個數(shù)而劃分的。在VisualFoxPro9.0中有5種類型的索引:主索引、候選索引、二進(jìn)制索引、普通索引和唯一索引。如果建立索引的表達(dá)式是字段,也稱之為索引關(guān)鍵字。

1)候選索引(CandidateIndex)

用候選碼(CandidateCode)創(chuàng)建的索引稱為候選索引。候選索引具有以下特點:

①候選碼可唯一地標(biāo)識表的各條記錄。

②不管是庫表還是自由表都可以建立候選索引,且一個表允許建立多個候選索引。③在數(shù)據(jù)庫表中,若有多個候選索引,可將其中一個指定為主索引。

④候選索引只能存儲于結(jié)構(gòu)復(fù)合索引文件中。

2)主索引(PrimaryIndex)

在數(shù)據(jù)庫表中,選中其中的一個候選碼作為主碼(PrimaryCode)建立的索引稱為主索引。主索引的特點如下:

①主索引是多個候選索引中的一個。

②只有數(shù)據(jù)庫表才可以創(chuàng)建主索引。

③每一個庫表只允許建立一個主索引。

④自由表無主索引。

⑤和候選索引一樣,主索引也只能存儲于結(jié)構(gòu)復(fù)合索引文件中。

3)普通索引(RegularIndex)

允許索引表達(dá)式的值重復(fù)的索引稱為普通索引。在普通索引中,記錄按索引表達(dá)式值次序排列,對于索引表達(dá)式值相同的記錄,則按原記錄錄入的物理次序排列在一起。普通索引既可存儲于復(fù)合索引文件中,也可單獨以單索引文件的形式出現(xiàn)。

4)二進(jìn)制索引(BinaryIndex)

二進(jìn)制索引或位圖索引是根據(jù)一個有效且非空的邏輯表達(dá)式創(chuàng)建的一種索引。例如,標(biāo)記刪除的記錄,它支持自由表和庫表。但是,二進(jìn)制索引不支持下列情況:

①使用帶有Null值的索引表達(dá)式。

②過濾條件含有FOR子句。③改變記錄顯示和處理次序的關(guān)鍵字,例如ASCENDING、DESCENDING、UNIQUE、CANDIDATE。

④設(shè)置二進(jìn)制索引為主控索引,例如SETORDER命令。

⑤進(jìn)行排序和索引查找操作。

5)唯一索引(UniqueIndex)

早期的VFP版本有唯一索引。它與普通索引類似,但對于關(guān)鍵表達(dá)式的值相同的所有記錄,僅將它們其中的第1條記錄存入索引文件中,從而可避免顯示或訪問關(guān)鍵表達(dá)式值相同的其它記錄。對于添加到表中的記錄,如果與表中原有記錄的索引關(guān)鍵表達(dá)式值相同,則它不會被包含在索引文件中。目前,在VFP9.0下利用表設(shè)計器已不能建立唯一索引。

3.索引文件的類型

按索引文件所允許包含的索引個數(shù),將索引文件分為兩大類:單索引文件和復(fù)合索引文件。

1)單索引文件

所謂單索引文件,是指一個索引文件只允許包含一個索引,且擴展名是“.IDX”的索引文件。單索引文件又稱為獨立索引文件。

單索引文件主要是為和老版本VFP(或FoxBase)兼容而設(shè)置的,它保存臨時的或較少使用的單個索引,一般在使用之前才創(chuàng)建或必要時才進(jìn)行更新。單索引文件的特點是:

①單索引只有升序而無降序。

②只有普通和唯一兩種索引。

③打開方法多樣,既可以與表同時打開,也可以在表已打開的情況下獨立打開。

④存儲形式多樣,既可以是壓縮形式,也可以是非壓縮形式。壓縮形式的存儲量小且訪問速度快,但與FoxBase不兼容。

2)復(fù)合索引文件

所謂復(fù)合索引文件,是指同一個索引文件中可以包含多個索引。復(fù)合索引文件的擴展名是“.CDX”,它只以壓縮形式存放。根據(jù)索引是否屬于表結(jié)構(gòu)的一部分,復(fù)合索引文件又分為結(jié)構(gòu)復(fù)合索引文件和非結(jié)構(gòu)復(fù)合索引文件。

所謂結(jié)構(gòu)復(fù)合索引文件,是指索引屬于表結(jié)構(gòu)的一部分的復(fù)合索引文件。

表的主索引和候選索引只能存儲在結(jié)構(gòu)復(fù)合索引文件中。同時結(jié)構(gòu)復(fù)合索引文件也常用于頻繁使用和需要經(jīng)常維護的

索引。

由于結(jié)構(gòu)復(fù)合索引是表結(jié)構(gòu)的一部分,因此決定了它“與表同步”的特點——文件主名與表同名;隨表創(chuàng)建、打開、關(guān)閉、更新、刪除而自動創(chuàng)建、打開、關(guān)閉、更新和刪除。

凡是利用表設(shè)計器創(chuàng)建的索引一定是結(jié)構(gòu)復(fù)合索引文件的標(biāo)記。5.1.2創(chuàng)建索引

索引的創(chuàng)建分為菜單方法創(chuàng)建和命令方法創(chuàng)建。

1.菜單方法創(chuàng)建索引

在菜單方式下,通過表設(shè)計器只能創(chuàng)建結(jié)構(gòu)復(fù)合索引文件的索引標(biāo)記。根據(jù)創(chuàng)建的索引標(biāo)記是普通索引還是其它索引、創(chuàng)建索引表達(dá)式是索引關(guān)鍵字還是表達(dá)式,創(chuàng)建的方法略有

不同。

1)用索引關(guān)鍵字創(chuàng)建普通索引標(biāo)記

使用索引關(guān)鍵字創(chuàng)建普通索引最簡單,只要在表設(shè)計器的字段對話框即可完成任務(wù)。圖5.1就是表設(shè)計器“字段”對話框。它含有一個索引列表框,專供創(chuàng)建以字段為索引表達(dá)式的普通索引。創(chuàng)建的步驟

如下:

S1:用獨占方式打開表(如是庫表,則先打開數(shù)據(jù)庫再打開表)。

S2:打開表設(shè)計器,選定要作為索引關(guān)鍵字的字段。

S3:創(chuàng)建索引。在選定字段后面的索引列表框中選擇索引次序,向上的箭頭為遞增次序,向下的箭頭為遞減次序。

S4:創(chuàng)建完成?!敬_定】。

注意此時創(chuàng)建的索引一定是結(jié)構(gòu)復(fù)合索引的一個標(biāo)記,標(biāo)記名與該字段同名。圖5.1“字段”對話框

例5.1對“xsjbqkb.dbf”根據(jù)“出生日期”字段,創(chuàng)建一個降序的普通索引。

USExsjbqkbEXCLUSIVE

MODIFYSTRUCTURE

在表設(shè)計器的字段對話框,選定字段“出生日期”,在“索引”列表框中選擇“↓降序”,結(jié)果如圖5.1所示。最后單擊

【確定】。

2)創(chuàng)建其它索引

結(jié)構(gòu)復(fù)合索引中其它各類型索引的創(chuàng)建要通過表設(shè)計的“索引”對話框進(jìn)行?!八饕睂υ捒蛉鐖D5.2所示,它所包含的各個列功能如下:●排序(次序):切換按鈕,確定排序的次序為升序還是降序,箭頭向下為降序,向上為升序。

●索引:指定要生成的索引標(biāo)記的名稱。缺省為與字段同名。

●類型:列表框,指定索引的類型。缺省為普通索引。

●表達(dá)式:指定索引表達(dá)式,既可在其文本框直接寫入,又可用表達(dá)式生成器創(chuàng)建。

●篩選:指定要索引的記錄的篩選條件,既可在其文本框中直接寫入,又可用表達(dá)式生成器創(chuàng)建。缺省為所有的記錄全部按索引表達(dá)式的值進(jìn)行索引。

●排序:列表框,確定字符排序所使用的方式,該方式有PinYin、Machine和Stroke三種。

創(chuàng)建索引的步驟如下:

S1、S2:與創(chuàng)建單字段普通索引相同。

S3:→“索引”↓索引。

S4:填寫或選擇有關(guān)選項卡,包括排序、索引、類型、表達(dá)式、篩選、排序的值或表達(dá)式。

S5:→【確定】。圖5.2“索引”對話框

例5.2

對“xsjbqkb.dbf”根據(jù)“性別”和“出生日期”字段,創(chuàng)建一個降序的候選索引,索引標(biāo)記為“性別日期”,索引條件為黨團關(guān)系=‘團員’,然后瀏覽結(jié)果。

S1:創(chuàng)建索引。

S1-1:USExsjbqkbEXCLUSIVE

S1-2:MODIFYSTRUCTURE

S1-3:→“索引”,填寫有關(guān)選項(如圖5.2所示)→【確定】。

S2:打開“工作區(qū)屬性”對話框。在系統(tǒng)菜單中→“顯示”→“瀏覽”→“表”→“屬性”↓工作區(qū)屬性。

S3:選擇索引順序。在索引順序列表框中選擇:xsjbqkb.性別日期,如圖5.3所示,→【確定】←MicrosoftVisualFoxPro。

S4:進(jìn)行瀏覽,結(jié)果如圖5.4所示。

注意:結(jié)構(gòu)復(fù)合索引創(chuàng)建后,一般應(yīng)通過“工作區(qū)屬性”對話框的“索引順序”列表框選擇索引順序,方可按照某個索引確定的記錄邏輯次序顯示表記錄。這實際上是選擇表的主控索引(亦稱當(dāng)前索引)。圖5.3“工作區(qū)屬性”對話框

圖5.4索引后的瀏覽結(jié)果

2.命令方法創(chuàng)建索引

與菜單方式創(chuàng)建索引不同,用命令方式既可創(chuàng)建復(fù)合索引,又可創(chuàng)建單索引,命令如下:

【命令格式】

INDEXONExpressionTOIDXFileName|TAGTagName[BINARY]

[COLLATEcCollateSequence][OFCDXFileName]

[FORlExpression]

[COMPACT][ASCENDING|DESCENDING]

[UNIQUE|CANDIDATE][ADDITIVE]

【功能】

該命令用于建立單索引文件或向復(fù)合索引文件增加索引

標(biāo)記。

【參數(shù)和子句說明】

●?Expression:指定索引表達(dá)式。

●?TOIDXFileName:指定要建立單索引文件的文件名。

●?TAGTagName:指定建立復(fù)合索引文件的索引標(biāo)記,或增加索引標(biāo)記。

●?BINARY:創(chuàng)建二進(jìn)制索引。

●?COLLATEcCollateSequenc:指定字符比較次序。缺省時為機器設(shè)置的缺省值?!?OFCDXFileName:指定索引標(biāo)記所隸屬的非結(jié)構(gòu)復(fù)合索引文件的名稱。若缺省則表示創(chuàng)建或在結(jié)構(gòu)復(fù)合索引文件中添加新的索引標(biāo)記。

●?FORlExpression:記錄的篩選條件。缺省時為全部

記錄。

●?COMPACT:指定生成一個壓縮的單索引文件。缺省表示不壓縮。

●?ASCENDING|DESCENDING:指定升序或降序索引,僅對復(fù)合索引有效。缺省為升序。

●?UNIQUE|CANDIDATE:用于指定索引類型。前者表示唯一索引;后者表示候選索引。缺省為普通索引?!?ADDITIVE:建立索引的同時不關(guān)閉先前已打開的索引。缺省時表示在創(chuàng)建本索引的同時關(guān)閉除結(jié)構(gòu)復(fù)合索引之外的其它所有索引。

【注意事項】

當(dāng)索引表達(dá)式為多字段時,必須將多個字段組成合理的有效表達(dá)式。一般組成字符串表達(dá)式。對于數(shù)值型字段,需用STR()函數(shù)將數(shù)值型數(shù)據(jù)轉(zhuǎn)換成字符串;對于日期型數(shù)據(jù),需用DTOC()函數(shù)將其轉(zhuǎn)換成字符串,然后將它們用運算符“+”連接起來。

例5.3

利用索引創(chuàng)建命令,重做例5.2。

USExsjbqkbEXCLUSIVE

INDEXON性別+DTOC(出生日期)DESCENDING

TAG性別日期1FOR黨團關(guān)系=‘團員’

BROWSE

顯示結(jié)果與圖5.4相同,且此時在工作區(qū)屬性對話框的索引順序已自動變?yōu)榱藊sjbqkb.性別日期1??梢娪米詈笠淮蚊罘绞絼?chuàng)建的索引將自動變?yōu)橹骺厮饕?/p>

例5.4

為xsj

bqkb添加一個“應(yīng)往屆生L”字段,并輸入各記錄的該字段值的值,然后以該字段為索引關(guān)鍵字創(chuàng)建一個二進(jìn)制索引標(biāo)記。

ALTERTABLExsjbqkbADD應(yīng)往屆生L

INDEXon應(yīng)往屆生TAG應(yīng)往屆生BINARY

但二進(jìn)制索引不能確定為主控索引,因此無法觀察索引后的記錄次序。5.1.3使用索引

1.打開與關(guān)閉索引文件

索引文件的類型不同,打開與關(guān)閉的方法也不盡相同。結(jié)構(gòu)復(fù)合索引文件始終與表自動同時打開和關(guān)閉。單索引和非結(jié)構(gòu)復(fù)合索引既可以與表同時打開和關(guān)閉,也可以在表文件打開之后單獨打開和關(guān)閉。

在表文件打開之后打開索引文件的菜單方法與打開其它文件的方法相同,都是通過【打開】按鈕進(jìn)行的,無須贅述。下面介紹用命令方式打開索引文件。

1)索引文件與表同時打開

對于單索引和非結(jié)構(gòu)復(fù)合索引,可用在USE命令中加入INDEX子句的方法實現(xiàn)與表文件的同時打開。下面給出USE命令的完整格式。

【命令格式】

USE[[[DatabaseName!]TableName|?][INnWorkArea|cTableAlias]

[INDEXIndexFileList|?[ORDER[nIndexNumber|IDXFileName

|[TAG]TagName[OFCDXFileName]

[ASCENDING|DESCENDING]][ALIAScTableAlias]

[EXCLUSIVE][SHARED][NOUPDATE]]

【功能】

該命令用于在打開表或關(guān)閉表的同時打開或關(guān)閉索引文件。

【參數(shù)和子句說明】

●?DatabaseName!:指定要打開表所隸屬的數(shù)據(jù)庫名。缺省時指當(dāng)前庫或自由表。

●?TableName:指定要打開的表名。

●?INnWorkArea|cTableAlias:指定表打開的工作區(qū)號或工作區(qū)別名。

●?INDEXIndexFileList:指明要和表同時打開的非結(jié)構(gòu)復(fù)合索引和單索引文件的名稱。缺省時指將表按普通方式打開。●?ORDER[nIndexNumber|IDXFileName|[TAG]TagName[OFCDXFileName]:指定主控索引。nIndexNumber為索引的編號,IDXFileName為單索引的名字,TagName為結(jié)構(gòu)復(fù)合索引的標(biāo)記名稱,CDXFileName為非結(jié)構(gòu)復(fù)合索引文件的名稱。

●?ASCENDING|DESCENDING:指明不管表的索引創(chuàng)建時是升序還是降序,這里都臨時以升序或降序顯示和操作。缺省時以創(chuàng)建索引時的次序為準(zhǔn)。

●?ALIAScTableAlias:為表取一個別名。

【注意事項】

關(guān)于索引的編號,VFP將所有打開的單索引和復(fù)合索引的索引標(biāo)記統(tǒng)一編號,編號的次序是:表文件、單索引名、結(jié)構(gòu)復(fù)合索引各標(biāo)記、非結(jié)構(gòu)復(fù)合索引各標(biāo)記。單索引按在INDEXIndexFileList子句中的先后次序編號;索引標(biāo)記按各索引在所屬復(fù)合索引文件中所建的先后次序編號。表5.1給出了編號的次序。在許多時候,用戶很難記清楚究竟有多少單索引被打開、復(fù)合索引中有多少個索引標(biāo)記以及各標(biāo)記創(chuàng)建的次序,這就為使用索引編號確定主控索引帶來了麻煩。

然而用戶卻明白,希望把哪個索引作為主控索引,為此使用nIndexFileList倒不如使用IDXFileName或[TAG]TagName[OFCDXFileName]子句來確定主控索引更方便。

例5.5

設(shè)為xsjbqkb.dbf已經(jīng)按姓名字段創(chuàng)建了單索引xm.idx,在結(jié)構(gòu)復(fù)合索引文件中已經(jīng)存在了一個索引標(biāo)記“性別日期”,請將它們和表一并同時打開,并將索引標(biāo)記“性別日期”設(shè)置為主控索引。

USExsjbqkbINDEXxmORDER性別日期

2)索引文件的單獨打開

在有些情況下,當(dāng)表打開后需要打開一些尚未與表同時打開的非結(jié)構(gòu)復(fù)合索引文件或單索引文件。此時,應(yīng)使用單獨打開索引的命令SETINDEXTO。

【命令格式】

SETINDEXTO[IndexFileList|?]

[ORDER[nIndexNumber|IDXFileName|[TAG]TagName[OFCDXFileName]

[ASCENDING|DESCENDING]][ADDITIVE]

【功能】

該命令用于打開一個或多個與當(dāng)前表有關(guān)的索引。

【參數(shù)和子句說明】

●?ADDITIVE:指定在打開新的索引文件時,是否關(guān)閉除結(jié)構(gòu)復(fù)合索引之外的原已打開的索引。有此關(guān)鍵字,表示不關(guān)閉原來打開的索引,從而使新老索引同時起作用,否則表示關(guān)閉原來打開的索引。

●其它參數(shù)和子句與USE命令中的意義相同。

例5.6

設(shè)表xsjbqkb.dbf已提前打開,請打開單索引文件xm.idx,并將它確定為主控索引。

SETINDEXTOxmORDERxm

實際上,最后一個打開的索引文件一定是主控索引,因此上例中即使沒有ORDER子句,xm也會成為主控索引。

3)索引的關(guān)閉

關(guān)閉索引文件,對于單索引文件和非結(jié)構(gòu)復(fù)合索引文件,都要通過命令方式來進(jìn)行。其方法有三種。

方法1,使用不帶任何短語或參數(shù)的USE命令。由于索引文件是緊緊依賴表文件的,因此關(guān)閉表就可將與該表有關(guān)的所有復(fù)合索引文件和單索引文件關(guān)閉。而關(guān)閉當(dāng)前表命令是不帶短語和參數(shù)的命令USE。

方法2,使用關(guān)閉索引命令SETINDEXTO。

方法3,使用專門的索引文件關(guān)閉命令CLOSEINDEXES。

方法3可關(guān)閉當(dāng)前工作區(qū)打開的所有非結(jié)構(gòu)復(fù)合索引文件和單索引文件,但并不關(guān)閉結(jié)構(gòu)復(fù)合索引文件。

例5.7

關(guān)閉表xsjbqkb.dbf及其全部打開的索引。

USE2.重新索引

如果僅打開了表和部分索引,那么對表的修改將不會反映到未打開的索引中去,這樣會造成表與某些索引不一致。此時需要對索引進(jìn)行重新索引,以取得索引與更新后的表文件數(shù)據(jù)的一致。重新索引非常簡單:在菜單方式下,通過系統(tǒng)菜單中“表”菜單下的“重新建立索引”選項進(jìn)行;命令方式用REINDEX。命令方式重新索引的操作步驟如下:

S1:將所有與表有關(guān)的索引全部打開。

S2:重新索引。輸入命令:

REINDEX

3.設(shè)置主控索引

當(dāng)為一個表創(chuàng)建了多個索引后,對于每個索引,記錄的邏輯排序次序不同,但在某一時刻,只能由一個索引控制表的顯示和操作次序,這個索引叫主控索引或稱為當(dāng)前索引。

事實上,設(shè)置主控索引的菜單方法在前面已講述過,即通過工作區(qū)屬性對話框的索引順序列表框進(jìn)行。在命令方式下,USE、SETINDEX命令中也含有設(shè)置主索引的短語。單獨設(shè)置主控索引的命令如下

【命令格式】

SETORDERTO[[nIndexNumber|IDXIndexFileName|[TAG]TagName

[OFCDXFileName][INnWorkArea|cTableAlias]

[ASCENDING|DESCENDING]]

【功能】

該命令用于將單索引或復(fù)合索引文件中指定索引標(biāo)記設(shè)為主控索引或取消先前已設(shè)置的主控索引。

【參數(shù)和子句說明】

該命令中的參數(shù)和子句均與USE命令中的意義相同。如果在SETORDERTO之后無參數(shù)和子句,則表示取消先前的主控索引而改按無順序方式進(jìn)行操作。

例5.8

將例5.6中打開的結(jié)構(gòu)復(fù)合索引文件中的索引標(biāo)記“性別日期”設(shè)置為主控索引。

USExszhjfb

SETORDETOTAG性別日期&&將“性別日期”設(shè)為主控索引

4.索引查詢

索引查詢在表以要查詢的關(guān)鍵字為索引表達(dá)式創(chuàng)建了索引并打開了該索引的前提下進(jìn)行。由于表此時的操作次序是按要查詢表達(dá)式的值升序或降序有序排列的,因此可使用數(shù)學(xué)上的折半查詢法來查詢。在VFP中,折半查詢被稱為索引查詢。由于查詢的速度很快,因此相對于順序查詢LOCATE,又稱折半查詢?yōu)榭焖俨樵?。查詢命令為SEEK。

【命令格式】

SEEKExpression[ORDERnIndexNumber|IDXIndexFileName|[TAG]TagName

[OFCDXFileName]

[ASCENDING|DESCENDING]]

[INnWorkArea|cTableAlias]

【功能】

該命令用于將記錄指針定位在與查詢表達(dá)式值相匹配的首條記錄上,或確定沒有與查詢關(guān)鍵字的值相匹配的記錄。

【參數(shù)和子句說明】

●?Expression:指定要查詢的表達(dá)式的值,它必須是一個精確值。它可以是常量、變量、表達(dá)式或Null值。除數(shù)值型外,其它類型必須要有各自的定界符。

●其它子句和參數(shù)同于在前面各命令中的意義。滿足條件的首條記錄是否找到,照樣可以用FOUND()函數(shù)來判別。

例5.9

在xscjb.dbf中,用字段“總分”的降序創(chuàng)建一個結(jié)構(gòu)復(fù)合索引的標(biāo)記“總分”,然后快速查找總分等于594的記錄。

USExscjb

INDEXON總分TAG總分

SEEK594&&提示欄顯示:記錄5/12,說明表共12條記錄,指針指向第5條

?FOUND(),EOF()&&顯示.T..F.

DISPLAY

顯示結(jié)果如圖5.5所示。圖5.5SEEK查詢結(jié)果顯示由于表是以索引方式打開的,因此索引關(guān)鍵字值相同的記錄已排列在了一起,所以當(dāng)要查詢滿足條件的第2條記錄時,只要使用SKIP命令即可。但此時不管下一條記錄是否為滿足條件的新記錄,測試函數(shù)FOUND()都保持著邏輯真不變,因此只能通過DISPLAY命令顯示其記錄來判斷是否是滿足條件的新記錄。

5.SEEK函數(shù)

SEEK函數(shù)將起到SEEK命令和FOUND()函數(shù)二者的共同作用,既可查找到希望的第1條記錄或確定無希望的記錄,又可返回是否找到的邏輯值。

【函數(shù)格式】

SEEK(Expression[,nWorkArea|cTableAlias[,nIndexNumber|cIDXIndexFileName|cTagName]])

【功能】

SEEK函數(shù)用于在指定的工作區(qū)中快速查詢索引表達(dá)式與查詢表達(dá)式相匹配的第1條記錄,如查到則返回.T.,并將記錄指針指向該記錄;否則返回.F.,并將記錄指針指向表文件的尾部。

【參數(shù)和子句說明】

●?Expression:要查詢的表達(dá)式。

●?nWorkArea|cTableAlias:指定查詢的工作區(qū)或別名,缺省時為當(dāng)前表。

●?nIndexNumber|cIDXIndexFileName|cTagName:指定被查詢的索引的編號、單索引文件名或結(jié)構(gòu)復(fù)合索引的標(biāo)記

名稱。

例5.10

使用SEEK函數(shù)在xsjbqkb.dbf中查詢有關(guān)記錄。

USExsjbqkb

?SEEK('女'+DTOC({^1990/08/18}),'xsjbqkb','性別日期'),RECNO(),F(xiàn)OUND()

DISPLAY

顯示結(jié)果如圖5.6所示。圖5.6SEEK函數(shù)的功能5.2多?個?表?聯(lián)?訪

在第1章中,我們曾強調(diào)指出,一個實際的關(guān)系模型常常會包含若干個關(guān)系。即對于一個實際的關(guān)系型數(shù)據(jù)庫,經(jīng)常會涉及到若干個數(shù)據(jù)表。VisualFoxPro9.0提供了可以同時進(jìn)行多個表的聯(lián)合訪問(聯(lián)訪)操作方式,即多工作區(qū)操作。

5.2.1工作區(qū)

所謂工作區(qū),指將連續(xù)的內(nèi)存空間,邏輯上劃分為若干個相對獨立的區(qū)間,每個區(qū)間允許打開一個表文件。如果要在一個工作區(qū)中打開第二個表文件,那么第一個表文件先自動關(guān)閉,然后才打開第二個文件。VisualFoxPro9.0共設(shè)置了32767個工作區(qū),供用戶選用。

1.多區(qū)操作的特點

多區(qū)操作具有如下特點:

(1)每個工作區(qū)同時只能打開一個表文件,一個表文件也不能在一個以上的工作區(qū)同時打開,否則會出現(xiàn)“文件正在使用”的提示信息。

(2)不論已經(jīng)使用了多少個工作區(qū),只有一個是當(dāng)前工作區(qū),在當(dāng)前工作區(qū)中打開的表文件就是當(dāng)前表文件。系統(tǒng)啟動后,默認(rèn)1號工作區(qū)為當(dāng)前工作區(qū),用戶可以使用命令選擇1~32767個工作區(qū)號中的任意一個作為當(dāng)前工作區(qū),?但同時最多只能使用255個工作區(qū)。

(3)每個工作區(qū)為打開的表文件設(shè)置一個記錄指針,在一般情況下它們各自獨立移動,互不干擾。

2.多區(qū)操作的種類

多區(qū)操作主要包括下列幾種情況:

(1)用同一條命令訪問多個工作區(qū)中的數(shù)據(jù)。例如,命令LISTFieldList

中的字段名列表可以取自不同的工作區(qū)中的表。

(2)使用專用的多區(qū)操作命令。如SETRELATION命令、JOIN命令等都能實現(xiàn)多區(qū)操作。它們的共同特點是:能使多個工作區(qū)中的記錄指針實現(xiàn)聯(lián)動,從而提高數(shù)據(jù)處理效率。

(3)對多個工作區(qū)同時生效的操作。例如:

●?CLOSEDATABASE:可關(guān)閉所有的數(shù)據(jù)庫、數(shù)據(jù)表文件、索引文件等。

●?CLOSETABLESALL:可關(guān)閉所有的數(shù)據(jù)表文件。

●?CLEARALL:可清除所有內(nèi)存變量、窗口、菜單等,也可關(guān)閉所有用戶打開的文件。

3.工作區(qū)的標(biāo)識

工作區(qū)的標(biāo)識用來區(qū)別所選定的工作區(qū),它有以下四種

標(biāo)識:

(1)使用工作區(qū)編號。工作區(qū)編號的選擇范圍為1~32767。

(2)使用系統(tǒng)工作區(qū)別名。前10個工作區(qū)用A~J來表示各自的工作區(qū)別名,自11號工作區(qū)開始,在編號前加上“W”代表工作區(qū)的別名。例如,“W254”等價于第254號工作區(qū)。

(3)用表名做工作區(qū)別名。當(dāng)表以不帶別名短語ALIASAlias的形式打開后,表文件名可作為工作區(qū)標(biāo)識。

(4)用表的別名做工作區(qū)別名。當(dāng)表以帶有別名短語ALIASAlias的形式打開后,別名也可作為工作區(qū)的標(biāo)識。例如,若執(zhí)行了命令:

USExsjbqkbALIASjbqkIN4

則4號工作區(qū)可使用三種標(biāo)識符:4、D、jbqk。

但如果執(zhí)行命令:

USExsjbqkbIN4

則4號工作區(qū)又有三種標(biāo)識符:4、D、xsjbqkb。

4.工作區(qū)的選擇

【命令格式】

SELECTnWorkArea|cTableAlias|0

【功能】

該命令用于激活所選定的工作區(qū)。

【參數(shù)及子句說明】

●?nWorkArea:系統(tǒng)給出的工作區(qū)號,取值范圍為1~32767;也可使用A~J、W11~W32767。

●?cTableAlias:表的別名,如果表沒有起別名,則可以用表名代替別名。

●?0:指定區(qū)號最小的一個未用工作區(qū)。

【說明】

函數(shù)SELECT()可返回當(dāng)前工作區(qū)號;函數(shù)ALIAS([nWorkArea])可返回當(dāng)前工作區(qū)或指定的工作區(qū)別名。

例5.11

工作區(qū)選擇舉例。

CLEARALL

USExsjbqkb

&&在1號工作區(qū)打開表xsjbqkb.dbf

SELECT3

&&選擇3號工作區(qū)

USExscjbALIAScj

&&在3號區(qū)以別名cj打開表xscjb.dbf

USEkcdmbIN0

&&在2號工作區(qū)打開表lcdmb.dbf5.2.2建立表間的臨時關(guān)系

多個表操作時,必然涉及訪問不同工作區(qū)中的數(shù)據(jù)問題和不同工作區(qū)間記錄指針是否能同步移動的問題。前者是工作區(qū)的聯(lián)訪問題,后者是“記錄指針跟隨”問題。

1.工作區(qū)的聯(lián)訪

在當(dāng)前工作區(qū)中訪問其它工作區(qū)的字段,稱為多工作區(qū)表的聯(lián)防,簡稱工作區(qū)聯(lián)訪。此時,對于非當(dāng)前工作區(qū)中要訪問的字段,應(yīng)在字段名稱前加上它所在的工作區(qū)標(biāo)識,并將工作區(qū)標(biāo)識與字段名用聯(lián)訪符相連接。聯(lián)訪有兩種格式:格式1:AliasName->FieldName

格式2:AliasName.FieldName

其中的“->”、“.”為聯(lián)訪符。

例5.12

顯示學(xué)生李會琴的各科成績。

CLEARALL

USExsjbqkb

LOCATEFOR姓名=“李會琴”

DISPLAY

&&顯示“李會琴”的有關(guān)數(shù)據(jù),如圖5-7中的第1、2行

USExscjbIN0

SELECTxscjb

LOCATEFOR學(xué)號=xsjbqkb.學(xué)號

&&工作區(qū)聯(lián)訪,將當(dāng)前工作區(qū)的記錄定位于

與xsjbqkb.dbf中李會琴的學(xué)號相等的記錄

DISPLAY

&&顯示李會琴的學(xué)習(xí)成績,如圖5.7中的第3、4行圖5.7如果此時再執(zhí)行下面的DISPLAY命令:

DISPLAYALL學(xué)號,xsjbqkb.姓名,K001,K002,K003,K004,K005,K006,K007,總分

則顯示的結(jié)果將如圖5.8所示。圖5.8未建表間臨時關(guān)系的聯(lián)訪結(jié)果結(jié)果表明,除姓名字段全部顯示為“李會琴”外,其余各字段都是當(dāng)前工作區(qū)中表xscjb.dbf的各條記錄的值。而姓名來自于xsjbqkb.dbf,系工作區(qū)的聯(lián)訪,它始終顯示“李會琴”,說明在多工作區(qū)中聯(lián)訪時,各表的記錄指針相互獨立,一個工作區(qū)記錄指針的移動并不能影響到另一工作區(qū)。因此在執(zhí)行DISPLAY命令時,盡管xscjb工作區(qū)的記錄指針在逐條遞增變化,但它并不會引起xsjbqkb工作區(qū)的記錄指針的同步變化。在xsjbqkb工作區(qū)記錄始終指向第2條未動,所以顯示出來的姓名是不會變化的。

要想使多個工作區(qū)聯(lián)訪時指針發(fā)生同步變化,即“指針跟隨”,則必須使用表的臨時關(guān)聯(lián)。

2.建立表間的臨時關(guān)系

由于關(guān)系型數(shù)據(jù)庫系統(tǒng)的一個重要特點是表之間關(guān)聯(lián)的結(jié)果將是一種新的關(guān)系,因此把表之間的關(guān)聯(lián)也稱為表之間的關(guān)系。所謂建立表間的關(guān)系,是指利用表之間存在的被稱為“關(guān)系表達(dá)式”的共有字段將它們聯(lián)系起來。它分為永久關(guān)系和臨時關(guān)系。

永久關(guān)系將作為數(shù)據(jù)庫結(jié)構(gòu)的一部分被永久地保存下來。臨時關(guān)系與是否屬于同一數(shù)據(jù)庫表還是自由表無關(guān),這樣的表間關(guān)系可隨時建立或解除。臨時關(guān)系的最大特點是在建立了臨時關(guān)系的表之間將發(fā)生“指針跟隨”現(xiàn)象,當(dāng)父表的記錄指針移動時,子表的記錄指針將跟著移動到對應(yīng)的記錄上。下面將介紹表間的臨時關(guān)系。

1)建立表間臨時關(guān)系的命令

表的臨時關(guān)系用命令SETREPLATIONTO來創(chuàng)建。

【命令格式】

SETRELATIONTO[Expression1INTOnWorkArea1|cTableAlias1

[,Expression2INTOnWorkArea2|cTableAlias2...]

[INnWorkArea|cTableAlias][ADDITIVE]]

【功能】

該命令用于在當(dāng)前表文件(父表)與其它表文件(子表)之間建立臨時關(guān)聯(lián)。

【參數(shù)及子句說明】

●?Expression1、Expression2:指定在父表和子表之間建立臨時關(guān)系所用的關(guān)系表達(dá)式。它通常是用來控制子表索引的一個索引表達(dá)式。如果Expression是數(shù)值型的,則當(dāng)父表的記錄指針移動時它將計算出對應(yīng)值。子表的記錄指針將移動到Expression的值給出的記錄上。如果缺省所有參數(shù)和子句,則SETRELATIONTO將解除當(dāng)前工作區(qū)的所有臨時關(guān)系?!?INTOnWorkArea1|cTableAlias1、INTOnWorkArea2|cTableAlias2…:指定子表的工作區(qū)號或別名。

●?INnWorkArea|cTableAlias:指定父表的工作區(qū)或別名。IN子句允許創(chuàng)建關(guān)聯(lián)時,不必首先選擇父表所在工作區(qū)。如果缺省本子句,則父表必須在當(dāng)前工作區(qū)打開。

●?ADDITIVE:保留當(dāng)前工作區(qū)中已存在的所有關(guān)聯(lián)關(guān)系,并創(chuàng)建新的關(guān)聯(lián)關(guān)系。如果缺省ADDITIVE關(guān)鍵字,則首先取消原存在的關(guān)聯(lián)關(guān)系,再創(chuàng)建新的關(guān)聯(lián)關(guān)系。

2)建立兩個表臨時關(guān)聯(lián)的條件

(1)兩個表必須同時分別在不同的工作區(qū)打開。

(2)兩個表中都必須擁有“相同”的字段。所謂相同字段,并不是指字段名一定相同,而是指字段的值域必須一致,字段名可以不相同。

(3)表間關(guān)系可以有兩種方式,若在創(chuàng)建命令中表達(dá)式Expression是索引表達(dá)式,則子表必須用此索引表達(dá)式創(chuàng)建了索引,且此索引已打開。若Expression是數(shù)值表達(dá)式,則此時子表不必索引。

3)記錄指針的跟隨方式

兩個表建立關(guān)聯(lián)后,每當(dāng)父表中的記錄指針移動時,子表中的記錄指針便按指定的關(guān)聯(lián)條件而隨之移動,移動方法也分兩種情況。

(1)表若按表達(dá)式建立關(guān)聯(lián),此時在子表中便自動執(zhí)行一次SEEK命令。若在子表中找到與關(guān)鍵字表達(dá)式值相匹配的記錄,則子表的記錄指針就定位于與之匹配的首條記錄上;若找不到,則子表指針移至文件末尾。

(2)兩表若按數(shù)值表達(dá)式建立關(guān)聯(lián),則在子表中便自動執(zhí)行一次GO命令,將記錄指針定位于記錄號等于此數(shù)值表達(dá)式值的那條記錄上。

3.表間臨時關(guān)系的撤銷

如果命令中所有的選項都缺省,即采用:

SETRELATIONTO

的格式,就可撤消與當(dāng)前表文件已經(jīng)建立的一切關(guān)聯(lián)。

例5.13

顯示所有學(xué)生的學(xué)號、姓名、總分,其中學(xué)號、姓名來自父表xsjbqkb.dbf,學(xué)習(xí)成績來自子表xscjb.dbf。

CLEARALL

USExsjbqkb

USExscjbIN2

SELECT2

INDEXON學(xué)號TAG學(xué)號

SELECT1

SETRELATIONTO學(xué)號INTOxscjb

LIST學(xué)號,姓名,xscjb.總分

命令序列的執(zhí)行結(jié)果如圖5.9所示。圖5.9表間臨時關(guān)系建立后的聯(lián)訪結(jié)果

練習(xí)五

一、選擇題

1.隨表自動同時打開、更新、關(guān)閉、刪除的索引文件是()。

A)單索引文件B)非結(jié)構(gòu)復(fù)合索引文件

C)結(jié)構(gòu)復(fù)合索引文件D)二進(jìn)制索引文件

2.當(dāng)表用某個字段建立()索引后,在錄入數(shù)據(jù)時,可有效避免該字段錄入重復(fù)值。

A)候選索引 B)唯一索引

C)二進(jìn)制索引 D)普通索引

3.主索引和候選索引存儲在()索引文件中。

A)獨立 B)非

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論