亚洲国产福利在线一二三观看_精品国产伦一区二区三区欲臀_国产a∨视频精品视频护士_精品八戒人妻少妇av

江蘇省高校計(jì)算機(jī)等級(jí)考試命題研究院 江蘇省高校計(jì)算機(jī)等級(jí)考試輔導(dǎo)
二級(jí)考試重點(diǎn):SQL語(yǔ)句探討

 

Visual FoxProSQL方面支持?jǐn)?shù)據(jù)定義、數(shù)據(jù)查詢和數(shù)據(jù)操縱功能,

  SQL語(yǔ)言的核心是查詢。SQL語(yǔ)言的查詢命令也稱作SELECT命令,它的基本形式由

SELECT-FROM-WHERE查詢塊組成,多個(gè)查詢塊可以嵌套執(zhí)行。Visual FoxProSQL-SELECT

命令的語(yǔ)法格式如下:

    SELECT[ALL | DISTINCT][TOP nExpr[PERCENT]]

    [Alias]Select_Item[AS Column_Name][,[Alias]Select_Item[AS Column-Name]]

    FROM  [FORCE][DatabaseName!] Table [[As]  Local_Alias]

    [[INNER | LEFT[OUTER]| RIGHT[OUTER]| FULL[OUTER] JOIN

    DatabaseName!]Table[[AS]Local_Alias]

    [ON JoinCondition…]

-    [[INTO Destination]

    |[TO FILE FileName[ADDITIVE] |  TO PRINTER[PROMPT]|  TO SCREEN]]

    [WHERE JoinCondition [AND JoinCondition…]

    [AND | OR FilterCondition [AND | OR FilterCondition…]]]

    [GROUP BY GroupColumn[,GroupColumn]]

    [HAVING FilterCondition]

    [UNION [ALL] SELECT Command]

    [ORDER BY Order_Item [ASC | DESC][,Order_Item [ASC | DESC]…]]

SELECT的命令格式來(lái)看似乎非常復(fù)雜,實(shí)際上只要理解了命令中各個(gè)短語(yǔ)的含義,SQL

SELECT還是很容易掌握的,其中主要短語(yǔ)的含義如下:

  ·SELECT說(shuō)明要查詢的數(shù)據(jù);

  ·FROM說(shuō)明要查詢的數(shù)據(jù)來(lái)自哪個(gè)(),可以基于單個(gè)表或多個(gè)表進(jìn)行查詢;

  ·WHERE說(shuō)明查詢條件,即選擇元組的條件;

  ·GROUP BY短語(yǔ)用于對(duì)查詢結(jié)果進(jìn)行分組,可以利用它進(jìn)行分組匯總;

  ·HAVING短語(yǔ)必須跟隨GROUP BY使用,它用來(lái)限定分組必須滿足的條件;

  ·ORDER BY短語(yǔ)用來(lái)對(duì)查詢的結(jié)果進(jìn)行排序。

  以上短語(yǔ)是學(xué)習(xí)和理解SQL SELECT命令必須要掌握的,還有一些短語(yǔ)是Visual FoxPro有的。

  SELECT查詢命令的使用非常靈活,用它可以構(gòu)造各種各樣的查詢。本節(jié)將通過(guò)大量的實(shí)

例來(lái)介紹SELECT命令的使用,在例子中再具體解釋各個(gè)短語(yǔ)的含義。

以下為訂貨倉(cāng)庫(kù)數(shù)據(jù)庫(kù):

倉(cāng)庫(kù)表:

倉(cāng)庫(kù)號(hào)

城市

面積

WH1

北京

370

WH2

上海

500

WH3

廣州

200

WH4

武漢

400

 

職工表:

倉(cāng)庫(kù)號(hào)

職工號(hào)

工資

WH2

E1

1220

WH1

E3

1210

WH2

E4

1250

WH3

E6

1230

WH1

E7

1250

訂購(gòu)表

職工號(hào)

供應(yīng)商號(hào)

訂購(gòu)單號(hào)

訂購(gòu)日期

E3

S7

OR67

2001/06/23

E1

S4

OR73

2001/07/28

E7

S4

OR76

2001/05/25

E6

NULL

OR77

Null

E3

S4

OR79

2001/06/13

E1

NuLL

OR80

Null

E3

NULL

OR90

Null

E3

S3

OR91

2001/07/13

:Null是空值,這里的意思是還沒(méi)有確定供應(yīng)商,自然也沒(méi)有確定訂購(gòu)日期

供應(yīng)商表:

供應(yīng)商號(hào)

供應(yīng)商名

地址

S3

振華電子廠

西安

S4

華通電子公司

北京

S6

607

鄭州

S7

愛華電子廠

北京

5.2.1簡(jiǎn)單查詢

    首先從幾個(gè)最簡(jiǎn)單的查詢開始,這些查詢基于單個(gè)表,查詢由SELECTFROM短語(yǔ)構(gòu)成

(無(wú)條件查詢)或由SELECT、FROMWHERE短語(yǔ)構(gòu)成(條件查詢)。

  5.1從職工關(guān)系中檢索所有工資值。

    SELECT 工資 FROM 職工

  結(jié)果是:

    1220

    1210

    1250

    1230

    1250

  可以看到,在結(jié)果中有重復(fù)值,如果要去掉重復(fù)值只需要指定DISTINCT短語(yǔ):

    SELECT DISTINCT 工資 FROM 職工

  DISTINCT短語(yǔ)的作用是去掉查詢結(jié)果中的重復(fù)值。

  5.2檢索倉(cāng)庫(kù)關(guān)系中的所有元組。

    SELECT  *  FROM 倉(cāng)庫(kù)

  結(jié)果是:

    WH1  北京  370

    WH2  上海  500

    WH3  廣州  200

    WH4  武漢  400

  其中"*"是通配符,表示所有屬性(字段),這里的命令等同于:

    SELECT 倉(cāng)庫(kù)號(hào),城市,面積 FROM 倉(cāng)庫(kù)

  5.3 檢索工資多于1230元的職工號(hào)。

    SELECT 職工號(hào) FROM 職工 WHERE 工資>1230

  結(jié)果是:

    E4

    E7

  這里用WHERE短語(yǔ)指定了查詢條件,查詢條件可以是任意復(fù)雜的邏輯表達(dá)式。

  5.4檢索哪些倉(cāng)庫(kù)有工資多于1210元的職工。

SELECT DISTINCT 倉(cāng)庫(kù)號(hào) FROM 職工 WHERE 工資>1210

  結(jié)果是:

    WH1 

    WH2

    WH3

  在這個(gè)例子中,顯然我們只對(duì)惟一的倉(cāng)庫(kù)號(hào)感興趣。但在例5.1中我們也許對(duì)所有的工資值都感興趣,因此不管是否有重復(fù)值。決定是否消除重復(fù)值是有一定實(shí)際意義的,也是SQL的重要一面。再回到例5.1,假設(shè)我們對(duì)所有職工的平均工資感興趣,那么指定DISTINCT顯然是錯(cuò)誤的,我們將在計(jì)算檢索中再來(lái)討論這個(gè)問(wèn)題。

  5.5 給出在倉(cāng)庫(kù)"WHl""WH2"工作并且工資少于1250元的職工號(hào)。

    SELECT 職工號(hào) FROM 職工;

      WHERE 工資<1250  AND  (倉(cāng)庫(kù)號(hào)="WHl" OR 倉(cāng)庫(kù)號(hào)="WH2")

  結(jié)果是:  

    SELECT 職工號(hào),城市 FROM 職工,倉(cāng)厙;

      WHERE  (工資>1230)  AND (職工.倉(cāng)庫(kù)號(hào)=倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào))

  結(jié)果是:

    E4  上海

    E7  北京

  這里的"職工.倉(cāng)庫(kù)號(hào)=倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào)"是連接條件。

  如果在檢索命令的FROM之后有兩個(gè)關(guān)系,那么這兩個(gè)關(guān)系之間肯定有一種聯(lián)系(否則無(wú)法構(gòu)成檢索表達(dá)式)。從前面的討論已經(jīng)知道,倉(cāng)庫(kù)關(guān)系和職工關(guān)系之間存在著一個(gè)一對(duì)多的聯(lián)系。

  當(dāng)FROM之后的多個(gè)關(guān)系中含有相同的屬性名時(shí),這時(shí)必須用關(guān)系前綴指明屬性所屬的關(guān)系,如職工.倉(cāng)庫(kù)號(hào),"."前面是關(guān)系名,后面是屬性名

  5.7找出工作在面積大于400的倉(cāng)庫(kù)的職工號(hào)以及這些職工工作的城市。

    select 職工號(hào),城市 from 倉(cāng)庫(kù),職工;

      Where  (面積>400) and  (職工.倉(cāng)庫(kù)號(hào)=倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào))

  結(jié)果是:

    E1  上海

    E4  上海

