第4章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第1頁
第4章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第2頁
第4章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第3頁
第4章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第4頁
第4章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL4.1SQL語言概述4.2SQL數(shù)據(jù)查詢功能4.3SQL數(shù)據(jù)操作功能4.4SQL數(shù)據(jù)定義功能4.1概述

SQL是結(jié)構(gòu)化查詢語言StructuredQueryLanguage的縮寫??梢哉f查詢是SQL語言的重要組成部分,但不是全部,SQL還包含數(shù)據(jù)定義、數(shù)據(jù)操縱和數(shù)據(jù)控制功能等部分。

SQL已經(jīng)成為關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)數(shù)據(jù)語言,所以現(xiàn)在所有的關(guān)系數(shù)據(jù)庫管理系統(tǒng)都支持SQL.

SQL語言具有如下主要特點(diǎn):①SQL是一種一體化的語言,它包括了數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)操縱和數(shù)據(jù)控制等方面的功能,它可以完成數(shù)據(jù)庫活動(dòng)中的全部工作。②SQL語言是一種高度非過程化的語言③SQL語言非常簡潔。雖然SQL語言功能很強(qiáng),但它只有為數(shù)不多的幾條命令。④SQL語言可在命令窗口或程序中交互使用。4.1概述表4.1SQL命令動(dòng)詞SQL功能作用命令動(dòng)詞數(shù)據(jù)查詢查詢SELECT數(shù)據(jù)操縱插入INSERT更新UPDATE刪除DELETE數(shù)據(jù)定義新建CREATE刪除DROP修改ALTER4.2查詢功能

回顧:專門關(guān)系運(yùn)算p13選擇:從關(guān)系中找出滿足給定條件的元組的操作稱為選擇。投影:從關(guān)系模式中指定若干個(gè)屬性組成新的關(guān)系稱為投影。連接:將兩個(gè)表按給定的連接條件,將第一個(gè)關(guān)系中的所有記錄逐個(gè)與第二個(gè)關(guān)系的所有記錄按條件進(jìn)行連接(連接),即選擇兩個(gè)關(guān)系在連接屬性上滿足條件的元組拼接成一個(gè)新的關(guān)系的運(yùn)算。自然聯(lián)接:當(dāng)連接屬性具有相同屬性名,連接條件取相等條件時(shí),去掉重復(fù)屬性的等值連接稱為自然連接。

SQL的核心是查詢。

SQL的查詢命令也稱作SELECT命令,它的基本形式由SELECT-FROM-WHERE查詢塊組成,多個(gè)查詢塊可以嵌套執(zhí)行。即:select查詢什么from從哪來where查詢條件

VFP的SQLSELECT命令的語法格式如下:(見書p128)Select字段名1,字段名2,…from表名 where條件GROUP

BY短語用于對(duì)查詢結(jié)果進(jìn)行分組,可以利用它進(jìn)行分組匯總;HAVING短語必須跟隨GROUP

BY使用,它用來限定分組必須滿足的條件;ORDER

BY短語用來對(duì)查詢的結(jié)果進(jìn)行排序。4.2.1簡單查詢基于單個(gè)表的查詢,可以有簡單的查詢條件。這樣的查詢由SELECT和FROM短語構(gòu)成無條件查詢,或由SELECT、from、WHERE短語組成條件查詢。例4.1從職工表中檢索所有工資值。SELECT工資FROM職工SELECT職工號(hào),工資FROM職工要顯示的字段名從此表名中找可以看到在結(jié)果中有重復(fù)值,如果要去掉重復(fù)值只需要指定DISTINCT短語:

SELECTDISTINCT

工資FROM職工

DISTINCT

短語的作用是去掉查詢結(jié)果中的重復(fù)值。例4.2檢索倉庫關(guān)系中的所有元組。

select*from倉庫*代表要顯示的所有字段例4.3檢索工資多于1230元的職工號(hào)。Select職工號(hào)from職工where工資>1230WHERE短語指定了查詢條件,查詢條件可以是任意復(fù)雜的邏輯表達(dá)式。例4.4檢索哪些倉庫號(hào)有工資多于1210元的職工。SELECTDISTINCT倉庫號(hào)from職工WHERE工資>1210例4.5給出在倉庫“WHl”或“WH2”工作,并且工資少于1250元的職工號(hào)。SELECT職工號(hào)FROM職工;WHERE工資<1250AND(倉庫號(hào)=“WH1”O(jiān)R倉庫號(hào)=“WH2”)

