Visual FoxPro程序設(shè)計:第13章 SQL_第1頁
Visual FoxPro程序設(shè)計:第13章 SQL_第2頁
Visual FoxPro程序設(shè)計:第13章 SQL_第3頁
Visual FoxPro程序設(shè)計:第13章 SQL_第4頁
Visual FoxPro程序設(shè)計:第13章 SQL_第5頁
已閱讀5頁,還剩131頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第13章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQLSQL是StructuredQueryLanguage的縮寫,即結(jié)構(gòu)化查詢語言。它是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。查詢是SQL語言的重要組成部分,SQL還包含數(shù)據(jù)定義、數(shù)據(jù)操作和數(shù)據(jù)控制功能等內(nèi)容。SQL已經(jīng)成為關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)數(shù)據(jù)語言,所以現(xiàn)在所有的關(guān)系數(shù)據(jù)庫管理系統(tǒng)都支持SQL。掌握SQL語法可以更加靈活地建立查詢和視圖。13.1SQL簡介

SQL語言來源于20世紀(jì)70年代IBM的一個被稱為SEQUEL(StructuredEnglishQueryLanguage)的研究項目。20世紀(jì)80年代,SQL由ANSI進(jìn)行了標(biāo)準(zhǔn)化,它包括了定義和操作數(shù)據(jù)的指令。由于它具有功能豐富、使用方式靈活、語言簡潔易學(xué)等突出特點,在計算機界深受廣大用戶歡迎,許多數(shù)據(jù)庫生產(chǎn)廠家都相繼推出各自支持SQL標(biāo)準(zhǔn)。1998年4月,ISO提出了具有完整性特征的SQL,并將其定為國際標(biāo)準(zhǔn),推薦它為標(biāo)準(zhǔn)關(guān)系數(shù)據(jù)庫語言。1990年,我國也頒布了《信息處理系統(tǒng)數(shù)據(jù)庫語言SQL》,將其定為中國國家標(biāo)準(zhǔn)。13.1.1SQL語言的主要特點(1)一體化語言。SQL提供了一系列完整的數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)操作和數(shù)據(jù)控制等方面的功能。用SQL可以實現(xiàn)數(shù)據(jù)庫生命周期中的全部活動,包括簡單地定義數(shù)據(jù)庫和表的結(jié)構(gòu),實現(xiàn)表中數(shù)據(jù)的錄入、修改、刪除、查詢和維護(hù),數(shù)據(jù)庫重構(gòu)、數(shù)據(jù)庫安全控制等一系列操作要求。(2)高度非過程化。SQL和其他數(shù)據(jù)操作語言不同,SQL是一種非過程性語言,它不必一步步地告訴計算機“如何”去做,用戶只需說明做什么操作,而不用說明怎樣做,不必了解數(shù)據(jù)存儲的格式及SQL命令的內(nèi)部,就可方便地對關(guān)系數(shù)據(jù)庫進(jìn)行操作。(3)語言簡潔。雖然SQL的功能很強大,但語法卻很簡單,只有為數(shù)不多的幾條命令。表13.1給出了分類的命令動詞,從該表可知,它的詞匯很少。初學(xué)者經(jīng)過短期的學(xué)習(xí)就可以使用SQL進(jìn)行數(shù)據(jù)庫的存取等操作,因此,易學(xué)易用是它的最大特點。(4)統(tǒng)一的語法結(jié)構(gòu)對待不同的工作方式。SQL語言可以直接在VFP的命令窗口以人機交互的方式使用,也可嵌入到程序設(shè)計中以程序方式使用,比如,SQL語言寫在.PRG文件中也能運行。在書寫的時候,如果語句太長,可以用“;”號換行。現(xiàn)在很多數(shù)據(jù)庫應(yīng)用開發(fā)工具都將SQL語言直接融入到自身的語言之中,使用起來更方便,VFP就是如此。這些使用方式為用戶提供了靈活的選擇余地。此外,盡管SQL的使用方式不同,但SQL語言的語法基本是一致的。13.1.2SQL語句的執(zhí)行SQL語句可以在命令窗口中執(zhí)行,也可以作為查詢或視圖(的內(nèi)容)被使用,還可以在程序文件被執(zhí)行。表13.1SQL命令動詞——————————————————————

SQL功能命令動詞——————————————————————數(shù)據(jù)查詢SELECT

數(shù)據(jù)定義CREATE、DROP、ALTER

數(shù)據(jù)操作INSERT、UPDATE、DELETE

數(shù)據(jù)控制GRANT、REVOKE——————————————————————13.2查詢功能數(shù)據(jù)庫中最常見的操作是數(shù)據(jù)查詢,也是SQL的核心。13.2.1SQL語法SQL給出了簡單而又豐富的查詢語句形式,SQL的查詢命令也稱作SELECT命令,它的基本形式由SELECT-FROM-WHERE查詢塊組成,多個查詢塊可以嵌套執(zhí)行。格式:

SELECT[ALL|DISTINCT][TOP〈表達(dá)式〉][〈別名〉]〈Select表達(dá)式〉[AS〈列名〉][,[〈別名〉]〈Select表達(dá)式〉[AS〈列名〉]…]

FORM[〈數(shù)據(jù)庫名〉!]〈表名〉[[AS]Local_Alias][[INNER|LEFT[OUTER]|RIGHT[OUTER]|FULL[OUTER]JOIN[〈數(shù)據(jù)庫名〉?。荨幢砻担郏跘S]Local_Alias][ON〈聯(lián)接條件〉]][INTO〈查詢結(jié)果〉|TOFILE〈文件名〉[ADDITIVE]|TOPRINTER[PROMPT]|TOSCREEN][PREFERENCEPreferenceName][NOCONSOLE][PLAIN][NOWAIT][WHERE〈聯(lián)接條件1〉[AND〈聯(lián)接條件2〉…][AND|OR〈篩選條件〉…]]

[GROUPBY〈組表達(dá)式〉][,〈組表達(dá)式〉…]][HAVING]〈篩選條件〉][UNION[ALL]〈SELECT命令〉][ORDERBY〈關(guān)鍵字表達(dá)式〉[ASC|DESC][,〈關(guān)鍵字表達(dá)式〉[ASC|DESC]…]]說明:SELECT-SQL命令的格式包括三個基本子句:SELECT子句、FROM子句、WHERE子句,還包括操作子句:ORDER子句、GROUP子句、UNION子句以及其他一些選項。1.SELECT子句SELECT子句用來指定查詢結(jié)果中的數(shù)據(jù)。其中:ALL選項:表示選出的記錄中包括重復(fù)記錄,這時缺省值;DISTINCT則表示選出的記錄中不包括重復(fù)記錄。TOP〈表達(dá)式〉選項:表示在符合條件的記錄中,選取指定數(shù)量或百分比(〈表達(dá)式〉)記錄。[〈別名〉]〈Select表達(dá)式〉[AS〈列名〉]選項中的別名是字段所在的表名;〈Select表達(dá)式〉,可以是字段名或字段表達(dá)式;〈列名〉用于指定輸出時使用的列標(biāo)題,可以不同于字段名?!碨elect表達(dá)式〉用一個*號來表示時,指定所有的字段。2.FROM子句用于指定查詢的表與聯(lián)接類型。其中:JOIN關(guān)鍵字用于聯(lián)接其左右兩個〈表名〉所指定的表。INNER|LEFT[OUTER]|RIGHT[OUTER]|FULL[OUTER]選項,指定兩表聯(lián)接時的聯(lián)接類型,聯(lián)接類型有4種,如表13.2所示。其中的OUTER選項,表示外部聯(lián)接,即允許滿足聯(lián)接條件的記錄,又允許不滿足聯(lián)接條件的記錄。若省略O(shè)UTER選項,效果不變。表13.2聯(lián)接類型——————————————————————————————————聯(lián)接類型意義——————————————————————————————————InnerJoin(內(nèi)部聯(lián)接)只有滿足聯(lián)接條件的記錄包含在結(jié)果中LeftOuterJoin(左聯(lián)接)左表某記錄與右表所有記錄比較字段值,若有滿足聯(lián)接條件的,則產(chǎn)生一個真實記錄;若都有滿足,則產(chǎn)生一個含.NULL值的記錄。直到右表所有記錄都比較完RightOuterJoin(右聯(lián)接)右表某記錄與左表所有記錄比較字段值,若有滿足聯(lián)接條件的,則產(chǎn)生一個真實記錄;若都不滿足,則產(chǎn)生一個含.NULL值的記錄。直到右表所有記錄都比較完FullJion(完全聯(lián)接)先按右聯(lián)接比較字段值,再按左聯(lián)接比較字段值。不列入重復(fù)記錄—————————————————————————————————————ON選項:用于指定聯(lián)接條件。INTO與TO選項:用于指定查詢結(jié)果的輸出去向,默認(rèn)查詢結(jié)果顯示在瀏覽窗口中。INTO選項中的〈查詢結(jié)果〉有3種,如表13.3所示。13.3查詢結(jié)果————————————————————目標(biāo)輸出形式—————————————————————