5.2.3嵌套查詢

    接著來(lái)討論另一類基于多個(gè)關(guān)系的查詢,這類查詢所要求的結(jié)果出自一個(gè)關(guān)系,但相關(guān)的條件卻涉及多個(gè)關(guān)系。在5.2.2節(jié)的例子中,WHERE之后是一個(gè)相對(duì)獨(dú)立的參件,這個(gè)條件或者為真,或者為假。但是,有時(shí)我們需要用另外的方式來(lái)表達(dá)檢索要求,例如,當(dāng)檢索關(guān)系x中的元組時(shí),它的條件依賴于相關(guān)的關(guān)系y中的元組的屬性值,這時(shí)使用SQL的嵌套查詢功能將非常方便。下面就來(lái)看幾個(gè)例子。

    5.8哪些城市至少有一個(gè)倉(cāng)庫(kù)的職工的工資為1250?

    這個(gè)例子要求查詢倉(cāng)庫(kù)表中的城市信息,而查詢條件是職工表的工資字段值,為此可以使用

如下的嵌套查詢:

    SELECT 城市 FROM 倉(cāng)庫(kù) WHERE 倉(cāng)庫(kù)號(hào) IN;

      (SELECT 倉(cāng)庫(kù)號(hào) FROM 職工WHERE 工資=1250)