注意:這里的分號(hào)是續(xù)行符號(hào),下同。4.2.2簡單的連接查詢

聯(lián)接是關(guān)系的基本操作之一,聯(lián)接查詢是一種基于多個(gè)關(guān)系的查詢。例4.6找出工資多于1230元的職工號(hào)和他們所在的城市。select職工號(hào),城市

from職工,倉庫;where(工資>1230)and(職工.倉庫號(hào)=倉庫.倉庫號(hào))表名表中字段如果在檢索命令的FROM之后有兩個(gè)關(guān)系,那么這兩個(gè)關(guān)系之間肯定有一種聯(lián)系,否則無法構(gòu)成檢索表達(dá)式。從前面的討論可知,倉庫關(guān)系和職工關(guān)系之間存在著一個(gè)一對(duì)多的聯(lián)系。當(dāng)FROM之后的多個(gè)關(guān)系中含有相同的屬性名時(shí),這時(shí)必須用關(guān)系前綴直接指明屬性所屬的關(guān)系,如職工.倉庫號(hào),“.”前面是關(guān)系名(表名),后面是屬性名(字段名)。例4.7找出工作在面積大于400的倉庫的職工號(hào)以及這些職工工作所在的城市。select職工號(hào),城市from職工,倉庫;where(面積>400)and(職工.倉庫號(hào)=倉庫.倉庫號(hào))4.2.3嵌套查詢基于多個(gè)關(guān)系的查詢,這類查詢所要求的結(jié)果出自一個(gè)關(guān)系,但相關(guān)的條件卻涉及多個(gè)關(guān)系。例4.8哪些城市至少有一個(gè)倉庫的職工工資為1250元?

這個(gè)例子要求查詢倉庫表中的城市信息,而查詢條件是職工表的工資字段值,為此可以使用如下的嵌套查詢:SELECT城市FROM倉庫WHERE倉庫號(hào)in;(SELECT倉庫號(hào)FROM職工WHERE工資=1250)這里IN相當(dāng)于集合運(yùn)算符∈例4.9查詢所有職工的工資都多于1210元的倉庫的信息。這個(gè)檢索要求也可以描述為:沒有一個(gè)職工的工資少于或等于1210元的倉庫的信息。這樣可以有SQL命令:SELECT*FROM倉庫WHERE倉庫號(hào)NOTIN;(SELECT倉庫號(hào)FROM職工WHERE;工資<=1210)不在以下范圍例4.10找出和職工E4同樣工資的所有職工。Select職工號(hào)FROM職工WHERE工資=;(SELECT工資FROM職工WHERE職工號(hào)="E4")4.2.4幾個(gè)特殊運(yùn)算符BETWEEN…AND…(…和…之間)LIKE是字符串匹配運(yùn)算符通配符“%”表示0個(gè)或多個(gè)字符“_”表示一個(gè)字符例4.11檢索工資在1220到1240元之間的職工。Select*from職工where工資between1220and1240例5.12從供應(yīng)商表中檢索出全部公司的信息,不要工廠或其他供應(yīng)商的信息。Select*from供應(yīng)商where供應(yīng)商名like"%公司"例4.13找出不在北京的全部供應(yīng)商信息。Select*from供應(yīng)商where地址!="北京"不等于,也可用not(地址=“北京”)

4.2.5排序使用SQLSELECT可以將查詢結(jié)果排序,排序的短語是ORDERBY,可以按升序(ASC)或降序(DESC)排序,允許按一列或多列排序。例4.14按職工的工資值升序檢索出全部職工信息。

SELECT*FROM職工ORDERBY工資字段名例4.15先按倉庫號(hào)排序,再按工資排序并輸出全部職工信息。SELECT*FROM職工ORDERBY倉庫號(hào),工資

注意:ORDERBY是對(duì)最終的查詢結(jié)果進(jìn)行排序,不可以在子查詢中使用該短語。4.2.6簡單的計(jì)算查詢