ARRAY〈數(shù)組〉查詢結(jié)果輸出到數(shù)組

CURSOR〈臨時表〉查詢結(jié)果輸出到臨時表

TABLE|DBF〈表名〉查詢結(jié)果輸出到表—————————————————————TOFILE選項:表示輸出到指定的文本文件,并取代原文件內(nèi)容。ADDITIVE選項:表示只添加新數(shù)據(jù),不清除原文件的內(nèi)容。TOPRINTER選項:表示輸出到打印機。PROMPT選項:表示打印前先顯示打印確認(rèn)框。TOSCREEN選項:表示輸出到屏幕。PLAIN選項:表示輸出時省略字段名。NOWAIT選項:表示顯示瀏覽窗口后程序繼續(xù)往下執(zhí)行。3.WHERE子句用來指定查詢的條件。其中的〈聯(lián)接條件〉指定一個字段,該字段連接FROM子句中的表。如果查詢中包含不止一個表,就應(yīng)該為第一個表后的每一個表指定連接條件。4.其他子句和選項GROUPBY子句:對記錄按〈組表達(dá)式〉值分組,常用于分組統(tǒng)計。HAVING子句:當(dāng)含有GROUPBY子句時,HAVING子句可用作記錄查詢的限制條件;無GROUPBY子句時,HAVING子句的作用如同WHERE子句。UNION子句:可以用UNION子句嵌入另一個SELECT-SQL命令,使這兩個命令的查詢結(jié)果合并輸,但輸出字段的類型和寬度必須一致。UNION子句默認(rèn)組合結(jié)果中排除重復(fù)行,使用ALL,則允許包含重復(fù)行。ORDERBY子句:指定查詢結(jié)查中記錄按〈關(guān)鍵字表達(dá)式〉排序,默認(rèn)升序。選項ASC表示升序,DESE表示降序。SELECT查詢命令的使用非常靈活,用它可以構(gòu)造各種各樣的查詢。本章將通過大量的實例來介紹SELECT命令的使用方法。13.2.2簡單查詢簡單查詢只含有基本子句,可有簡單的查詢條件。【13.1】在zgda表中,檢索所有字段。

SELECT*FROMzgda13.2.2簡單查詢【13.2】在zggz表中,檢索實發(fā)工資大于2000元的記錄。

SELECT編號,姓名,實發(fā)工資

FROMzggzWHERE實發(fā)工資>200013.2.2簡單查詢【13.3】在zgda表中,檢索所有職稱名稱。

SELECTDISTINCT職稱

FROMzgda【13.4】在zgda表中,檢索職稱是助教的記錄。

SELECT編號,姓名,職稱FROMzgdaWHERE職稱="助教"13.2.2簡單查詢【13.5】在zggz表中,檢索實發(fā)工資小于1000大于1800元的記錄。命令執(zhí)行結(jié)果如圖13.5所示。

SELECT編號,姓名,實發(fā)工資FROMzggzWHERE實發(fā)工資>1000AND實發(fā)工資<180013.2.3幾個特殊運算符在SQL語句中,WHERE子句后面的聯(lián)接條件,除了可以使用VFP語言中的關(guān)系表達(dá)式以及邏輯表達(dá)外,還可以使用幾個特殊運算符:(1)[NOT]IN:表示[不]在…之中。(2)[NOT]BETWEEN…AND…:表示[不]在…之間。(3)[NOT]LIKE:表示[不]與…匹配。13.2.3幾個特殊運算符下面以實例來說明此用法。說明:(1)NOT運算符來設(shè)計否定條件。(2)LIKE運算符提供兩種字符串匹配方式,一種是使用下劃線符號“_”,匹配一個和任意字符,另一種是使用百分號“%”,匹配0個或多個任意字符。(3)IN運算符,格式為IN(常量1,常量2,…)。含義為查找和常量相等的值。13.2.3幾個特殊運算符【13.6】在zgda表中,檢索性別是男的記錄。

SELECTDISTINCT編號,姓名,性別FROMzgdaWHERE性別LIKE"男"可以使用NOT運算符來設(shè)計否定條件,檢索性別不是男的記錄。

SELECTDISTINCT編號,姓名,性別FROMzgdaWHERENOT(性別

LIKE"男")13.2.3幾個特殊運算符【13.7】在zgda表中,檢索所有姓劉的記錄。

SELECT編號,姓名FROMzgdaWHERE姓名LIKE"劉%"13.2.3幾個特殊運算符【13.8】在zgda表中,檢索所有姓陳和姜的記錄。

SELECT編號,姓名FROMzgdaWHERE姓名IN("陳","姜")上式可以改為VFP條件,執(zhí)行結(jié)果是一樣的。

SELECT編號,姓名

FROMzgdaWHERE姓名="陳"

OR姓名="姜"圖13.813.2.4簡單的聯(lián)接查詢聯(lián)接是關(guān)系的基本操作之一,聯(lián)接查詢是一種基于多個關(guān)系的查詢?!?3.9】在zgda表和zggz表中,檢索實發(fā)工資大于2000元的記錄。3.9所示。

SELECTzgda.編號,zgda.姓名,zggz.實發(fā)工資FROMzgda,zggz;WHERE(實發(fā)工資>2000)AND(zgda.編號=zggz.編號)

zgda.編號=zggz.編號&&編號是聯(lián)接的條件13.2.4簡單的聯(lián)接查詢【13.10】在zgda表和zggz表中,檢索職稱是講師,并且實發(fā)工資大于1900元的記錄

SELECTzgda.編號,zgda.姓名,zgda.職稱,zggz.實發(fā)工資FROMzgda,zggz;WHERE(職稱="講師")AND(實發(fā)工資>1900)AND(zgda.編號=zggz.編號)13.2.5嵌套查詢嵌套查詢是基于多個關(guān)系的查詢,這類查詢所要求的結(jié)果出自一個關(guān)系,但相關(guān)條件卻涉及多個關(guān)系。這時就需要使用SQL的嵌套查詢功能。格式:〈表達(dá)式〉〈比較運算符〉[ANY|ALL|SOME](〈子查詢〉)

[NOT]EXISTS(〈子查詢〉)說明:(1)其中的〈比較運算符〉除了在第6章介紹的關(guān)系運算符之外,還有前面提到的特殊運算符。(2)ANY、ALL、SOME是量詞,其中ANY和SOME是同義詞,在進(jìn)行比較運算時只要子查詢中有一條記錄為真,則結(jié)果為真;而ALL則要求子查詢中的所有記錄都為真,結(jié)果才為真。(3)EXISTS是謂詞,用來檢查子查詢中是否有結(jié)果返回(是否為空)。NOTEXISTS表示是空的結(jié)果集。13.2.5嵌套查詢?yōu)榱擞懻撉短撞樵?在此引入一個訂貨管理數(shù)據(jù)庫,此數(shù)據(jù)庫涉及4個表(4個關(guān)系),即倉庫表、職工表、訂購單表、供應(yīng)商表,4個表的內(nèi)容分別如圖13.11、13.12、13.13、13.14所示。13.2.5嵌套查詢【13.11】在倉庫表和職工表中,檢索哪些城市至少有一個倉庫的職工工資為1250元SELECT城市FROM倉庫WHERE倉庫號