.  結(jié)果是:

  .    北京

       上海

    我們看到,在這個(gè)命令中含有兩個(gè)SELECTFROMWHERE查詢塊,即內(nèi)層查詢塊和外層

查詢塊,內(nèi)層查詢塊檢索到的倉(cāng)庫(kù)號(hào)值是WH1WH2,這樣就可以寫出等價(jià)的命令:

    SELECT 城市 FROM 倉(cāng)庫(kù) WHERE 倉(cāng)庫(kù)號(hào) IN ("WH1","WH2")

    這里IN相當(dāng)于集合運(yùn)算符∈。 

    5.9 查詢所有職工的工資都多于1210元的倉(cāng)庫(kù)的信息。

    這個(gè)檢索要求也可以描述為:沒(méi)有一個(gè)職工的工資少于或等于1210元的倉(cāng)庫(kù)的信息

    這樣可以有SQL命令:

    SELECT  *  FROM 倉(cāng)庫(kù) WHERE 倉(cāng)庫(kù)號(hào) NOT IN;

       (SELECT 倉(cāng)庫(kù)號(hào) FROM 職工 WHERE 工資<=1210)

    結(jié)果是:

    WH2  上海  500

    WH3  廣州  200

    WH4  武漢  400

    內(nèi)層SELECTFROMWHERE查詢塊指出所有職工的工資少于或等于1210元的倉(cāng)庫(kù)的

倉(cāng)庫(kù)號(hào)值的集合,在這里該集合只有一個(gè)值"WH1";然后再?gòu)膫}(cāng)庫(kù)關(guān)系中檢索元組的倉(cāng)庫(kù)號(hào)屬性值不在該集合中的每個(gè)元組。

    有的讀者也許已經(jīng)注意到剛才的檢索出現(xiàn)了錯(cuò)誤,盡管在"武漢""WH4"倉(cāng)庫(kù)還沒(méi)有職工,但該倉(cāng)庫(kù)的信息也被檢索出來(lái)了。所以我們必須認(rèn)真分析檢索要求,寫出正確的

    如果我們的檢索要求要排除那些還沒(méi)有職工的倉(cāng)庫(kù),檢索要求可以敘述為:檢索所有職工的工資都多于1210元的倉(cāng)庫(kù)的信息,并且該倉(cāng)庫(kù)至少要有一名職工。這樣描述就很清楚了,因?yàn)槲覀儗?duì)沒(méi)有職工的倉(cāng)庫(kù)不感興趣。這樣,寫出的SQL命令也就復(fù)雜一些了:

    SELECT * FROM 倉(cāng)庫(kù) WHERE 倉(cāng)庫(kù)號(hào) NOT IN;

     (SELECT 倉(cāng)庫(kù)號(hào) FROM 職工 WHERE 工資<=1210);

      AND 倉(cāng)庫(kù)號(hào) IN (SELECT 倉(cāng)庫(kù)號(hào) FROM 職工)

  這樣,內(nèi)層是兩個(gè)并列的查詢,在結(jié)果中將不包含沒(méi)有職工的倉(cāng)庫(kù)信息。

  5.10找出和職工E4掙同樣工資的所有職工。

    SELECT 職工號(hào) FROM 職工 WHERE工資=;

    (SELECT 工資 FROM 職工 WHERE 職工號(hào)="E4")

  結(jié)果是:

    E4   

    E7   