SQL不僅具有一般的檢索能力,而且還有計(jì)算方式的檢索。用于計(jì)算檢索的函數(shù)有:①COUNT—計(jì)數(shù)②SUM—求和②AVG—計(jì)算平均值④MAX—求最大值⑤MIN—求最小值這些函數(shù)可以用在SELECT短語中對(duì)查詢結(jié)果進(jìn)行計(jì)算。例4.16找出供應(yīng)商所在地的數(shù)目。SELECTCOUNT(DISTINCT地址)FROM供應(yīng)商注意:除非對(duì)關(guān)系(表)中的元組(記錄)個(gè)數(shù)進(jìn)行計(jì)數(shù),一般COUNT函數(shù)應(yīng)該使用DISTINCT。例4.17求支付的工資總數(shù)。

SELECTSUM(工資)FROM職工結(jié)果是:6160

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

SELECTSUM(DISTINCT工資)FROM職工將得出錯(cuò)誤的結(jié)果4910。例4.18求北京和上海的倉庫職工的工資總和。SELESUM(工資)FROM職工WHERE倉庫號(hào)IN;(SELECT倉庫號(hào)FROM倉庫WHERE城市="北京"OR城市="上海"例4.19求所有職工的工資都多于1210元的倉庫的平均面積。SELECTAVG(面積)FROM倉庫WHERE倉庫號(hào)NOTIN;(SELECT倉庫號(hào)FROM職工WHERE工資<=1210)例4.20求在WH2倉庫工作的職工的最高工資值。

SELECTMAX(工資)FROM職工WHERE倉庫號(hào)="WH2"

4.2.7分組與計(jì)算查詢利用GROUPBY子句進(jìn)行分組計(jì)算查詢。GROUPBY短語的格式如下:

Groupby字段名having條件 可以按一列或多列分組,還可以用HAVING進(jìn)一步限定分組的條件。例4.21求每個(gè)倉庫的職工的平均工資。SELECT倉庫號(hào),AVG(工資)FROM職工GROUPBY倉庫號(hào)結(jié)果是:

WHll230WH21235WH31230

在這個(gè)查詢中,首先按倉庫號(hào)屬性進(jìn)行分組,然后再計(jì)算每個(gè)倉庫的平均工資。例4.22求至少有兩個(gè)職工的每個(gè)倉庫的平均工資。SELECT倉庫號(hào),COUNT(*),AVG(工資)FROM職工;GROUPBY倉庫號(hào)HAVINGCOUNT(*)>=2

結(jié)果是:

WHl21230WH221235HAVING子句總是跟在GROUPBY子句之后,不可以單獨(dú)使用。4.2.8利用空值查詢SQL支持空值,當(dāng)然也可以利用空值進(jìn)行查詢。假設(shè)在訂購單關(guān)系中,一名職工正在準(zhǔn)備訂購單,但尚未選定供應(yīng)商,這樣若把信息存入數(shù)據(jù)庫,則供應(yīng)商號(hào)和訂購日期兩個(gè)屬性均為空值,在前面給出的訂購單記錄中有3個(gè)這樣的記錄。例4.23找出尚未確定供應(yīng)商的訂購單。SELECT*FROM訂購單WHERE供應(yīng)商號(hào)ISNULL

結(jié)果是:

E6NUILOR77NULIE1NULLOR80NUIJLE3NUIJLOR90NULL

注意:查詢空值時(shí)要使用ISNULL,而=NULL是無效的,因?yàn)榭罩挡皇且粋€(gè)確定的值,所以不能用“=”這樣的運(yùn)算符進(jìn)行比較。例4.24列出已經(jīng)確定了供應(yīng)商的訂購單信息。SELECT*FROM訂購單WHERE供應(yīng)商號(hào)ISNOTNULL

結(jié)果是:

E3S7OR672001/06/23E1S4OR732001/07/28E7S4OR762001/05/25E3S4OR792001/06/13E3S3OR912001/07/134.2.9別名與自連接查詢 在連接操作中,經(jīng)常需要使用關(guān)系名作前綴,有時(shí)這樣顯得很麻煩。因此,SQL允許在FROM短語中為關(guān)系名定義別名,格式為:<關(guān)系名><別名> 比如,如下的聯(lián)接語句是一個(gè)基于4個(gè)關(guān)系的聯(lián)接查詢,其中必須使用關(guān)系名作前綴:select供應(yīng)商名from供應(yīng)商,訂購單,職工,倉庫;where地址="北京"AND城市="北京";and供應(yīng)商.供應(yīng)商號(hào)=訂購單.供應(yīng)商號(hào);and訂購單.職工號(hào)=職工.職工號(hào);and職工.倉庫號(hào)=倉庫.倉庫號(hào) 在上面的查詢中,如果使用別名就會(huì)簡單一些,如下是使用了別名的同樣的聯(lián)接查詢語句:select供應(yīng)商名from供應(yīng)商S,訂購單P,職工E,倉庫W;where地址="北京"AND城市="北京";andS.供應(yīng)商號(hào)=P.供應(yīng)商號(hào);andP.職工號(hào)=E.職工號(hào);andE.倉庫號(hào)=W.倉庫號(hào)4.2.10內(nèi)外層互相關(guān)嵌套查詢例4.26列出每個(gè)職工經(jīng)手的具有最高總金額的訂購單信息。SELECTout.職工號(hào),out.供應(yīng)商號(hào),out.訂購單號(hào),;out.訂購日期,out.總金額;FROM訂購單outWHERE總金額=;(SELECTMAX(總金額)FROM訂購單

innerl;WHEREout.職工號(hào)=innerl.職工號(hào))在這個(gè)查詢中,外層查詢和內(nèi)層查詢使用同一個(gè)關(guān)系,給它們分別指定別名out和innerl。 外層查詢提供out關(guān)系中每個(gè)元組的職工號(hào)值給內(nèi)層查詢使用; 內(nèi)層查詢利用這個(gè)職工號(hào)值,確定該職工經(jīng)手的具有最高總金額的訂購單的總金額; 隨后外層查詢?cè)俑鶕?jù)out關(guān)系的同一元組的總金額值與該總金額值進(jìn)行比較,如果相等,則該元組被選擇。

4.2.11使用量詞和謂詞的查詢子查詢有關(guān)的運(yùn)算符,它們有以下兩種形式:<表達(dá)式><比較運(yùn)算符>[ANY|ALL|SOME](子查詢) [NOT]EXISTS(子查詢)ANY、ALL和SOME是量詞,其中ANY和SOME是同義詞.EXISTS是謂詞,EXISTS或NOTEXISTS是用來檢查在子查詢中是否有結(jié)果返回,即存在元組或不存在元組。例4.27檢索那些倉庫中還沒有職工的倉庫的信息。這里的查詢是沒有職工或不存在職工,所以可以使用謂詞NOTEXISTS:SELECT*FROM倉庫WHERENOTEXISTS;(SELECT*FROM職工WHERE倉庫號(hào)=倉庫.倉庫號(hào))以上的查詢等價(jià)于:SELECT*FROM倉庫WHERE倉庫號(hào)NOTIN;(SELECT倉庫號(hào)FROM職工)例4.28檢索那些倉庫中至少已經(jīng)有一個(gè)職工的倉庫的信息。SELECT*FROM倉庫WHEREEXISTS;(SELE*FROM職工WHER倉庫號(hào)=倉庫.倉庫號(hào))它等價(jià)于:SELECT*FROM倉庫WHERE倉庫號(hào)IN;(SELECT倉庫號(hào)FROM職工)注意:[NOT]EXISTS只是判斷子查詢中是否有或沒有結(jié)果返回,它本身并沒有任何運(yùn)算或比較。例4.29檢索有職工的工資大于或等于WH1倉庫中任何一名職工工資的倉庫號(hào)。這個(gè)查詢可以使用ANY或SOME量詞。Any表示任何一個(gè);some表示若干.SELECTDISTINCT倉庫號(hào)FROM職工WHERE工資>=ANY;(SELECT工資FROM職工WHER倉庫號(hào)="WH1")它等價(jià)于:SELECTDISTINCT倉庫號(hào)FROM職工WHER工資>=;(SELECTMIN(工資)FROM職工WHER倉庫號(hào)="WH1")ANY、ALL謂詞與函數(shù)及IN謂詞的等價(jià)轉(zhuǎn)換關(guān)系=<>或!=<<=>>=ANYIN<MAX<=MAX>MIN>=MINALLNOTIN<MIN<=MIN>MAX>=MAX5.2.12超聯(lián)接查詢?cè)谝话鉙QL中超聯(lián)接運(yùn)算符是“*=”和“=*”。其中“*=”稱為左聯(lián)接,含義是在結(jié)果表中包含第一個(gè)表中滿足條件的所有記錄;如果有在聯(lián)接條件上匹配的元組,則第二個(gè)表返回相應(yīng)值,否則第二個(gè)表返回空值;而“=*”稱為右聯(lián)接,含義是在結(jié)果表中包含第二個(gè)表中滿足條件的所有記錄;如果有在聯(lián)接條件上匹配的元組,則第一個(gè)表返回相應(yīng)值,否則第一個(gè)表返回空值。注意:VFP不支持超聯(lián)接運(yùn)算符“*=”和“=*”VFP有專門的聯(lián)接運(yùn)算語法格式,它支持超聯(lián)接查詢,聯(lián)接運(yùn)算有關(guān)的語法格式如下:

SELECT……FROM表名INNER|LEFT|RIGHT|FULLJOIN表

ON聯(lián)接條件

WHERE….其中:

INNERJOIN=JOIN,為普通的聯(lián)接,在VFP稱內(nèi)部聯(lián)接。

LEFTJOIN為左聯(lián)接。

RIGHTJOIN為右聯(lián)接。

FULLJOIN可以稱為全聯(lián)接,即兩個(gè)表中的記錄不管是否滿足聯(lián)接條件將都在目標(biāo)表或查詢結(jié)果中出現(xiàn),不滿足聯(lián)接條件的記錄對(duì)應(yīng)部分為NULL。例4.31:普通聯(lián)接,即只有滿足聯(lián)接條件的記錄才出現(xiàn)在查詢結(jié)果中。SELECT倉庫.倉庫號(hào),城市,面積,職工號(hào),工資;FROM倉庫JOIN職工;ON倉庫.倉庫號(hào)=職工.倉庫號(hào)如下兩種命令格式也是等價(jià)的:SELECT倉庫.倉庫號(hào),城市,面積,職工號(hào),工資;FROM倉庫INNERJoin職工;ON倉庫.倉庫號(hào)=職工.倉庫號(hào)和SELECT倉庫.倉庫號(hào),城市,面積,職工號(hào),工資;FROM倉庫,職工WHERE倉庫.倉庫號(hào)=職工.倉庫號(hào)例4.32左聯(lián)接,即除滿足連接條件的記錄出現(xiàn)在查詢結(jié)果中外,第一個(gè)表中不滿足聯(lián)接條件的記錄也出現(xiàn)在查詢結(jié)果中。SELECT倉庫.倉庫號(hào),城市,面積,職工號(hào),工資;FROM倉庫LEFTJOIN職工;ON倉庫.倉庫號(hào)=職工.倉庫號(hào)右聯(lián)接:除滿足連接條件的記錄出現(xiàn)在查詢結(jié)果中外,第二個(gè)表中不滿足聯(lián)接條件的記錄也出現(xiàn)在查詢結(jié)果中.全聯(lián)接:兩個(gè)表中不滿足聯(lián)接條件的記錄也出現(xiàn)在查詢結(jié)果中。注意:VFP的SQLSELECT語句的連接格式只能實(shí)現(xiàn)兩個(gè)表的連接,如果要實(shí)現(xiàn)多個(gè)表的連接,還需要使用標(biāo)準(zhǔn)格式。例如下面是一個(gè)基于4個(gè)關(guān)系的連接查詢:

SELECT倉庫.倉庫號(hào),城市,供應(yīng)商名,地址;FROM供應(yīng)商,訂購單,職工,倉庫;WHERE供應(yīng)商.供應(yīng)商號(hào)=訂購單.供應(yīng)商號(hào);AND訂購單.職工號(hào)=職工.職工號(hào);AND職工.倉庫號(hào)=倉庫.倉庫號(hào)4.2.13集合的并運(yùn)算

SQL支持集合的并(UNION)運(yùn)算,即可以將兩個(gè)SELECT語句的查詢結(jié)果通過并運(yùn)算合并成一個(gè)查詢結(jié)果。為了進(jìn)行并運(yùn)算,要求這樣的兩個(gè)查詢結(jié)果具有相同的字段個(gè)數(shù),并且對(duì)應(yīng)字段的值要出自同一個(gè)值域,即具有相同的數(shù)據(jù)類型和取值范圍。

例如,如下語句的結(jié)果是城市為北京和上海的倉庫信息:SELECT*FROM倉庫WHERE城市="北京";UNION;SELECT*FROM倉庫WHERE城市="上海"