IN;(SELECT倉庫號

FROM職工WHERE工資=1250)在這個命令中含有兩個SELECT-FROM-WHERE查詢塊,即內(nèi)層查詢塊和外層查詢塊,內(nèi)層查詢塊檢索到的倉庫號值是WH1和WH2,這里IN相當(dāng)于集合運算符∈。這樣就可寫出等價的命令:

SELECT城市FROM倉庫WHERE倉庫號IN("WH1","WH2")13.2.5嵌套查詢【13.12】在倉庫表和職工表中,檢索所有職工的工資都多于為1210元的倉庫信息。

SELECT*FROM倉庫WHERE倉庫號NOTIN;(SELECT倉庫號FROM職工WHERE工資<=1210)13.2.5嵌套查詢內(nèi)層SELECT-FROM-WHERE查詢塊指出所有職工的工資少于或等于1210元的倉庫的倉庫號值的集合,在這里該集合只有一個值“WH1”;然后從倉庫關(guān)系中檢索元組的倉庫號屬性值不在該集合中的每個元組。有的讀者也許已經(jīng)注意到剛才的檢索出現(xiàn)了錯誤,盡管在“武漢”的“WH4”倉庫還沒有職工,但該倉庫的信息也被檢索出來了。所以必須認(rèn)真分析檢索要求,寫出正確的SQL命令。如果要求排除那些還沒有職工的倉庫,檢索要求可以敘述為:檢索所有職工的工資都多于1210元的倉庫的信息,并且該倉庫至少要有一名職工。這樣描述就很清楚了,因為我們對沒有職工的倉庫不感興趣。這樣,寫出的SQL命令也就復(fù)雜一些了:

SELECT*FROM倉庫

WHERE倉庫號NOTIN;(SELECT倉庫號FROM職工

WHERE工資<=1210);

AND倉庫號IN(SELECT倉庫號FROM職工)這樣內(nèi)層是兩個并列的查詢,在結(jié)果中將不包含沒有職工的倉庫信息。13.2.5嵌套查詢【13.13】檢索出和職工E4掙同樣工資的所有職工。

SELECT職工號FROM職工

WHERE工資=;

(SELECT工資

FROM職工

WHERE職工號="E4")13.2.5嵌套查詢【13.14】檢索出工資在1220元到1240元范圍內(nèi)的職工信息。這個查詢的條件值是在什么范圍之內(nèi),顯然可以用BETWEEN…AND…,為此有如下查詢語句:

SELECT*FROM職工WHERE工資

BETWEEN1220AND1240這里BETWEEN…AND…意思是在“…和…之間”,這個查詢的條件等價于:(工資>=1220)AND(工資<=1240)顯然使用BETWEEN…AND…表達(dá)條件更清晰、更簡潔。假如找出工資不在1220元和1240元之間的全部職工信息,可以用命令:

SELECT*FROM職工WHERE工資NOTBETWEEN1220AND1240命令執(zhí)行結(jié)果如圖13.20所示。13.2.5嵌套查詢【13.15】在供應(yīng)商表中,檢索出全部公司的信息,不要工廠或其他供應(yīng)商的信息。這是一個字符串匹配的查詢,顯然應(yīng)該使用LIKE運算符:

SELECT*FROM供應(yīng)商WHERE供應(yīng)商名LIKE"%公司"這里的LIKE是字符串匹配運算符,通配符“%”表示0個或多個字符,另外還有一個通配符“-”表示一個字符。13.2.5嵌套查詢【13.16】在供應(yīng)商表中,找出不在北京的全部供應(yīng)商的信息。

SELECT*FROM供應(yīng)商

WHERE地址!="北京"在SQL中,“不等于”用“!=”表示。另外還可以用否定運算符NOT寫出等價命令:

SELECT*FROM供應(yīng)商

WHERENOT(地址="北京")NOT的應(yīng)用范圍很廣,比如,可以有NOTIN(例13.12)、NOTBETWEEN等。13.2.6排序SQL中排序操作使用ORDERBY子句。格式:ORDERBY〈關(guān)鍵字表達(dá)式1〉[ASC|DESC][,〈關(guān)鍵字表達(dá)式2〉[ASC|DESC]…]說明:ASC為升序(默認(rèn)為升序),DESC為降序。允許按一列或多列排序。13.2.6排序【13.17】在職工表中,按職工的工資值升序檢索出全部職工的信息。

SELECT*FROM職工ORDERBY工資這里ORDERBY是排序子句,如果需要將結(jié)果按降序排列,只要加上DESC。SELECT*FROM職工ORDERBY工資

DESC13.2.6排序【13.18】在職工表中,先按倉庫號排序,再按工資排序,并輸出全部職工信息。

SELECT*FROM職工ORDERBY倉庫號,工資這里一個按多列排序的例子。說明:ORDERBY是對最終的查詢結(jié)果進(jìn)行排序,不可以在子查詢中使用該短語。13.2.7簡單的計算查詢SQL語言是完備的,也就是說,只要數(shù)據(jù)是按關(guān)系方式存入數(shù)據(jù)庫的,就能構(gòu)造合適的SQL命令把它檢索出來。事實上,SQL不僅具有一般的檢索能力,而且還有計算方式的檢索,比如檢索職工的平均工資、檢索某個倉庫中職工的最高工資值等。用于計算檢索的函數(shù)有:(1)COUNT—計數(shù)(2)SUM—求和(3)AVG—計算平均值(4)MAX—求最大值(5)MIN—求最小值這些函數(shù)可以用在SELECT短語中對查詢結(jié)果進(jìn)行計算。13.2.7簡單的計算查詢【13.19】在供應(yīng)商表中,找出供應(yīng)商所在地的數(shù)目。

SELECTCOUNT(DISTINCT地址)FROM供應(yīng)商參見前面給出的供應(yīng)商的記錄值,其中共有5個地址:北京、西安、鄭州、上海和深圳。所以結(jié)果為5。說明,除非對關(guān)系中的元組個數(shù)進(jìn)行計數(shù),一般應(yīng)用COUNT函數(shù)應(yīng)該使用DISTINCT。例如:

SELECTCOUNT(*)FROM供應(yīng)商將給出供應(yīng)商關(guān)系中的記錄數(shù)是6個。13.2.7簡單的計算查詢【13.20】在職工表中,求支付的工資總數(shù)。

SELECTSUM(工資)FROM職工結(jié)果是:6160。這個結(jié)果是職工關(guān)系中的工資值的總和,它并不管是否有重復(fù)值。這時若使用命令:

SELECTSUM(DISTINCT工資)

FROM職工將得出錯誤的結(jié)果4910。原因是DISTINCT命令去掉重復(fù)值1250。13.2.7簡單的計算查詢【13.21】在職工表和倉庫表中,求北京和上海的倉庫職工的工資總和。

SELECTSUM(工資)FROM職工WHERE倉庫號IN;(SELECT倉庫號FROM倉庫WHERE城市="北京"

OR城市="上海")13.2.7簡單的計算查詢13.22在倉庫表和職工表中,求所有職工的工資都多于1210元的倉庫的平均面積。

SELECTAVG(面積)FROM倉庫

WHERE倉庫號NOTIN;(SELECT倉庫號

FROM職工WHERE工資<=1210)結(jié)果是:366.67這里要注意,以上結(jié)果的運算包含了尚沒有職工的WH4倉庫。如果要排除沒有職工的倉庫,以上語句應(yīng)該改為:

SELECTAVG(面積)FROM倉庫WHERE倉庫號

NOTIN;(SELECT倉庫號FROM職工

WHERE工資<=1210);

AND倉庫號IN(SELECT倉庫號FROM職工)13.2.7簡單的計算查詢【13.23】在職工表中,求在WH2倉庫工作的職工的最高工資值。

SELECTMAX(工資)FROM職工

WHERE倉庫號="WH2"結(jié)果是:1250與MAX函數(shù)相對應(yīng)的是MIN函數(shù)(求最小值)。比如,求最低工資值可以有如下命令:

SELECTMIN(工資)FROM職工