5.2.4幾個(gè)特殊的運(yùn)算符

  下面有幾個(gè)特殊的運(yùn)算符,它們是Between... AndLike,下面通過(guò)例子來(lái)解釋

  5.11 檢索出工資在1220元到1240元范圍內(nèi)的職工信息

  這個(gè)查詢的條件是在什么范圍之內(nèi),顯然可以使用Between...And,謂詞有如下查詢語(yǔ)句

    Select * from 職工 where 工資 Between 1220 and 1240

  結(jié)果是:

    WH2  E1  1220

    WH3  E6  1230

  這里Between...And的意思是在"......之間",這個(gè)查詢的條件等價(jià)于:

    (工資>=1220) And(工資<=1240)

  顯然使用Between...And表達(dá)條件更清晰、更簡(jiǎn)潔

  5.12從供應(yīng)商關(guān)系中檢索出全部公司的信息(不要工廠或其他供應(yīng)商的信息)

  這是一個(gè)字符串匹配的查詢,顯然應(yīng)該使用LIKE運(yùn)算符:

    SELECT * FROM 供應(yīng)商 WHERE 供應(yīng)商名 LIKE "%公司"

  結(jié)果是: 

    s4  華通電子公司  北京

  這里的LIKE是字符串匹配運(yùn)算符,通配符"%"表示0個(gè)或多個(gè)字符,另外還有一個(gè)通配符

"-"(下劃線)表示一個(gè)字符。

  5.13找出不在北京的全部供應(yīng)商信息。

    SELECT * FROM 供應(yīng)商 WHERE 地址!="北京"

  結(jié)果是:

    s3  振華電子廠  西安

    S6  607       鄭州 

    SQL,"不等于""!="表示。另外還可以用否定運(yùn)算符NOT寫出等價(jià)的命令:

    SELECT * FROM 供應(yīng)商 WHERE NOT(地址="北京")

    NOT的應(yīng)用范圍很廣,例如,可以有NOT IN(見例5.9)NOT  BETWEEN等。假如提出

和例5.11相反的請(qǐng)求,找出工資不在1220元和1240元之間的全部職工信息,可以用命令

    SELECT * FROM 職工 WHERE 工資 NOT BETWEEN 1220 AND 1240

    結(jié)果是:

    WH1  E3  1210

    WH2  E4  1250

    WH1  E7  1250   

5.2.5排序

    使用SQL SELECT可以將查詢結(jié)果排序,排序的短語(yǔ)是ORDER BY,格式如下:

    ORDER BY Order_Item [ASC | DESC][,Order_Item [ASC | DESC]...]

    可以看出,可以按升序(ASC)或降序(DESC)排序,可以按一列或多列排序。下面是兩個(gè)查

詢結(jié)果排序的例子。

    5.14按職工的工資值升序檢索出全部職工信息。

    SELECT * FROM 職工 ORDER BY 工資

    結(jié)果是:

    WH1    E3    1210

    WH2    E1    1220

    WH3    E6    1230

    WH2    E4    1250

    WHl    E7    1250

    這里ORDER BY是排序子句,如果要將結(jié)果按降序排列,只要加上DESC:

    SELECT  *  FROM 職工 ORDER BY 工資 DESC

    5.15先按倉(cāng)庫(kù)號(hào)排序,再按工資排序輸出全部職工信息。

    SELECT  *  FROM 職工 ORDER BY 倉(cāng)庫(kù)號(hào),工資

    結(jié)果是:

    WH1    E3    1210

    WH1    E7    1250

    WH2    E1    1220

    WH2    E4    1250

    WH3    E6    1230

    這是一個(gè)按多列排序的例子。

    注意:ORDER BY是對(duì)最終的查詢結(jié)果進(jìn)行排序,不可以在子查詢中使用該短語(yǔ)。

