SQL是結(jié)構(gòu)化查詢語言Structured Query Language的縮寫,其中查詢是SQL語言的重要組成部分。SQL已經(jīng)成為關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)數(shù)據(jù)語言。Visual FoxPro也將其融入到自身的語言中,可以直接以命令方式交互使用,也可以嵌入到程序中以程序方式使用。這些使用方式,為用戶提供了靈活的選擇余地。盡管SQL的使用方式不同,但SQL語言的語法基本是一致的。SQL的核心是查詢,它的查詢命令也稱作SELECT命令。實(shí)際上,查詢就是預(yù)先定義好的一個(gè)SQL SELECT 語句,在不同的需要場合可以直接或反復(fù)使用,從而提高效率。在Visual FoxPro中也可以利用查詢設(shè)計(jì)器設(shè)計(jì)查詢,同時(shí)系統(tǒng)會生成相應(yīng)的SELECT查詢語句代碼。
一、 使用SELECT命令構(gòu)造查詢
SELECT查詢命令的使用非常靈活,它的基本形式由SELECT-FROM-WHERE查詢塊組成,多個(gè)查詢塊可以嵌套執(zhí)行,用它可以構(gòu)造各種各樣的查詢。下面給出一些查詢的例子來分析SELECT語句。其中需要用到相關(guān)的數(shù)據(jù)表如下:
倉庫(倉庫號C 3,城市C 10,面積N 3),其記錄如下:
WH1 北京 370WH2 上海 500
WH3 廣州 200WH4 武漢 400
職工(倉庫號 C 3,職工號 C 2,工資 N 4),其記錄如下:
WH2 E1 1220 WH1 E3 1210
WH2 E4 1250 WH3 E6 1230
WH1 E7 1250
訂購單(職工號 C 2,供應(yīng)商號 C 2,訂購單號 C 4,訂購日期 D),其記錄如下:
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
供應(yīng)商(供應(yīng)商號 C2,供應(yīng)商名 C20,地址 C10),其記錄如下:
S3振華電子廠 西安
S4華通電子公司 北京
S6607廠 鄭州
S7愛華電子廠 北京
連接查詢:例1:找出工資多于1230元的職工號和他們所在的城市。
SELECT 職工號,城市 FROM 職工,倉庫;
WHERE(工資>1230)AND(職工.倉庫號=倉庫.倉庫號)
結(jié)果是: E4 上海 E7 北京
短語FROM后的兩個(gè)關(guān)系表,肯定有一種聯(lián)系。這里的“職工.倉庫號=倉庫.倉庫號”就是連接條件。
嵌套查詢:例2:找出至少有一個(gè)倉庫的職工工資為1250元的城市。
SELECT 城市 FROM 倉庫 WHERE 倉庫號 IN;
(SELECT 倉庫號FROM 職工 WHERE 工資=1250)
結(jié)果是:北京 上海
從其形式與結(jié)果中可以看出,這類查詢所要求的結(jié)果出自一個(gè)關(guān)系,但相關(guān)的條件卻涉及多個(gè)關(guān)系。查詢外層中的元組時(shí),其條件依賴相關(guān)的內(nèi)層關(guān)系中元組的屬性值。
分組與計(jì)算查詢:例3:檢索出至少有兩個(gè)職工的每個(gè)倉庫的平均工資。
SELECT 倉庫號,COUNT(*),AVG(工資) FROM職工;
GROUP BY 倉庫號HAVING COUNT(*)>=2
結(jié)果是:WH1 2 1230 WH2 2 1235
上例中,如果不用分組,將會對整個(gè)關(guān)系表進(jìn)行計(jì)算查詢。而充分利用分組查詢,可以按元組某一屬性值進(jìn)行分組計(jì)算,方便我們提取分類數(shù)據(jù)。使用SELECT語句構(gòu)造查詢的用法較多,除上述提到的基本方法外,還有利用空值查詢、別名與自連接查詢、內(nèi)外層互相關(guān)嵌套查詢、使用量詞和謂詞查詢及超鏈接查詢等。這里就不一一列舉了,只有在平時(shí)多加運(yùn)用,才能熟練掌握其用法。
二、 利用查詢設(shè)計(jì)器設(shè)計(jì)查詢
由于SQL SELECT語句的語法格式長且復(fù)雜,學(xué)生們用它構(gòu)造查詢的時(shí)候,都有些棘手。但我們用“查詢設(shè)計(jì)器”可以方便地設(shè)計(jì)出查詢。當(dāng)然,我們首先還是要理解SELECT語句的基本語法框架。因?yàn)椤安樵冊O(shè)計(jì)器”是以SELECT語句為基礎(chǔ)的,其界面上的各選項(xiàng)卡和SELECT語句的各短語是相對應(yīng)的,把這些相對應(yīng)的關(guān)系弄清楚了,用“查詢設(shè)計(jì)器”便可以輕松地設(shè)計(jì)出各種各樣的查詢了。查詢設(shè)計(jì)器界面上各選項(xiàng)卡與SELECT語句各短語的對應(yīng)關(guān)系如下:①“字段”選項(xiàng)卡對應(yīng)于SELECT短語,指定要查詢的數(shù)據(jù),這時(shí)可以單擊“全部添加”選擇所有字段,也可以逐個(gè)選擇字段“添加”;在“函數(shù)和表達(dá)式”編輯框中可以輸入或編輯計(jì)算表達(dá)式。②“連接”選項(xiàng)卡對應(yīng)于JOIN ON短語,用于編輯連接條件。③“篩選”選項(xiàng)卡對應(yīng)于WHERE短語,用于指定查詢條件。④“排序依據(jù)”選項(xiàng)卡對應(yīng)于ORDER BY短語,用于指定排序的字段和排序方式。⑤“分組依據(jù)”選項(xiàng)卡對應(yīng)于GROUP BY短語和HAVING短語,用于分組。⑥“雜項(xiàng)”選項(xiàng)卡對應(yīng)于可以指定是否要重復(fù)記錄(對應(yīng)于DISTINCT)及列在前面的記錄(對應(yīng)于TOP短語)等。
下面通過兩個(gè)例子,介紹如何利用查詢設(shè)計(jì)器來建立查詢。查詢要用到的關(guān)系表同上。
例1:利用分組功能統(tǒng)計(jì)各倉庫年工資額的合計(jì),并按年工資額降序排序。
步驟如下:①從“字段”選項(xiàng)卡選擇并添加“職工.倉庫號”字段,并在“函數(shù)和表達(dá)式”編輯框中輸入表達(dá)式:SUM(職工.工資*12) AS 年工資合計(jì),然后把它添加到“選定字段”框中。②從“分組依據(jù)”選項(xiàng)卡選擇“職工.倉庫號”字段并把它添加到“分組字段”框中。③從“排序依據(jù)”選項(xiàng)卡選擇“職工.工資*12”字段,并把它添加到“排序條件”框中。
此時(shí),運(yùn)行查詢即可得到所需要的統(tǒng)計(jì)結(jié)果。單擊查詢設(shè)計(jì)器工具欄中的顯示SQL窗口圖標(biāo),可以看到系統(tǒng)按照上述操作生成相應(yīng)如下的SQL SELECT語句代碼:
SELECT 職工.倉庫號,SUM(職工.工資*12) AS 年工資合計(jì);
FROM 職工ORDER BY SUM(職工.工資*12) DESC GROUP BY 職工.倉庫號
上例是用查詢設(shè)計(jì)器建立比較規(guī)則的查詢。要想設(shè)計(jì)出復(fù)雜的查詢,就要好好利用“連接”選項(xiàng)卡和“篩選”選項(xiàng)卡了。下面,以一例子來闡述用查詢設(shè)計(jì)器設(shè)計(jì)較為復(fù)雜的查詢。
例2:檢索出和職工E1、E3都有聯(lián)系的北京的供應(yīng)商信息。
首先,把需要用到的表“供應(yīng)商”和“訂購單”添加進(jìn)來。接著按如下步驟進(jìn)行:①從“字段”選項(xiàng)卡選擇“供應(yīng)商.供應(yīng)商號”“供應(yīng)商.供應(yīng)商名”“供應(yīng)商.地址”字段,并把它們添加到“選定字段”框中。②從“連接”選項(xiàng)卡中建立“訂購單.供應(yīng)商號=供應(yīng)商.供應(yīng)商號”的內(nèi)部連接關(guān)系。③從“篩選”選項(xiàng)卡中設(shè)置如下條件: 供應(yīng)商.地址=“北京”AND供應(yīng)商.供應(yīng)商號 IN (SELECT 供應(yīng)商號FROM訂購單WHERE 職工號=“E1”) AND 供應(yīng)商.供應(yīng)商號IN (SELECT 供應(yīng)商.供應(yīng)商號FROM 訂購單 WHERE職工號=“E3”)。④從“雜項(xiàng)”選頂卡中把“無重復(fù)記錄”復(fù)選框勾上。
查詢設(shè)計(jì)完畢后,即可運(yùn)行查詢,所得結(jié)果是:
S4 華通電子公司 北京。
單擊查詢設(shè)計(jì)器工具欄中的顯示SQL窗口圖標(biāo),可以看到系統(tǒng)按照上述操作生成相應(yīng)如下的SQL SELECT語句代碼:
SELECT DISTINCT供應(yīng)商.*;
FROM供應(yīng)商 INNER JOIN訂購單ON訂購單.供應(yīng)商號=供應(yīng)商.供應(yīng)商號;
WHERE供應(yīng)商.地址=“北京”;
AND供應(yīng)商.供應(yīng)商號IN (SELECT 供應(yīng)商號 FROM 供應(yīng)商WHERE職工號=“E1”);
AND供應(yīng)商。供應(yīng)商號IN (SELECT 供應(yīng)商號 FROM 供應(yīng)商WHERE職工號=“E3”)
上例中的(SELECT 供應(yīng)商號 FROM 訂購單WHERE 職工號=“E1”)和(SELECT 供應(yīng)商.供應(yīng)商號FROM 訂購單 WHERE職工號=“E3”),是要在“篩選”選項(xiàng)卡中的“實(shí)例”項(xiàng)設(shè)計(jì)的內(nèi)容。這也正是設(shè)計(jì)復(fù)雜的查詢的關(guān)鍵所在。
三、 結(jié)束語
利用查詢設(shè)計(jì)器能方便高效地設(shè)計(jì)復(fù)雜的查詢,但這是要建立在對SELECT語句的句法框架有個(gè)較好的理解基礎(chǔ)上的,同時(shí)還要明白其與查詢設(shè)計(jì)器中各選項(xiàng)卡的對應(yīng)關(guān)系。筆者在教學(xué)過程中,融入了上述方法,學(xué)生們很快便掌握了其方法技巧。在全國計(jì)算機(jī)等級考試的二級Visual FoxPro程序設(shè)計(jì)作答中,碰到在程序中需要填入SELECT查詢語句時(shí),較復(fù)雜的一般不直接寫語句,同學(xué)們運(yùn)用該設(shè)計(jì)方法,能夠輕松正確地獲得語句代碼,填入程序設(shè)計(jì)答題中,既快捷又不易出現(xiàn)錯(cuò)誤,取得了很好的效果。
[十堰職業(yè)技術(shù)(集團(tuán))學(xué)校]