WHERE倉庫號="WH2"13.2.8分組與計算查詢上面幾個例子是對整個關(guān)系的計算查詢,而利用GROUPBY子句可以進(jìn)行分組計算查詢,使用得更加廣泛。格式:GROUPBY〈分組字段名〉[〈分組字段名〉…][HAVING〈過濾條件〉]可以按一列或多列分組,還可以用HAVING進(jìn)一步限定分組的條件。下面是幾個分組計算查詢的例子。13.2.8分組與計算查詢【13.24】在職工表中,求每個倉庫的職工的平均工資。

SELECT倉庫號,AVG(工資)FROM職工GROUPBY倉庫號在這個查詢中,首先按倉庫號屬性進(jìn)行分組,然后再計算每個倉庫的平均工資。GROUPBY子句一般跟在WHERE子句之后,沒有WHERE子句時,跟在FROM子句之后。另外,還可以根據(jù)多個屬性進(jìn)行分組。在分組查詢時,有時要求分組滿足某個條件時才檢索,這時可以用HAVING子句來限定分組。13.2.8分組與計算查詢【13.25】在職工表中,求至少有兩個職工的每個倉庫的平均工資。

SELECT倉庫號,COUNT(*),AVG(工資)FROM職工;

GROUPBY倉庫號HAVINGCOUNT(*)>=2HAVING子句總是跟在GROUPBY子句之后,不可以單獨使用。HAVING子句和WHERE子句不矛盾,在查詢中是先用WHERE子句限定元組,然后再進(jìn)行分組,最后再用HAVING子句限定分組。說明:HAVING子句和WHERE子句的區(qū)別:WHERE子句是用來指定表中各行所應(yīng)滿足的條件,而HAVING子句是用來指定每一分組所滿足的條件,只有滿足HAVING條件的那些組才能在結(jié)果中被顯示。13.2.9別名的使用在聯(lián)接操作中,經(jīng)常需要使用關(guān)系名作前綴,有時這樣顯得很麻煩。因此,SQL允許在FROM短語中為關(guān)系名定義別名。格式:〈關(guān)系名〉〈別名〉例如:如下的聯(lián)接語句是一個基于4個關(guān)系的聯(lián)接查詢,其中必須使用關(guān)系名作前綴:

SELECT供應(yīng)商名FROM供應(yīng)商,訂購單,職工,倉庫;

WHERE地址="北京"AND城市="北京";

AND供應(yīng)商.供應(yīng)商號=訂購單.供應(yīng)商號;

AND訂購單.職工=職工.職工號;

AND職工.倉庫號=倉庫.倉庫號13.2.9別名的使用在上面的查詢中,如果使用別名就會簡單一些,如下是使用了別名的同樣的聯(lián)接查詢語句:

SELECT供應(yīng)商名FROM供應(yīng)商S,訂購單

P,職工E,倉庫W;WHERE地址="北京"AND城市="北京";

ANDS.供應(yīng)商號=P.供應(yīng)商號;

ANDP.職工號=E.職工號;

ANDE.倉庫號=W.倉庫號FROM供應(yīng)商S,訂購單P,職工E,倉庫W,用S、P、E和W分別代表供應(yīng)商表、訂購單表、職工表和倉庫表。說明:在嵌套的SQL子句中不能使用外層定義的別名。13.2.10內(nèi)外層互相關(guān)嵌套查詢嵌套查詢都是外層查詢依賴于內(nèi)層查詢的結(jié)果,而內(nèi)層查詢與外層查詢無關(guān)。事實上,有時也需要內(nèi)、外層互相關(guān)的查詢,這時內(nèi)層查詢的條件需要外層查詢提供值,而外層查詢的條件需要內(nèi)層查詢的結(jié)果。13.2.10內(nèi)外層互相關(guān)嵌套查詢【13.26】在訂購單表中,列出每個職工經(jīng)手的具有最高總金額的訂購單信息。這里先給出相應(yīng)的查詢語句,然后再作必要的解釋。

SELECTout.職工號,out.供應(yīng)商號,out.訂購單號,out.訂購日期,out.總金額;

FROM訂購單outWHERE總金額=(SELECTMAX(總金額)FROM訂購單inner1;WHEREout.職工號=inner1.職工號)13.2.10內(nèi)外層互相關(guān)嵌套查詢在這個查詢中,外層查詢和內(nèi)層查詢使用同一個關(guān)系:訂購單表,給他們分別指定別名out和inner1。外層查詢提供out關(guān)系中每個元組的職工號值給內(nèi)層查詢使用;內(nèi)層查詢利用這個職工號值,確定該職工經(jīng)手的具有最高總金額的訂購單和總金額;隨后外層查詢再根據(jù)out關(guān)系的同一元組的總金額與該總金額值進(jìn)行比較,如果相等,則該元組被選擇。13.2.11使用量詞和謂詞的查詢前面已經(jīng)使用過和嵌套查詢或子查詢有關(guān)的IN和NOTIN運算符,除此之外還有兩類和子查詢有關(guān)的運算符。格式:〈表達(dá)式〉〈比較運算符〉[ANY|ALL|SOME](子查詢)[NOT]EXISTS(子查詢)ANY、ALL和SOME是量詞,其中ANY和SOME是同義詞,在進(jìn)行比較運算時只要子查詢中有一行能使結(jié)果為真,則結(jié)果就為真。ALL則要求子查詢中的所有行都使結(jié)果為真時,結(jié)果才為真。EXISTS是謂詞,EXISTS或NOTEXISTS是用來檢查在子查詢中是否有結(jié)果返回,即存在元組或不存在元組。13.2.11使用量詞和謂詞的查詢下面通過幾個例子來理解這些量詞和謂詞在查詢中的用法和用途?!?3.27】在倉庫表和職工表中,檢索哪些倉庫中還沒有職工的倉庫的信息。13.2.11使用量詞和謂詞的查詢這里的查詢是沒有職工或不存在職工,所以可以使用謂詞NOTEXISTS。SELECT*FROM倉庫WHERENOTEXISTS;(SELECT*FROM職工WHERE倉庫號=倉庫.倉庫號)說明:這里的內(nèi)層查詢引用了外層查詢的表,只有這樣使用謂詞EXISTS或NOTEXISTS才有意義。所以這類查詢也都是內(nèi)、外層互相關(guān)嵌套查詢。以上的查詢命令等價于如下查詢命令:

SELECT*FROM倉庫WHERE倉庫號NOTIN(SELECT倉庫號FROM職工)13.2.11使用量詞和謂詞的查詢【13.28】在倉庫表和職工中,檢索哪些倉庫中至少已經(jīng)有一個職工的倉庫的信息。

SELECT*FROM倉庫

WHEREEXISTS;(SELECT*FROM職工WHERE倉庫號=倉庫.倉庫號)說明:[NOT]EXISTS只是判斷子查詢中是否有或沒有結(jié)果返回,它本身并沒有任何運算或比較。13.2.11使用量詞和謂詞的查詢【13.29】在職工表中,檢索有職工的工資大于或等于WH1倉庫中任何一名職工工資的倉庫號。這個查詢可以使用ANY或SOME量詞。

SELECTDISTINCT倉庫號FROM職工WHERE工資>=ANY;(SELECT工資FROM職工

WHERE倉庫號="WH1")它等價于:

SELECTDISTINCT倉庫號FROM職工WHERE工資>=;

(SELECTMIN(工資)FROM職工WHERE倉庫號="WH1")13.2.11使用量詞和謂詞的查詢【13.30】在職工表中,檢索有職工的工資大于或等于WH1倉庫中所有職工工資的倉庫號。這個查詢使用ALL量詞。

SELECTDISTINCT倉庫號FROM職工WHERE工資>=ALL;(SELECT工資FROM職工WHERE倉庫號="WH1")它等價于:

SELECTDISTINCT倉庫號FROM職工