5.2.6簡(jiǎn)單的計(jì)算查詢

    SQL語(yǔ)言是完備的,也就是說(shuō),只要數(shù)據(jù)是按關(guān)系方式存人數(shù)據(jù)庫(kù)的,就能構(gòu)造合適的SQL

命令把它檢索出來(lái)。事實(shí)上,SQL不僅具有一般的檢索能力,而且還有計(jì)算方式的檢索,例如檢索職工的平均工資、檢索某個(gè)倉(cāng)庫(kù)中職工的最高工資值等。用于計(jì)算檢索的函數(shù)有:COUNT(計(jì)數(shù))SUM(求和)、AVG(計(jì)算平均值)、MAX(求最大值)、MIN(求最小值)。

  這些函數(shù)可以用在SELECT短語(yǔ)中對(duì)查詢結(jié)果進(jìn)行計(jì)算。

  5.16找出供應(yīng)商所在地的數(shù)目。    .

    SELECT COUNT(DISTINCT 地址)  FROM 供應(yīng)商

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

    SELECT COUNT(*) FROM 供應(yīng)商

將給出供應(yīng)商關(guān)系中的記錄數(shù)。

  5.17求支付的工資總數(shù)。

    SELECT SUM(工資) FROM 職工

  結(jié)果是:

      6160

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

    Select Sum(Distinct 工資) From 職工

將得出錯(cuò)誤的結(jié)果是4910

5.18  求北京和上海的倉(cāng)庫(kù)職工的工資總和

    Select Sum(工資) From 職工 Where 倉(cāng)庫(kù)號(hào) in;

      (select 倉(cāng)庫(kù)號(hào) from 倉(cāng)庫(kù) where 城市="北京" or 城市="上海")

結(jié)果是:

   4930

5.19 求所有職工的工資都多于1210元的倉(cāng)庫(kù)的平均面積

    Select Avg(面積) From 倉(cāng)庫(kù) Where 倉(cāng)庫(kù)號(hào) Not In;

       (Select 倉(cāng)庫(kù)號(hào) From 職工 Where 工資<=1210)

    結(jié)果是:

     366.67

    這里要注意,以上結(jié)果的運(yùn)算包含了尚沒(méi)有職工WH4倉(cāng)庫(kù),如果要排除沒(méi)有職工的倉(cāng)庫(kù),以上語(yǔ)句應(yīng)該改為:

    SELECT AVG(面積) FROM 倉(cāng)庫(kù) WHERE 倉(cāng)庫(kù)號(hào) NOT IN;

      (SELECT 倉(cāng)庫(kù)號(hào) FROM 職工 WHERE 工資<=1210);

    AND 倉(cāng)庫(kù)號(hào) IN (SELECT 倉(cāng)庫(kù)號(hào) FROM 職工)

  結(jié)果是:

    350

5.20 求在WH2倉(cāng)庫(kù)工作的職工的最高工資值。

    SELECT MAX(工資) FROM 職工 WHERE 倉(cāng)庫(kù)號(hào)="WH2"

  結(jié)果是:

    1250

  MAX函數(shù)相對(duì)應(yīng)的是MIN函數(shù)(求最小值)。比如,求最低工資值可以有如下命令:

    SELECT MIN(工資) FROM 職工 WHERE 倉(cāng)庫(kù)號(hào)="WH2"

5.2.7分組與計(jì)算查詢

    5.2.6節(jié)的幾個(gè)例子是針對(duì)整個(gè)關(guān)系的計(jì)算查詢,而利用GROUP BY子句進(jìn)行分組計(jì)算查

詢使用的更加廣泛。GROUP BY短語(yǔ)的格式如下:

    GROUP BY GroupColumn[,GroupGolumn…][HAVING FilterCondition]

    可以按一列或多列分組,還可以用HAVING進(jìn)一步限定分組的條件。下面是幾個(gè)分組計(jì)算

查詢的例子。

    5.21求每個(gè)倉(cāng)庫(kù)的職工的平均工資。

    SELECT 倉(cāng)庫(kù)號(hào),AVG(工資) FROM 職工;

      GROUP BY倉(cāng)庫(kù)號(hào)

    結(jié)果是:

    WH1    1230

    WH2    1235

    WH3    1230

    在這個(gè)查詢中,首先按倉(cāng)庫(kù)號(hào)屬性進(jìn)行分組,然后再計(jì)算每個(gè)倉(cāng)庫(kù)的平均工資。Group By