4.2.14VFP中SQLSELECT的幾個(gè)特殊選項(xiàng)1.顯示部分結(jié)果 有時(shí)只需要滿足條件的前幾個(gè)記錄,這時(shí)使用TOPnExpr[PERCENT]短語非常有用.

當(dāng)不使用PERCENT時(shí),nExpr

是l至32767間的整數(shù),說明顯示前幾個(gè)記錄;當(dāng)使用PERCENT時(shí),nExpr是0.01至99.99間的實(shí)數(shù),說明顯示結(jié)果中前百分之幾的記錄。需要注意的是TOP短語要與ORDERBY短語同時(shí)使用才有效。例4.35顯示工資最高的三位職工的信息。SELECT*TOP3FROM職工ORDERBY工資DESC例4.36顯示工資最低的那30%職工的信息。SELECT*TOP30PERCENTFROM職工ORDERBY工資2.將查詢結(jié)果存放到數(shù)組中可以使用“INTOARRAY數(shù)組名”短語將查詢結(jié)果存放到數(shù)組中。如將查詢到的職工信息存放在數(shù)組tmp中:

SELECT*FROM職工INTOARRAYtmptmp(1,1)存放的是第一條記錄的倉庫號(hào)字段值,tmp(1,3)存放的是第一條記錄的工資字段值等。3.將查詢結(jié)果存放在臨時(shí)文件中使用短語INTOCURSORcursorName可以將查詢結(jié)果存放到臨時(shí)數(shù)據(jù)表文件中.

其中cursorName是臨時(shí)文件名,該短語產(chǎn)生的臨時(shí)文件是一個(gè)只讀的dbf文件,當(dāng)查詢結(jié)束后該臨時(shí)文件是當(dāng)前文件,可以像一般的dbf文件一樣使用,但僅是只讀。當(dāng)關(guān)閉文件時(shí)該文件將自動(dòng)刪除。如將查詢到的職工信息存放在臨時(shí)dbf文件tmp中:。

SELECT*FROM職工INTOCURSORtmp4.將查詢結(jié)果存放到永久表中使用短語“INToDBF|TABLE表名”可以將查詢結(jié)果存放到永久表中(dbf文件)。比如將例4.36的查詢結(jié)果存放在表hh中可以使用如下語句:SELECT*TOP3FROM職工INTOTABLEhh;ORDERBY工資DESC

5.將查詢結(jié)果存放到文本文件中使用短語TOFILE文件名[ADDITIVE]可以將查詢結(jié)果存放到文本文件中.如將查詢結(jié)果以文本的形式存在hnp.txt中:SELECT*TOP3FROM職工TOFILEhnpORDERBY;工資DESC如果TO短語和INTO短語同時(shí)使用,則To短語將會(huì)被忽略。6.將查詢結(jié)果直接輸出到打印機(jī)使用短語TOPRINTER[PROMPT]可以直接將查詢結(jié)果輸出到打印機(jī).

VFP在支持標(biāo)準(zhǔn)SQL方面還有一些限制和遺憾,例如不支持多層嵌套查詢、不支持COMPUTE短語等。4.3操作功能

SQL的操作功能是指對(duì)數(shù)據(jù)庫中數(shù)據(jù)的操作功能,主要包括數(shù)據(jù)的插入、更新和刪除三個(gè)方面的內(nèi)容。4.3.1插入數(shù)據(jù)

VFP支持兩種SQL插入命令的格式,第一種格式是標(biāo)準(zhǔn)格式,第二種格式是VFP的特殊格式。第一種格式:

INSERTINTO表名[(字段1[,字段2…])]VALUES(記錄值1,記錄值2,…)例如:insertinto學(xué)生values(911111,"張三",21,"男")第二種格式:INSERTINTO表名FROMARRAY數(shù)組名|FROMMEMVAR其中:

FROMMEMVAR說明根據(jù)同名的內(nèi)存變量來插入記錄值,如果同名的變量不存在,那么相應(yīng)的字段為默認(rèn)值或空。例如,往訂購單關(guān)系中插入元組:

(”E7”,”S4”,”O(jiān)R01“,2001/05/25)可用如下命令:INSERTINTO訂購單;VALUES("E7","S4","OR01",{^2001-05-25},1111)注意:這里日期型數(shù)據(jù)的表示方式。如果供應(yīng)商號(hào)尚未確定,則先只能插入兩個(gè)屬性的值:

INSERTINTO訂購單(職工號(hào),訂購單號(hào));VALUES("E9","OR01")注意: 當(dāng)一個(gè)表定義了主索引或候選索引后,由于相應(yīng)的字段具有關(guān)鍵字的特性,即不能為空,所以只能用此命令插入記錄。FoxPro以前的插入命令(INSERT或APPEND)是先插入一條空記錄,然后再輸入各字段的值,由于關(guān)鍵字字段不允許為空,所以使用以前的方法就不能成功地插入記錄。

4.3.2更新

SQL的數(shù)據(jù)更新命令格式如下:

UPDATE表名

SET字段1=表達(dá)式1,字段2=表達(dá)式2,…WHERE條件

一般使用WHERE子句指定條件,以更新滿足條件的一些記錄的字段值,并且一次可以更新多個(gè)字段;如果不使用WHERE子句,則更新全部記錄。例如,給WH1倉庫的職工提高10%的工資的命令:

UPDATE職工SET工資=工資*1.10;

WHERE倉庫號(hào)=”WH1”

又如,給所有學(xué)生的年齡增加1歲:

UPDATE學(xué)生SET年齡=年齡+14.3.3刪除數(shù)據(jù)SQL從表中刪除數(shù)據(jù)的命令格式如下:

DELETEFROM表名[WHERE條件]這里FROM指定從哪個(gè)表中刪除數(shù)據(jù),WHERE指定被刪除的記錄所滿足的條件,如果不使用WHERE子句,則刪除該表中的全部記錄。例如,要?jiǎng)h除倉庫關(guān)系中倉庫號(hào)值是WH2的元組,可用命令:

DELETEFROM倉庫WHERE倉庫號(hào)="WH2"

注意: 在VFP中SQLDELETE命令同樣是邏輯刪除記錄,如果要物理刪除記錄需要繼續(xù)使用PACK命令。4.4定義功能標(biāo)準(zhǔn)SQL的數(shù)據(jù)定義功能非常廣泛,一般包括 數(shù)據(jù)庫的定義 表的定義 視圖的定義 存儲(chǔ)過程的定義 規(guī)則的定義 索引的定義等若干部分。4.4.1表的定義通過SQL的CREATETABLE命令建立表,相應(yīng)的命令格式是:CREATETABLE|DBF表名……簡化形式:

CREATETABLE表名

(字段名1,類型(長度),字段名2,類型(長度)....)例4.37用命令建立“訂貨管理1”數(shù)據(jù)庫。CREATEDATABASE訂貨管理1建立倉庫1表:CREATETABLE倉庫1(;倉庫號(hào)C(5)PRIMARYKEY,;城市C(10),;面積ICHECK(面積>0)ERROR"面積應(yīng)該大于0!")

例4.38用SQLCREATE命令建立職工l表。CREATETABLE職工1(倉庫號(hào)C(5),;職工號(hào)C(5)PRIMARYKEY,;工資ICHECK(工資>=1000AND工資<=5000);ERROR"工資值的范圍在1000-50001"DEFAULT1200,;FOREIGNKEY倉庫號(hào)TAG倉庫號(hào)REFERENCES倉庫1)

例4.39用SQLCREATE命令建立供應(yīng)商1表。CREATETABLE供應(yīng)商1(;

供應(yīng)商號(hào)C(5)PRIMARYKEY,供應(yīng)商名c(20),地址c(20))用SQICREATE命令建立訂購單1表。CREATETABLE訂購單1(;職工號(hào)C(5),供應(yīng)商號(hào)C(5),訂購單號(hào)C(5)PRIMARYKEY,訂購日期D,;FOREIGNKEY職工號(hào)TAG職工號(hào)REFERENCES職工1,;FOREIGNKEY供應(yīng)商號(hào)TAG供應(yīng)商號(hào)REFERENCES供應(yīng)商1)4.4.2表的刪除刪除表的SQL命令是:DROPTABLE表名DROPTABLE直接從磁盤上刪除所對(duì)應(yīng)的dbf文件。如果表是數(shù)據(jù)庫中的表并且相應(yīng)的數(shù)據(jù)庫是當(dāng)前數(shù)據(jù)庫,則從數(shù)據(jù)庫中刪除了表;否則雖然從磁盤上刪除了dbf

溫馨提示

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

評(píng)論

0/150

提交評(píng)論