WHERE工資>=;(SELECTMAX(工資)FROM職工WHERE倉庫號="WH1")13.2.12超聯(lián)接查詢SQL中FROM子句后的聯(lián)接稱為超聯(lián)接,超聯(lián)接有四種形式。格式:FROM〈表名〉[[INNER|LEFT[OUTER]|RIGHT[OUTER]|FULL[OUTER]JOIN[〈數(shù)據(jù)庫名〉!]〈表名〉[[AS]Local_Alias][ON〈聯(lián)接條件〉]]說明:OUTER關(guān)鍵字可被省略,包含OUTER強調(diào)這是一個外連接(outerjoin)。13.2.12超聯(lián)接查詢下面我們分別以幾個實例來說明這四種超聯(lián)接的含義及區(qū)別。1.內(nèi)部聯(lián)接使用INNERJOIN形式的聯(lián)接稱為內(nèi)部聯(lián)接,INNERJOIN等價于JOIN。INNERJOIN與普通聯(lián)接相同:只有滿足條件的記錄才出現(xiàn)在查詢結(jié)果中。內(nèi)部聯(lián)接是滿足聯(lián)接條件的記錄才出現(xiàn)在查詢結(jié)果中。13.2.12超聯(lián)接查詢【13.31】將倉庫表和職工表的職工號字段聯(lián)接在一起。

SELECT倉庫.倉庫號,城市,面積,職工號,工資;

FROM倉庫JOIN職工ON倉庫.倉庫號=職工.倉庫號如下兩種命令格式也是等價的:

SELECT倉庫.倉庫號,城市,面積,職工號,工資;

FROM倉庫INNERJOIN職工ON倉庫.倉庫號=職工.倉庫號和

SELECT倉庫.倉庫號,城市,面積,職工號,工資;

FROM倉庫,職工WHERE倉庫.倉庫號=職工.倉庫號13.2.12超聯(lián)接查詢2.左聯(lián)接使用LEFT[OUTER]JOIN稱為左聯(lián)接,在查詢結(jié)果中包含JOIN左側(cè)表中的所有記錄,以及JOIN右側(cè)表中匹配的記錄。左聯(lián)接,即除滿足聯(lián)接條件的記錄出現(xiàn)在查詢結(jié)果中外,第一個表中不滿足聯(lián)接條件的記錄也出現(xiàn)在查詢結(jié)果中。13.2.12超聯(lián)接查詢【13.32】將倉庫表和職工表的職工號和工資字段聯(lián)接在一起。

SELECT倉庫.倉庫號,城市,面積,職工號,工資;

FROM倉庫LEFTJOIN職工;

ON倉庫.倉庫號=職工.倉庫號從以上查詢結(jié)果中可以看到,首先以左邊表即A表中的第一條記錄為準(zhǔn),在B表中查詢,找到了,則顯示,找不到相應(yīng)的字段以NULL顯示,本例中有相應(yīng)的值。以下記錄也是按照這種方法進(jìn)行查詢的。13.2.12超聯(lián)接查詢3.右聯(lián)接使用RIGHT[OUTER]JOIN稱為右聯(lián)接,在查詢結(jié)果中包含JOIN右側(cè)表中的所有記錄,以及JOIN左側(cè)表中匹配的記錄。為了看到右聯(lián)接和全聯(lián)接的效果,假設(shè)在職工表中插入了如下一條記錄:"WH8","E8",1200右聯(lián)接,即除滿足聯(lián)接條件的記錄出現(xiàn)在查詢結(jié)果中外,第二個表中不滿足聯(lián)接條件的記錄也出現(xiàn)在查詢結(jié)果中。13.2.12超聯(lián)接查詢【13.33】將倉庫表和職工表的職工號和工資字段聯(lián)接在一起。

SELECT倉庫.倉庫號,城市,面積,職工號,工資;

FROM倉庫RIGHTJOIN職工ON倉庫.倉庫號=職工.倉庫號實際上職工“E8”所在的倉庫并不存在,這在實際應(yīng)用中是不允許的。13.2.12超聯(lián)接查詢4.完全聯(lián)接FULL[OUTER]JOIN稱為完全聯(lián)接,在查詢結(jié)果中包含JOIN兩側(cè)所有的匹配記錄和不匹配的記錄。完全聯(lián)接,即除滿足聯(lián)接條件的記錄出現(xiàn)在查詢結(jié)果中外,兩個表中不滿足聯(lián)接條件的記錄也出現(xiàn)在查詢結(jié)果中。13.2.12超聯(lián)接查詢【13.34】將倉庫表和職工表的職工號和工資字段聯(lián)接在一起。

SELECT倉庫.倉庫號,城市,面積,職工號,工資;

FROM倉庫FULLJOIN職工ON倉庫.倉庫號=職工.倉庫號說明:VisualFoxPro的SQLSELECT語句的聯(lián)接格式只能實現(xiàn)兩個表的聯(lián)接,如果要實現(xiàn)多個表的聯(lián)接,還需要使用標(biāo)準(zhǔn)格式。13.2.12超聯(lián)接查詢例如下面是一個基于4個關(guān)系的聯(lián)接查詢。SELECT倉庫.倉庫號,城市,供應(yīng)商名,地址;

FROM供應(yīng)商,訂購單,職工,倉庫;

WHERE供應(yīng)商.供應(yīng)商號=訂購單.供應(yīng)商號;

AND訂購單.職工號=職工.職工號;

AND職工.倉庫號=倉庫.倉庫號這樣的查詢用VisualFoxPro的專門格式就寫不出來了。13.2.13集合的并運算使用UNION子句可以進(jìn)行集合的并運算,即可以將兩個SELECT語句的查詢結(jié)果合并成一個查詢結(jié)果。當(dāng)然,要求進(jìn)行并運算的兩個查詢結(jié)果具有相同的字段個數(shù),并且對應(yīng)字段的值要具有相同的數(shù)據(jù)類型和取值范圍。格式:〈Selcct命令1〉UNION[ALL]〈Selcct命令2〉說明:(1)可以使用多個UNION子句,ALL選項防止刪除合并結(jié)果中重復(fù)的行(記錄)。(2)不能使用UNION來組合子查詢。(3)只有最后的〈Selcct命令〉中可以包含ORDERBY子句,而且必須按編號指出排序的列(它將影響整個結(jié)果)。13.2.13集合的并運算【13.35】在倉庫表中,顯示城市為北京和上海的倉庫信息。

SELECT*FROM倉庫

WHERE城市="北京";

UNION;SELECT*FROM倉庫WHERE城市="上海"13.2.14查詢輸出去向1.顯示部分結(jié)果格式:TOP〈表達(dá)式〉[PERCENT]功能:顯示需要滿足條件的前幾個記錄。說明:(1)〈表達(dá)式〉是數(shù)字表達(dá)式,當(dāng)不使用PERCENT時,〈表達(dá)式〉是1至32767間的整數(shù),說明顯示前幾個記錄。(2)當(dāng)使用PERCENT時,〈表達(dá)式〉是0.01至99.99間的實數(shù),說明顯示結(jié)果中前百分之幾的記錄。需要注意的是TOP短語要與ORDERBY短語同時使用才有效。13.2.14查詢輸出去向【13.36】在職工表中,顯示工資最高的三位職工的信息。

SELECT*TOP3FROM職工

ORDERBY工資DESC【13.37】在職工表中,顯示工資最低的那30%職工的信息。命令執(zhí)行結(jié)果如圖13.47所示。

SELECT*TOP30PERCENTFROM職工ORDERBY工資13.2.14查詢輸出去向2.將查詢結(jié)果存放到數(shù)組中格式:INTOARRAY〈數(shù)組名〉功能:將查詢結(jié)果存放到數(shù)組中。說明:〈數(shù)組名〉可以是任意的數(shù)組變量名。一般將存放查詢結(jié)果的數(shù)組作為二維數(shù)組來使用,每行一條記錄,每列對應(yīng)于查詢結(jié)果一列。查詢結(jié)果存放在數(shù)組中,可以非常方便地在程序中使用。13.2.14查詢輸出去向【13.38】將查詢到的職工信息存放在數(shù)組T1中。

SELECT*FROM職工INTOARRAYT1T1(1,1)存放的是第一條記錄的倉庫號字段值,T1(1,3)存放的是第一條記錄的工資字段值等。13.2.14查詢輸出去向3.將查詢結(jié)果存放在臨時文件中格式:INTOCURSOR〈臨時表〉功能:將查詢結(jié)果存放到臨時數(shù)據(jù)庫文件中。說明:〈臨時表〉是臨時文件名,該短語產(chǎn)生的臨時文件是一個只讀dbf文件,當(dāng)查詢結(jié)束后該臨時文件是當(dāng)前文件,可能像一般的dbf文件一樣使用,但僅是只讀。當(dāng)關(guān)閉文件時該文件將自動刪除。13.2.14查詢輸出去向【13.39】將查詢到的職工表信息存放在臨時dbf文件T2中。

SELECT*FROM職工

INTOCURSORT2一般利用INTOCURSOR短語存放一些臨時結(jié)果,比如一些復(fù)雜的匯總可能需要分階段完成,需要根據(jù)幾個中間結(jié)果再匯總等,這時利用該短語存放中間結(jié)果就非常合適,當(dāng)使用完后臨時文件會自動刪除。13.2.14查詢輸出去向4.將查詢結(jié)果存放到永久表中格式:

INTODBF|TABLE〈表名〉功能:可以將查詢結(jié)果存放到永久表中(dbf文件)。13.2.14查詢輸出去向【13.40】在職工表中,顯示工資最高的三位職工的信息,查詢結(jié)果存放在表Al中。

SELECT*TOP3FROM職工

INTOTABLEA1ORDERBY工資DESC13.2.14查詢輸出去向5.將查詢結(jié)果存放到文本文件中格式:TOFILE〈文本文件名〉[ADDITIVE]功能:可以將查詢結(jié)果存放到文本文件中。說明:文本文件名(默認(rèn)擴展名是txt),如果使用ADDITIVE選項,結(jié)果將追加在原文件的尾部,否則將覆蓋原有文件。13.2.14查詢輸出去向【13.41】將查詢結(jié)果以文本的形式存儲在文本文件A2.txt中。

SELECT*TOP3FROM職工

TOFILFA2ORDERBY工資DESC如果TO短語和INTO短語同時使用,則TO短語將會被忽略。13.2.14查詢輸出去向6.將查詢結(jié)果直接輸出到屏幕格式:TOSCREEN功能:將查詢結(jié)果輸出到屏幕。13.2.14查詢輸出去向7.將查詢結(jié)果直接輸出到打印機格式:TOPRINTER[PROMPT]功能:將查詢結(jié)果輸出到打印機,如果使用了PROMPT選項,在開始打印之前會打開打印機設(shè)置對話框。FROM子句中INTO與TO選項,用于指定查詢結(jié)果的輸出去向,默認(rèn)查詢結(jié)果顯示在瀏覽窗口中。INTO選項中的〈查詢結(jié)果〉有3種:ARRAY〈數(shù)組〉、CURSOR〈臨時表〉、TABLE|DBF〈表名〉。TO選項也有3種:文本文件、屏幕、打印機。13.2.14查詢輸出去向本節(jié)用大量實例介紹了SQLSELECT語句的使用方法,這些實例都可以在VisualFoxPro下執(zhí)行。掌握SQLSELECT不僅對學(xué)好、用好VisualFoxPro至關(guān)重要,也是以后使用其他數(shù)據(jù)庫或開發(fā)數(shù)據(jù)庫應(yīng)用程序的基礎(chǔ)。13.3操作功能SQL語言的操作功能包括對表中數(shù)據(jù)的增加、刪除和更新操作。13.3.1插入在一個表的尾部追加數(shù)據(jù)時,要用到插入功能,SQL的插入命令包括以下3種格式:格式:INSERTINTO〈表名〉[(〈字段名1〉[,〈字段名2〉,…])]

VALUES(〈表達(dá)式1〉)[,〈表達(dá)式2〉,…])和