子句一般跟在WHERE子句之后,沒(méi)有WHERE子句時(shí),跟在FROM子句之后。另外,還可以根

據(jù)多個(gè)屬性進(jìn)行分組。

   在分組查詢時(shí),有時(shí)要求分組滿足某個(gè)條件時(shí)才檢索,這時(shí)可以用HAVING子句來(lái)限定

分組。

    5.22 求至少有兩個(gè)職工的每個(gè)倉(cāng)庫(kù)的平均工資。

    SELECT 倉(cāng)庫(kù)號(hào),COUNT(*),AVG(工資) FROM 職工;

      GROUP BY 倉(cāng)庫(kù)號(hào) HAVING COUNT(*)>=2

    結(jié)果是:

    WH1  2    1230

    WH2  2    1235

    HAVING子句總是跟在GROUP BY子句之后,而不可以單獨(dú)使用。HAVING子句和

WHERE子句不矛盾,在查詢中是先用WHERE子句限定元組,然后進(jìn)行分組,最后再用Having

子句限定分組。

5.2.8利用空值查詢

    SQL支持空值,當(dāng)然也可以利用空值進(jìn)行查詢。

    假設(shè)在訂購(gòu)單關(guān)系中,一名職工正在準(zhǔn)備訂購(gòu)單,但尚未選定供應(yīng)商,這樣若把信息

據(jù)庫(kù),則供應(yīng)商號(hào)和訂購(gòu)日期兩個(gè)屬性均為空值,在前面給出的訂購(gòu)單記錄中有3條這樣的

記錄。

    5.23  找出尚未確定供應(yīng)商的訂購(gòu)單。

    SELECT * FROM 訂購(gòu)單 WHERE 供應(yīng)商號(hào) IS NULL

    結(jié)果是:

    E6    NULL    OR77    NULL

    E1    NULL    OR80    NULL

E3    NULL    OR90    NULL

注意:查詢空值時(shí)要使用IS NULL,=NULL是無(wú)效的,因?yàn)榭罩挡皇且粋(gè)確定的值,所以不要用”=”這樣的運(yùn)算符進(jìn)行比較

:5.24列出已經(jīng)確定了供應(yīng)商的訂購(gòu)單的信息

Select * From 訂購(gòu)單 Where 供應(yīng)商號(hào) Is Not Null

    在新的SQL標(biāo)準(zhǔn)中還支持兩個(gè)新的關(guān)系連接運(yùn)算符,它們與原來(lái)我們所了解的等值連接和

自然連接不同。原來(lái)的連接是只有滿足連接條件,相應(yīng)的結(jié)果才會(huì)出現(xiàn)在結(jié)果表中;而這兩個(gè)新

的連接運(yùn)算是,首先保證一個(gè)表中滿足條件的元組都在結(jié)果表中,然后將滿足連接條件的元組與

另一個(gè)表的元組進(jìn)行連接,不滿足連接條件的則應(yīng)將來(lái)自另一表的屬性值置為空值。

5.2超連接查詢

  Visual FoxPro有專門的連接運(yùn)算語(yǔ)法格式,它支持超連接查詢,我們從本節(jié)開始給出的SQL SELECT語(yǔ)句的完整語(yǔ)法格式中抽出的與連接運(yùn)算有關(guān)的語(yǔ)法格式如下:

    SELECT…

    FROM Table INNER | LEFT | RIGHT | FULL JOIN Table

      ON JoinCondition

    WHERE ...

其中:

  INNER JOIN等價(jià)于JOIN,為普通連接;

   Left   join為左連接

   Right  join為右連接

   Full   join為完全連接,即兩個(gè)表中的記錄不管是否滿足連接條件將都在目標(biāo)表或

查詢結(jié)果中出現(xiàn),不滿足連接條件的記錄的對(duì)應(yīng)部分為Full

   On  指定連接條件