INSERTINTO〈表名〉

FROMARRAY〈數(shù)組名〉

INSERTINTO〈表名〉FROMMEMVAR功能:3種格式都是在指定的表的表尾添加一條新記錄。13.3.1插入說明:(1)第1種格式其值為VALUES后面的表達(dá)式的值。當(dāng)需要插入表中所有字段的數(shù)據(jù)時,表名后面的字段名可以缺省,但插入數(shù)據(jù)的格式必須與表的結(jié)構(gòu)完成吻合;若只需要插入表中某些字段的數(shù)據(jù),就需要列出插入數(shù)據(jù)的字段,當(dāng)然相應(yīng)表達(dá)式的數(shù)據(jù)位置會與之對應(yīng)。(2)第2種格式新記錄的值是指定的數(shù)組中各元素的數(shù)據(jù)。數(shù)組中各元素與表中各字段順序?qū)?yīng)。如果數(shù)組中元素的數(shù)據(jù)類型與其對應(yīng)的字段類型不一致,則新記錄對應(yīng)的字段為空值;如果表中字段個數(shù)大于數(shù)組元素的個數(shù),則多的字段為空值。(3)第3種格式新記錄的值是指定的內(nèi)存變量的值。添加的新記錄的值是與指定表各字段名同名的內(nèi)存變量的值,如果同名的內(nèi)存變量不存在,則相應(yīng)的字段為空。VisualFoxPro支持兩種SQL插入命令的格式,第一種格式是標(biāo)準(zhǔn)格式,第二種格式是VisualFoxPro的特殊格式。13.3.1插入【13.42】在訂購單表中,插入元組("E7","S4","OR01",09/25/03)。INSERTINTO訂購單(職工號,供應(yīng)商號,訂購單號,訂購日期,總金額)

VALUES("E7","S4","OR01",{^2003-09-25},1200)其中“{^2003-09-25}”是日期型字段訂購日期的值。圖13.4813.3.1插入假設(shè)供應(yīng)商尚未確定,那么只能先插入職工號和訂購單號兩個屬性的值,這時可用如下命令:

INSERTINTO訂購單(職工號,訂購單號)VALUES("E7","OR01")這時另外三個屬性的值為空。13.3.1插入下面用一組命令來說明INSERTINTO…FROMARRAY的使用方式:

USE訂購單&&打開訂購單

SCATTERtoA1&&將當(dāng)前記錄讀到數(shù)組A1COPYSTRUCTURETOA2&&拷貝訂購單表的結(jié)構(gòu)到A2INSERTINTOA2FROMARRAYA1&&從數(shù)組A1插入一條記錄到A2SELECTA2&&切換到A2的工作區(qū)

BROWSE&&用BROWSE命令驗證插入的結(jié)果

USE&&關(guān)閉A2.dbf文件

DELETEFILEA2.dbf&&刪除A2.dbf文件13.3.1插入在一個表的尾部追加數(shù)據(jù)時,要用到插入功能,SQL的插入命令包括以下3種格式:格式:INSERTINTO〈表名〉[(〈字段名1〉[,〈字段名2〉,…])]

VALUES(〈表達(dá)式1〉)[,〈表達(dá)式2〉,…])和

INSERTINTO〈表名〉

FROMARRAY〈數(shù)組名〉

INSERTINTO〈表名〉FROMMEMVAR功能:3種格式都是在指定的表的表尾添加一條新記錄。13.3.1插入說明:(1)第1種格式其值為VALUES后面的表達(dá)式的值。當(dāng)需要插入表中所有字段的數(shù)據(jù)時,表名后面的字段名可以缺省,但插入數(shù)據(jù)的格式必須與表的結(jié)構(gòu)完成吻合;若只需要插入表中某些字段的數(shù)據(jù),就需要列出插入數(shù)據(jù)的字段,當(dāng)然相應(yīng)表達(dá)式的數(shù)據(jù)位置會與之對應(yīng)。(2)第2種格式新記錄的值是指定的數(shù)組中各元素的數(shù)據(jù)。數(shù)組中各元素與表中各字段順序?qū)?yīng)。如果數(shù)組中元素的數(shù)據(jù)類型與其對應(yīng)的字段類型不一致,則新記錄對應(yīng)的字段為空值;如果表中字段個數(shù)大于數(shù)組元素的個數(shù),則多的字段為空值。(3)第3種格式新記錄的值是指定的內(nèi)存變量的值。添加的新記錄的值是與指定表各字段名同名的內(nèi)存變量的值,如果同名的內(nèi)存變量不存在,則相應(yīng)的字段為空。VisualFoxPro支持兩種SQL插入命令的格式,第一種格式是標(biāo)準(zhǔn)格式,第二種格式是VisualFoxPro的特殊格式。13.3.1插入【13.42】在訂購單表中,插入元組("E7","S4","OR01",09/25/03)。命令執(zhí)行結(jié)果如圖13.48所示。