5.31  普通連接(即只有滿足連接條件的記錄才出現(xiàn)在查詢結(jié)果中)

     Select 倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào),城市,面積,職工號(hào),工資;

       From 倉(cāng)庫(kù) Join 職工;

        ON倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào)=職工.倉(cāng)庫(kù)號(hào)

 

    SELECT 倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào),城市,面積,職工號(hào),工資;

    FROM倉(cāng)庫(kù),職工 WHERE 倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào)=職工.倉(cāng)庫(kù)號(hào)

  以上三種連接語(yǔ)句的結(jié)果都是:

    WH2  上海  500  E1  1220

    WH1  北京  370  E3  1210

    WH2  上海  500  E4  1250

    WH3  廣州  200  E6  1230

    WH1  北京  370  E7  1250

  5.32左連接(即除滿足連接條件的記錄出現(xiàn)在查詢結(jié)果中外,第一個(gè)表中不滿足連接

條件的記錄也出現(xiàn)在查詢結(jié)果中)

    SELECT 倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào),城市,面積,職工號(hào),工資;

      FROM  倉(cāng)庫(kù)  LEFT JOIN  職工;

       ON 倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào)=職工.倉(cāng)庫(kù)號(hào)

  結(jié)果是:

    WH1  北京  370  E3  1210

    WH1  北京  370  E7  1250

    WH2  上海  500  E1  1220

    WH2  上海  500  E4  1250

    WH3  廣州  200  E6  1230

    WH4  武漢  400  NULL NULL

    為了看到右連接和全連接的效果,假設(shè)在職工表中插入了如下一條記錄:

    "WH8","E8",1200

    5.33  右連接(即除滿足連接條件的記錄出現(xiàn)在查詢結(jié)果中外,第二個(gè)表中不滿足

條件的記錄也出現(xiàn)在查詢結(jié)果中)。

    SELECT 倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào),城市,面積,職工號(hào),工資;

    FROM 倉(cāng)庫(kù) RIGHT JOIN 職工;

      ON倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào)=職工.倉(cāng)庫(kù)號(hào)

    結(jié)果是:

    WH2  上海  500  E1  1220

    WH1  北京  370  E3  1210  

    WH2  上海  500  E4  1250

    WH3  廣州  200  E6  1230

    WH1  北京  370  E7  1250

    NULL NULL  NULL E8  1200

    實(shí)際上職工"E8"所在的倉(cāng)庫(kù)并不存在,這在實(shí)際應(yīng)用中是不允許的。

    5.34全連接(即除滿足連接條件的記錄出現(xiàn)在查詢結(jié)果中外,兩個(gè)表中不滿足連接條

件的記錄也出現(xiàn)在查詢結(jié)果中)

    SELECT 倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào),城市,面積,職工號(hào),工資;

    FROM 倉(cāng)庫(kù) FULL JOIN 職工;

      ON  倉(cāng)庫(kù).倉(cāng)庫(kù)號(hào)=職工.倉(cāng)庫(kù)號(hào)

    結(jié)果是:

    WH1  北京  370  E3  1210

    WHl  北京  370  E7  1250

    WH2  上海  500  E1  1220

    WH2  上海  500  E4  1250

    WH3  廣州  200  E6  1230

    WH4  武漢  400  NULL NULL

    NULL NULL  NULL E8  1200

    注意:JOIN連接格式在連接多個(gè)表時(shí)的書寫方法要特別注意,在這種格式中JOIN

 ON的順序是很重要的,特別要注意JOIN的順序要和ON的順序(相應(yīng)的連接條件)正好相反

 

5.2.13集合的并運(yùn)算

  SQL支持集合的并(UNION)運(yùn)算,即可以將兩個(gè)SELECT語(yǔ)句的查詢結(jié)果通過(guò)并運(yùn)算合并

成一個(gè)查詢結(jié)果。為了進(jìn)行并運(yùn)算,要求兩個(gè)查詢結(jié)果具有相同的字段個(gè)數(shù),并且對(duì)應(yīng)字段的值

要出自同一個(gè)值域(相同的數(shù)據(jù)類型和取值范圍)

  例如,如下語(yǔ)句的結(jié)果是城市為北京和上海的倉(cāng)庫(kù)信息:

    Select * from 倉(cāng)庫(kù) Where 城市="北京";

    Union;

    Select * from 倉(cāng)庫(kù) Where 城市="上海"

5.2.14 Visual Foxpro 的幾個(gè)特殊選項(xiàng)

1.只顯示前幾項(xiàng)紀(jì)錄

  有時(shí)人們只需要滿足條件的前幾個(gè)記錄,這時(shí)使用Top短語(yǔ)比較合適

4.35  顯示工資最高的3位職工的信息

   Select * Top 3 From 職工 Order by 工資 DESC

 結(jié)果是:

    WH2  E4  1250

    WH1  E7  1250

    WH3  E6  1230

5.36顯示工資最低的那30%職工的信息。

    SELECT * TOP 30 PERCENT FROM 職工 ORDER BY 工資

結(jié)果是:

    WH5  E8    1200

    WH1  E3    1210

2.將查詢結(jié)果存放到數(shù)組中

可以使用INTO ARRAY ArrayName短語(yǔ)將查詢結(jié)果存放到數(shù)組中,ArrayName可以是任意的

數(shù)組變量名。一般將存放查詢結(jié)果的數(shù)組作為二維數(shù)組來(lái)使用,每行一條記錄,每列對(duì)應(yīng)于查詢

結(jié)果的一列。查詢結(jié)果存放在數(shù)組中,可以非常方便地在程序中使用。

如下語(yǔ)句將查詢到的職工信息存放在數(shù)組tmp:

    Select * from 職工 Into Array tmp

   tmp(1,1)存放的是第1條記錄的倉(cāng)庫(kù)號(hào)字段值,tmp(1,3)存放的是第1條記錄的工資字段

值等。 

    3.將查詢結(jié)果存放在臨時(shí)文件中

    使用短語(yǔ)INTO CURSOR CursName可以將查詢結(jié)果存放到臨時(shí)數(shù)據(jù)庫(kù)文件,其中

CursorName是臨時(shí)文件名,該短語(yǔ)產(chǎn)生的臨時(shí)文件是一個(gè)只讀的.dbf文件,當(dāng)查詢結(jié)束后該臨時(shí)

文件是當(dāng)前文件,可以像一般的.dbf文件一樣使用(當(dāng)然是只讀),當(dāng)關(guān)閉文件時(shí)該文件將自動(dòng)

刪除。   

    如下語(yǔ)句將查詢到的職工信息存放在臨時(shí).dbf文件tmp:

    SELECT * FROM 職工 INTO CURSOR tmp

    一般利用INTO CURSOR短語(yǔ)存放一些臨時(shí)結(jié)果,比如一些復(fù)雜的匯總可能需要分階段完

,需要根據(jù)幾個(gè)中間結(jié)果再匯總等,這時(shí)利用該短語(yǔ)存放中間結(jié)果就非常合適,使用完后這些

臨時(shí)文件會(huì)自動(dòng)刪除。

    4.將查詢結(jié)果存放到永久表中

    使用短語(yǔ)INTO DBF | TABLE TableName可以將查詢結(jié)果存放到永久表中(.dbf文件),

如將例5.35的查詢結(jié)果存放在表highsal中可以使用如下語(yǔ)句:

    SELECT * TOP 3 FROM 職工 INTO TABLE highsal ORDER BY 工資 DESC

  5.將查詢結(jié)果存放到文本文件中

    使用短語(yǔ)TO FILE FileName [ADDITIVE]可以將查詢結(jié)果存放到文本文件中,其中

FileName給出了文本文件名(默認(rèn)擴(kuò)展名是.TXT),如果使用ADDITIVE則結(jié)果將追加在原文件

的尾部,否則將覆蓋原有文件。

    如下語(yǔ)句將查詢結(jié)果以文本的形式存儲(chǔ)在文本文件tmp.txt:

    SELECT * TOP 3  FROM 職工 TO FILE tmp ORDER BY工資 DESC

    如果TO短語(yǔ)和INTO短語(yǔ)同時(shí)使用,TO短語(yǔ)將會(huì)被忽略。

    6.將查詢結(jié)果直接輸出到打印機(jī)

    使用短語(yǔ)TO PRINTER[PROMPT]可以直接將查詢結(jié)果輸出到打印機(jī),如界使用了

PROMPT選項(xiàng),在開始打印之前會(huì)打開打印機(jī)設(shè)置對(duì)話框。

    以上用大量的實(shí)例介紹了SQL SELECT語(yǔ)句的使用方法,這些實(shí)例都可以在Visual Foxpro下執(zhí)行。掌握SQL SELECT語(yǔ)句不僅對(duì)學(xué)好、用好Visual FoxPro至關(guān)重要,也是以后使用其他數(shù)據(jù)庫(kù)或開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序的基礎(chǔ)。