INSERTINTO訂購單(職工號,供應(yīng)商號,訂購單號,訂購日期,總金額)

VALUES("E7","S4","OR01",{^2003-09-25},1200)其中“{^2003-09-25}”是日期型字段訂購日期的值。圖13.4813.3.1插入假設(shè)供應(yīng)商尚未確定,那么只能先插入職工號和訂購單號兩個屬性的值,這時可用如下命令:

INSERTINTO訂購單(職工號,訂購單號)VALUES("E7","OR01")這時另外三個屬性的值為空。13.3.1插入下面用一組命令來說明INSERTINTO…FROMARRAY的使用方式:

USE訂購單&&打開訂購單

SCATTERtoA1&&將當(dāng)前記錄讀到數(shù)組A1COPYSTRUCTURETOA2&&拷貝訂購單表的結(jié)構(gòu)到A2INSERTINTOA2FROMARRAYA1&&從數(shù)組A1插入一條記錄到A2SELECTA2&&切換到A2的工作區(qū)

BROWSE&&用BROWSE命令驗證插入的結(jié)果

USE&&關(guān)閉A2.dbf文件

DELETEFILEA2.dbf&&刪除A2.dbf文件13.3.1插入用下面一組命令來說明INSERTINTO…FROMMEMVAR的使用方式:

USE訂購單&&打開訂購單

SCATTERM1&&將當(dāng)前記錄讀到內(nèi)存變量M1中

COPYSTRUCTURETOA2&&拷貝訂購單表的結(jié)構(gòu)到A2INSETRINTOA2FROMM1&&從內(nèi)存變量插入一條記錄到A2SELECTA2&&切換到A2的工作區(qū)

BROWSE&&用BROWSE命令驗證插入的結(jié)果

USE&&關(guān)閉A2.dbf文件

DELETEFILEA2.dbf&&刪除A2.dbf文件13.3.1插入說明:當(dāng)一個表定義了主索引或候選索引后,由于相應(yīng)的字段具有關(guān)鍵字的特性,即不能為空,所以只能用此命令插入記錄。FoxPro以前的插入命令(INSERT或APPEND)是先插入一條空記錄,然后再輸入各字段的值,由于關(guān)鍵字字段不允許為空,所以使用以前的方法就不能成功地插入記錄。13.3.2更新更新是指對存儲在表中的記錄進(jìn)行修改。格式:UPDATE[〈數(shù)據(jù)庫〉!]〈表名〉

SET〈列名1〉=〈表達(dá)式1〉[,〈列名2〉=〈表達(dá)式2〉…][WHERE〈條件表達(dá)式1〉[AND|OR〈條件表達(dá)式2〉…]]13.3.2更新說明:(1)[〈數(shù)據(jù)庫〉!]〈表名〉:指定要更新數(shù)據(jù)的記錄所在的表名及該表所在的數(shù)據(jù)庫名。(2)SET〈列名〉=〈表達(dá)式〉:指定被更新的字段及該字段的新值。如果省略WHERE子句,則該字段每一條都用同樣的值更新。(3)WHERE〈條件表達(dá)式〉:指明將要更新數(shù)據(jù)的記錄。即更新表中符合條件表達(dá)式的記錄,并且一次可以更新多個字段;如果不使用WHERE子句,則更新全部記錄。13.3.2更新【13.43】在職工表中,給WH1倉庫的職工提高10%的工資。命令執(zhí)行結(jié)果如圖13.49所示。

UPDATE職工

SET工資=工資*1.10WHERE倉庫號="WH1"例如:將所有學(xué)生的年齡增加1歲:

UPDATE學(xué)生

SET年齡=年齡+1圖13.4913.3.3刪除用SQL語言可以刪除數(shù)據(jù)表中的記錄。格式:DELETEFROM[〈數(shù)據(jù)庫!〉]〈表名〉

[WHERE〈條件表達(dá)式1〉[AND|OR〈條件表達(dá)式2〉…]]說明:(1)[〈數(shù)據(jù)庫!〉]〈表名〉:指定加刪除標(biāo)記的表名及該表所在的數(shù)據(jù)庫名,用“!”分割表名和數(shù)據(jù)庫名,數(shù)據(jù)庫名為可選項。(2)WHERE選項:指明只對滿足條件的記錄加刪除標(biāo)記。如果不使用WHERE子句,則刪除該表中的全部記錄。(3)上述刪除只是加刪除標(biāo)記,并沒有從物理上刪除,只有執(zhí)行了PACK命令,有刪除標(biāo)記的記錄才能真正從表中刪除。刪除標(biāo)記可以用REACLL命令取消。13.3.3刪除【13.44】刪除倉庫表中倉庫號值是WH2的記錄。

DELETEFROM倉庫WHERE倉庫號="WH2"說明:SQLDELETE命令同樣是邏輯刪除記錄,如果要物理刪除記錄需要繼續(xù)使用PACK命令。13.4定義功能標(biāo)準(zhǔn)SQL的數(shù)據(jù)定義功能非常廣泛,一般包括數(shù)據(jù)庫的定義、表的定義、視圖的定義、存儲過程的定義、規(guī)則的定義和索引的定義等若干部分。在本節(jié)將主要介紹VisualFoxPro支持的表定義功能和視圖定義功能。13.4.1表結(jié)構(gòu)的定義在第3章中已介紹了通過表設(shè)計器建立表的方法,在VisualFoxPro中也可以通過SQL的CREATETABLE命令建立表?,F(xiàn)在介紹怎樣利用SQL命令來建立相同的數(shù)據(jù)庫,然后可以利用數(shù)據(jù)庫設(shè)計器和表設(shè)計器來檢驗用SQL建立的數(shù)據(jù)庫,讀者可以從中作一些對比。表結(jié)構(gòu)的定義是指創(chuàng)建一個含有指定字段的表。13.4.1表結(jié)構(gòu)的定義格式:

CREATETABLE|DBF〈表名1〉[NAME〈長表名〉][FREE](〈字段名1〉〈類型〉[(〈字段寬度〉[,〈小數(shù)位數(shù)〉])][NULL|NOTNULL][CHECK〈邏輯表達(dá)式1〉[ERROR〈字符型文本信息1〉]]

[DEFAULT〈表達(dá)式1〉]

[PRIMARYKEY|UNIQUE][REFERENCES〈表名2〉[TAG〈標(biāo)識名1〉]][NOCPTRANS][,〈字段名2〉…][,PRIMARYKEY〈表達(dá)式2〉

TAG〈標(biāo)識名2〉|,UNIQUE〈表達(dá)式3〉TAG〈標(biāo)識3〉][,FOREIGNKEY〈表達(dá)式4〉TAG〈標(biāo)識名4〉[NODUP]REFERENCES〈表名3〉[TAG〈標(biāo)識名5〉]][,CHECK〈邏輯表達(dá)式2〉[ERROR〈字符型文本信息2〉]])|FROMARRAY〈數(shù)組名〉13.4.1表結(jié)構(gòu)的定義說明:用CREATETABLE命令可以完成第3章中介紹的“表設(shè)計器”具有的所有操作。(1)TABLE和DBF選項等價,都是建立表文件。(2)〈表名〉:為新建表指定表名。(3)NAME〈長表名〉:為新建表指定一個長表名。只有打開數(shù)據(jù)庫,在數(shù)據(jù)庫中創(chuàng)建表時,才能指定一個長表名。長表名最多可以包含128個字符。(4)FREE:建立的表是自由表,不加入到打開的數(shù)據(jù)庫中。當(dāng)沒有打開數(shù)據(jù)庫時,建立的表都是自由表。(5)〈字段名1〉〈類型〉[(〈字段寬度〉[,〈小數(shù)位數(shù)〉])]:指定字段名、字段類型、字段寬度及小數(shù)位數(shù)。字段類型可以用一個字符表示。(6)NULL:允許該字段值為空;NOTNULL:該字段值不能為空。缺省值為NOTNULL。(7)CHECK〈邏輯表達(dá)式1〉:指定該字段的合法值及該字段值的約束條件。(8)ERROR〈字符型文本信息1〉:指定在瀏覽或編輯窗口中該字段輸入的值不符合CHECK子句的合法值時,VFP顯示的錯誤信息。(9)DEFAULT〈表達(dá)式〉:為該字段指定一個缺省值,表達(dá)式的數(shù)據(jù)類型與該字段的數(shù)據(jù)類型要一致。即每添加一條記錄時,該字段自動取該缺省值。(10)PRIMARYKEY:為該字段創(chuàng)建一個主索引,索引標(biāo)識名與字段名相同。主索引字段值必須惟一。UNIQUE:為該字段創(chuàng)建一個候選索引,索引標(biāo)識名與字段名相同。(11)REFERENCES〈表名〉[TAG〈標(biāo)識名〉]:指定建立持久關(guān)系的父表,同時以該字段為索引關(guān)鍵字建立外索引,用該字段名作為索引標(biāo)識名。表名為父表表名,標(biāo)識名為父表中的索引標(biāo)識名。如果省略索引標(biāo)識名,則用父表的主索引關(guān)鍵字建立關(guān)系,否則不能省略。如果指定了索引標(biāo)識名,則在父表中存在索引標(biāo)識字段上建立關(guān)系。父表不能是自由表。(12)CHECK〈邏輯表達(dá)式2〉[ERROR〈字符型文本信息2〉]:由邏輯表達(dá)式指定表的合法值。不合法時,顯示由字符型文本信息指定的錯誤信息。該信息只有在瀏覽或編輯窗口中修改數(shù)據(jù)時顯示。(13)FROMARRAY〈數(shù)組名〉:由數(shù)組創(chuàng)建表結(jié)構(gòu)。數(shù)組名指定的數(shù)組包含表的每一個字段的字段名、字段類型、字段寬度及小數(shù)位數(shù)。用SQL命令來建立的數(shù)據(jù)表,可以與用“表設(shè)計器”建立的表作對比。13.4.1表結(jié)構(gòu)的定義【13.45】用命令建立訂貨管理1數(shù)據(jù)庫。

CREATEDATABASED:\VFP1\訂貨管理1&&建立訂貨管理1數(shù)據(jù)庫用SQLCREATE命令建立倉庫1表。

OPENDATABASE訂貨管理1&&打開訂貨管理1數(shù)據(jù)庫

CREATETABLED:\VFP1\倉庫1(倉庫號C(5)PRIMARYKEY,;

城市C(10),面積

ICHECK(面積>0)ERROR"面積應(yīng)該大于0!")&&建立倉庫表113.4.1表結(jié)構(gòu)的定義說明:(1)PRIMARYKEY說明倉庫號是主索引。(2)CHECK為面積字段值說明了有效性規(guī)則(面積>0)。執(zhí)行完如上命令后在項目管理器中立刻可以看到倉庫1表。命令執(zhí)行結(jié)果如圖13.50所示。圖13.5013.4.1表結(jié)構(gòu)的定義【13.46】用SQLCREATE命令建立訂購單1表。

CREATETABLED:\VFP1\訂購單1(職工號C(5),供應(yīng)商號C(5),;

訂購單號C(5)PRIMARYKEY,訂購日期

D)以上所有建立表的命令執(zhí)行完后可以在數(shù)據(jù)庫設(shè)計器中看到如圖13.51所示的界面,從中可以看到通過SQLCREATE命令不僅可以建立表,同時還建立起了表之間的聯(lián)系。然后可以用第4章介紹的方法來編輯參照完整性,進(jìn)一步完善數(shù)據(jù)庫的設(shè)計。13.4.1表結(jié)構(gòu)的定義說明:(1)用SQLCREATE命令新建的表自動在最低可用工作區(qū)打開,并可以通過別名引用,新表的打開方式為獨占方式,忽略SETEXCLUSIVE的當(dāng)前設(shè)置。(2)如果建立自由表(當(dāng)前沒有打開的數(shù)據(jù)庫或使用了FREE),則很多選項在命令中不能使用,如NAME、CHECK、DEFAULT、FOREIGNKEY、PRIMARYKEY和REFERENCES等。13.4.2表的刪除隨著數(shù)據(jù)庫應(yīng)用的變化,往往有些表連同它的數(shù)據(jù)不再需要了,這時可以刪除這些表,以節(jié)省存儲空間。格式:DROPTABLE〈表名〉說明:DROPTABLE直接從磁盤上刪除表名所對應(yīng)的DBF文件。如果表名是數(shù)據(jù)庫中的表,并且相應(yīng)的數(shù)據(jù)庫是當(dāng)前數(shù)據(jù)庫,則從數(shù)據(jù)庫中刪除表;否則雖然從磁盤上刪除了DBF文件,但是記錄在數(shù)據(jù)庫DBC文件中的信息卻沒有刪除,此后會出現(xiàn)錯誤提示。所以要刪除數(shù)據(jù)庫中的表時,最好應(yīng)使數(shù)據(jù)庫是當(dāng)前打開的數(shù)據(jù)庫,在數(shù)據(jù)庫中進(jìn)行操作。13.4.3表結(jié)構(gòu)的修改用戶使用數(shù)據(jù)時,隨著應(yīng)用要求的改變,往往需要對原來的表格結(jié)構(gòu)進(jìn)行修改,修改表結(jié)構(gòu)的SQL命令是ALTERTABLE,該命令格式有三種。13.4.3表結(jié)構(gòu)的修改1.第1種格式第1種格式的ALTERTABLE命令可以為指定的表添加字段或修改已有的字段。格式:

ALTERTABLE〈表名1〉

ADD|ALTER[COLUMN]〈字段名1〉〈字段類型〉[(〈長度〉[,〈小數(shù)位數(shù)〉])][NULL|NOTNULL][CHECK〈邏輯表達(dá)式1〉[ERROR〈字符型文本信息〉]][DEFAULT〈表達(dá)式1〉]

[PRIMARYKEY|UNIQUE][REFERENCES〈表名2〉[TAG〈標(biāo)識名1〉]][NOCPTRANS]13.4.3表結(jié)構(gòu)的修改說明:(1)〈表名1〉:指明被修改表的表名。(2)ADD[COLUMN]:該子句指出新增加列的字段名及他們的數(shù)據(jù)類型等信息。在ADD子句中使用CHECK、PRIMARYKEY、UNIQUE任選項時,需要刪除所有數(shù)據(jù),否則違反有效性規(guī)則,命令不被執(zhí)行。(3)ALTER[COLUMN]:該子句指出要修改列的字段名以及他們的數(shù)據(jù)類型等信息。在ALTER子句中使用CHECK任選項時,需要被修改字段的已有數(shù)據(jù)滿足CHECK規(guī)則;使用PRIMARYKEY、UNIQUE任選項時,需要被修改字段的已有數(shù)據(jù)滿足惟一性,不能有重復(fù)值。13.4.3表結(jié)構(gòu)的修改【13.47】為訂購單1表增加一個整型類型的數(shù)量字段。

ALTERTABLE訂購單1;

ADD數(shù)量ICHECK數(shù)量>0ERROR"數(shù)量應(yīng)該大于0!"13.4.3表結(jié)構(gòu)的修改【13.48】將購單1表的訂購單號字段的寬度由原來的5改為6。

ALTERTABLE訂購單1ALTER訂購單號

C(6)從命令格式可以看出,該格式可以修改字段的類型、寬度、有效性規(guī)則、錯誤信息、默認(rèn)值,定義主關(guān)鍵字和聯(lián)系等;但是不能修改字段名,不能刪除字段,也不能刪除已經(jīng)定義的規(guī)則等。13.4.3表結(jié)構(gòu)的修改

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論