电竞比分网-中国电竞赛事及体育赛事平台

分享

Access教程 第三章 查詢

 zjsxShenwx 2008-09-25

第三章  查詢

 

 

 

本章內(nèi)容

 

◆ 查詢的概念、種類和作用。

◆ 各種查詢的建立。

◆ 查詢的應(yīng)用。

 

 

一、查詢的概念

 

1.什么是查詢

 

查詢就是依據(jù)一定的查詢條件,對數(shù)據(jù)庫中的數(shù)據(jù)信息進(jìn)行查找。它與表一樣,都是數(shù)據(jù)庫的對象。它允許用戶依據(jù)準(zhǔn)則或查詢條件抽取表中的記錄與字段。Access 2003 中的查詢可以對一個(gè)數(shù)據(jù)庫中的一個(gè)或多個(gè)表中存儲的數(shù)據(jù)信息進(jìn)行查找、統(tǒng)計(jì)、計(jì)算、排序等。

 

有多種設(shè)計(jì)查詢的方法,用戶可以通過查詢設(shè)計(jì)器或查詢設(shè)計(jì)向?qū)碓O(shè)計(jì)查詢。

 

 

查詢結(jié)果將以工作表的形式顯示出來。顯示查詢結(jié)果的工作表又稱為結(jié)果集,它雖然與基本表有著十分相似的外觀,但它并不是一個(gè)基本表,而是符合查詢條件的記錄集合。其內(nèi)容是動態(tài)的。

 

2. 查詢的種類

 

Access 2003 提供多種查詢方式,查詢方式可分為選擇查詢、匯總查詢、交叉表查詢、重復(fù)項(xiàng)查詢、不匹配查詢、動作查詢、SQL特定查詢、以及多表之間進(jìn)行的關(guān)系查詢。這些查詢方式總結(jié)起來有4類:選擇查詢、特殊用途查詢、操作查詢和SQL專用查詢。

 

3. 查詢的作用和功能

 

查詢是數(shù)據(jù)庫提供的一種功能強(qiáng)大的管理工具,可以按照使用者所指定的各種方式來進(jìn)行查詢。查詢基本上可滿足用戶以下需求:

◆ 指定所要查詢的基本表。

◆ 指定要在結(jié)果集中出現(xiàn)的字段。

◆ 指定準(zhǔn)則來限制結(jié)果集中所要顯示的記錄。

◆ 指定結(jié)果集中記錄的排序次序。

◆ 對結(jié)果集中的記錄進(jìn)行數(shù)學(xué)統(tǒng)計(jì)。

◆ 將結(jié)果集制成一個(gè)新的基本表。

◆ 在結(jié)果集的基礎(chǔ)上建立窗體和報(bào)表。

◆ 根據(jù)結(jié)果集建立圖表。

◆ 在結(jié)果集中進(jìn)行新的查詢。

◆ 查找不符合指定條件的記錄。

◆ 建立交叉表形式的結(jié)果集。

◆ 在其他數(shù)據(jù)庫軟件包生成的基本表中進(jìn)行查詢。

作為對數(shù)據(jù)的查找,查詢與篩選有許多相似的地方,但二者是有本質(zhì)區(qū)別的。查詢是數(shù)據(jù)庫的對象,而篩選是數(shù)據(jù)庫的操作。

下表指出了查詢和篩選之間的不同:

 

功能                                        查詢        篩選

——————————————————————————————

用作窗體或報(bào)表的基礎(chǔ)                                 

排序結(jié)果中的記錄                                     

如果允許編輯,就編輯結(jié)果中的數(shù)據(jù)                     

向表中添加新的記錄集                                 

只選擇特定的字段包含在結(jié)果中                         

作為一個(gè)獨(dú)立的對象存儲在數(shù)據(jù)庫中                     

不用打開基本表、查詢和窗體就能查看結(jié)果               

在結(jié)果中包含計(jì)算值和集合值                                     

——————————————————————————————

 

 

二、創(chuàng)建查詢

 

用戶可以打開數(shù)據(jù)庫窗口,選擇【查詢】對象,然后單擊工具欄中的【新建】按鈕,彈出【新建查詢】對話框。

 

1. 簡單選擇查詢

 

簡單選擇查詢通過簡單查詢向?qū)砜焖偻瓿伞?/span>

 

 

 

如果要添加匯總,則進(jìn)行下一步操作而不選擇【明細(xì)】。

 

 

 

下面是匯總選項(xiàng):

 

 

如果不用向?qū)гO(shè)計(jì)查詢而用查詢設(shè)計(jì)器進(jìn)行查詢設(shè)計(jì),并且要在查詢中添加匯總選項(xiàng),則需要手工添加一些匯總函數(shù):

Sum     求總和

Avg     平均值

Min     最小值

Max     最大值

Count   計(jì)數(shù)

StDev   標(biāo)準(zhǔn)差

Var     方差

First   第一條記錄

Last    最后一條記錄

 

2. 交叉表查詢向?qū)?/span>

 

交叉表查詢以表的形式顯示出摘要的數(shù)值,例如某一字段的總和、計(jì)數(shù)、平均等。并按照列在數(shù)據(jù)表左側(cè)的一組標(biāo)題和列在數(shù)據(jù)表上方的另一組標(biāo)題,將這些值分組,在數(shù)據(jù)工作表中分別以行標(biāo)題和列標(biāo)題的形式顯示出來,用于分析和比較。

例如:產(chǎn)品表如下

 

要從基本表中得到如下信息:某一類別產(chǎn)品的“庫存量”及其“供應(yīng)商”。

 

方法步驟圖解如下:

 

 

 

 

3. 查找重復(fù)項(xiàng)查詢向?qū)?/span>

 

查找重要項(xiàng)查詢向?qū)?,可以幫助用戶在?shù)據(jù)表中查找具有一個(gè)或多個(gè)字段內(nèi)容相同的記錄。此向?qū)Э梢杂脕泶_定基本表中是否存在重復(fù)記錄。

如果要得到如下面所示的結(jié)果集:

 

 

則可進(jìn)行如下操作步驟:

 

 

 

 

 

4. 查找不匹配項(xiàng)查詢向?qū)?/span>

 

查找不匹配項(xiàng)查詢向?qū)?,是用來幫助用戶在?shù)據(jù)中查找不匹配記錄的向?qū)?。如要查找【產(chǎn)品】表中的供應(yīng)商ID與【供應(yīng)商】表中的供應(yīng)商ID不匹配的記錄。步驟分解如下:

 

 

 

 

 

 

 

 

 

5. 用查詢設(shè)計(jì)器創(chuàng)建查詢

 

使用向?qū)е荒芙⒑唵蔚?、特定的查詢?span lang=EN-US>Access 2003 還提供了一個(gè)功能強(qiáng)大的查詢設(shè)計(jì)器,通過它不僅可以從頭設(shè)計(jì)一個(gè)查詢,而且還可能對已有的查詢進(jìn)行編輯和修改。

 

下圖即為查詢設(shè)計(jì)器:

 

【設(shè)計(jì)器】主要分為上下兩部分,上面放置數(shù)據(jù)庫表、顯示關(guān)系和字段;下面給出設(shè)計(jì)網(wǎng)格,網(wǎng)格中有如下行標(biāo)題:

◆ 字段     查詢工作表中所使用的字段名

◆ 表       該字段所來自的數(shù)據(jù)表

◆ 排序     是否按該字段排序

◆ 顯示     該字段是否在結(jié)果集工作表中顯示

◆ 條件     查詢條件

◆ 或       用來提供多個(gè)查詢條件

 

上面的工具欄上有如下按鈕:

 

 

◆ 視圖         每個(gè)查詢有5種視圖(設(shè)計(jì)、數(shù)據(jù)表、SQL、數(shù)據(jù)透視表、數(shù)據(jù)透視圖表)

◆ 查詢類型     選擇、交叉表、更新、追加、生成表、刪除。

◆ 運(yùn)行         運(yùn)行查詢

◆ 顯示表       顯示所有可用的表

◆ 總計(jì)         在查詢設(shè)計(jì)區(qū)中增加【總計(jì)】行,可用于求和、求平均等

◆ 上限值       用戶可指定顯示范圍

◆ 屬性         顯示當(dāng)前對象屬性

◆ 生成器       彈出【表達(dá)式生成器】

◆ 數(shù)據(jù)庫窗口   回到數(shù)據(jù)庫窗口

◆ 新對象       建立數(shù)據(jù)庫的新對象

 

6. 用查詢設(shè)計(jì)器進(jìn)一步設(shè)計(jì)查詢

 

⑴ 添加表/查詢

 

⑵ 更改表或查詢間的關(guān)聯(lián)

⑶ 刪除表/查詢

⑷ 添加插入查詢的字段

⑸ 刪除、移動字段

⑹ 設(shè)置查詢結(jié)果的排序

⑺ 設(shè)置字段顯示屬性

 

 

7. 查詢及字段的屬性設(shè)置

 

 

 

8. 設(shè)置查詢準(zhǔn)則

 

查詢設(shè)計(jì)視圖中的準(zhǔn)則就是查詢記錄應(yīng)符合的條件。它與在設(shè)計(jì)表時(shí)設(shè)置字段的有效性規(guī)則的方法相似。

 

⑴ 準(zhǔn)則表達(dá)式

And             與操作          A And B

Or              或操作          A Or B

Between…And    指定范圍操作    Between A And B

In              指定枚舉范圍    In(“A,B,C”)

Like            指定模式字符串  Like “A?[A~f]#[!0~9]*”    如:A u D 3 q 98e32ww

 

⑵ 在表達(dá)式中使用日期與時(shí)間

在準(zhǔn)則表達(dá)式中使用日期/時(shí)間時(shí),必須要在日期值兩邊加上“#”。下面寫法都是正確的:#Feb12,98#、#2/12/98##1221998#。

相關(guān)內(nèi)部函數(shù):

Date()      返回系統(tǒng)當(dāng)前日期

Year()      返回日期中的年份

Month()     返回日期中的月份

Day()       返回日期中的日數(shù)

Weekday()   返回日期中的星期數(shù)

Hour()      返回時(shí)間中的小時(shí)數(shù)

Now()       返回系統(tǒng)當(dāng)前的日期與時(shí)間

 

⑶ 表達(dá)式中的計(jì)算

A+B         兩個(gè)數(shù)字型字段值相加,兩個(gè)文本字符串連接

A-B         兩個(gè)數(shù)字型字段值相減

A*B         兩個(gè)數(shù)字型字段值相乘

A/B         兩個(gè)數(shù)字型字段值相除

A\B         兩個(gè)數(shù)字型字段值相除四舍五入取整

A^B         AB次冪

Mod(A,B)    取余,A除以B得余數(shù)

A&B         文本型字段AB連接

 

⑷ 使用準(zhǔn)則表達(dá)式生成器

 

 

 

三、創(chuàng)建特殊用途查詢

 

數(shù)據(jù)查詢未必總是靜態(tài)地提取統(tǒng)一信息。只要用戶把搜索類別輸入到一個(gè)特定的對話框中,就能在運(yùn)行查詢時(shí)對其進(jìn)行修改。例如:當(dāng)用戶希望能夠規(guī)定所需要的數(shù)據(jù)組進(jìn),就需要使用一個(gè)參數(shù)查詢。

另一個(gè)特殊用途的查詢就是把字段值自動填充到相關(guān)表中的“自動查詢”查詢。“自動查詢”查詢通過查找用戶輸入在匹配字段中的數(shù)值,并把用戶指定的信息輸入到相關(guān)表的字段中。

 

1. 參數(shù)查詢

 

如用戶想要查詢價(jià)格在1030元之間的各種產(chǎn)品,并想知道產(chǎn)品的供應(yīng)商和產(chǎn)品的類別。這需要向查詢設(shè)計(jì)器中添加【產(chǎn)品】、【供應(yīng)商】、【類別】三個(gè)表。具體步驟如下:

 

首先打開查詢設(shè)計(jì)器,將數(shù)據(jù)表添加到上面。

 

添加字段。并給出條件:Between [輸入最低值] And [輸入最高值]

 

 

然后運(yùn)行,輸入兩參數(shù):

 

 

可查看到結(jié)果:

 

 

如要改變參數(shù)類型,可打開【查詢】|【參數(shù)】對話框來解決:

 

2. 自動查找查詢

 

自動查詢查詢使用具有一對多關(guān)系的兩個(gè)表,若要?jiǎng)?chuàng)建一個(gè)自動查找查詢,首先把兩個(gè)相關(guān)表添加到查詢設(shè)計(jì)窗口,然后把匹配字段從“多”方拖到網(wǎng)格上。這種查詢是查找“一”方中的相關(guān)記錄并從匹配記錄中的其他字段檢索數(shù)值。

下面創(chuàng)建一個(gè)在【供應(yīng)商】列中選擇一個(gè)供應(yīng)商時(shí),自動填充【聯(lián)系人姓名】、【地址】、【郵政編碼】、【電話】的自動查找查詢。具體操作如下:

 

 

運(yùn)行,在底部通過選擇供應(yīng)商而添加記錄,其中“一”方表中的公司名稱、聯(lián)系人姓名、地址、郵政編碼、電話等字段將自動加上。而“多”方的產(chǎn)品名稱則須人工加上。

 

 

3. 交叉表查詢

 

交叉表查詢是一種特殊的合計(jì)查詢類型,可以使數(shù)據(jù)按電子表格的方式顯示查詢結(jié)果集,這種方式在水平與垂直方向同時(shí)對數(shù)據(jù)進(jìn)行分組,使數(shù)據(jù)的顯示更為緊湊。這一點(diǎn)在前面已討論過了。

 

下面我們再創(chuàng)建一個(gè)雇員銷售訂單金額匯總表。由于每一個(gè)定單中有多個(gè)訂單明細(xì)產(chǎn)品,所以金額必須求和。所以按訂單分組,利用表達(dá)式[數(shù)量]*[單價(jià)]求和即可,并按雇員分列之。

 

 

 

 

 

四、操作查詢

 

    操作查詢用于同時(shí)對一個(gè)或多個(gè)表執(zhí)行全局?jǐn)?shù)據(jù)管理操作。操作查詢可以對數(shù)據(jù)表中原有的數(shù)據(jù)內(nèi)容進(jìn)行編輯,對符合條件的數(shù)據(jù)進(jìn)行成批的修改。因此,應(yīng)該備份數(shù)據(jù)庫。

 

1. 更新查詢

 

更新查詢用于同時(shí)更改許多記錄中的一個(gè)或多個(gè)字段值,用戶可以添加一些條件,這些條件除了更新多個(gè)表中的記錄外,還篩選要更改的記錄。大部分更新查詢可以用表達(dá)式來規(guī)定更新規(guī)則。

如下表實(shí)例:

 

字段類型    表達(dá)式          結(jié)果

————————————————————————————————————

貨幣        [單價(jià)]*1.05     把“單價(jià)”增加5%

日期        #4/25/01#       把日期更改為2001425

文本        “已完成”      把數(shù)據(jù)更改為“已完成”

文本        “總”&[單價(jià)]   把字符“總”添加到“單價(jià)”字段數(shù)據(jù)的開頭

/       Yes             把特定的“否”數(shù)據(jù)更改為“是”

————————————————————————————————————

 

 

 

 

2. 追加查詢

 

當(dāng)用戶要把一個(gè)或多個(gè)表的記錄添加到其他表時(shí),就會用到追加查詢。追加查詢可以從另一個(gè)數(shù)據(jù)庫表中讀取數(shù)據(jù)記錄并向當(dāng)前表內(nèi)添加記錄,由于兩個(gè)表之間的字段定義可能不同,追加查詢只能添加相互匹配的字段內(nèi)容,而那些不對應(yīng)的字段將被忽略。

 

 

 

 

 

3. 刪除查詢

 

刪除查詢是所有查詢操作中最危險(xiǎn)的一個(gè)。刪除查詢是將整個(gè)記錄全部刪除而不只是刪除查詢所使用的字段。查詢所使用的字段只是用來作為查詢的條件??梢詮膯蝹€(gè)表刪除記錄,也可以通過級聯(lián)刪除相關(guān)記錄而從相關(guān)表中刪除記錄。

 

4. 生成表查詢

   

生成表查詢可以從一個(gè)或多個(gè)表/查詢的記錄中制作一個(gè)新表。在下列情況下使用生成表查詢:

◆ 把記錄導(dǎo)出到其數(shù)據(jù)庫。如創(chuàng)建一個(gè)交易已完成的訂單表,以便送到其它部門。

◆ 把記錄導(dǎo)出到Excel/Word之類的非關(guān)系應(yīng)用系統(tǒng)中。

◆ 對被導(dǎo)出的信息進(jìn)行控制。如篩選出機(jī)密或不相干的數(shù)據(jù)。

◆ 用作在一特定時(shí)間出現(xiàn)的一個(gè)報(bào)表的記錄源。

◆ 通過添加一個(gè)記錄集來保存初始文件,然后用一個(gè)追加查詢向該記錄集中添加新記錄。

◆ 用一個(gè)新記錄集替換現(xiàn)有的表中的記錄。

例如,要以【產(chǎn)品】表為基礎(chǔ),查詢出【產(chǎn)品名稱】、【類別】、【單價(jià)】、【庫存量】并生成一個(gè)新表:

 

 

 

 

 

 

五、SQL專用查詢

 

結(jié)構(gòu)化查詢語言(即SQL語言)是最重要的關(guān)系數(shù)據(jù)庫操作語言,在過去的幾年中,SQL語言已經(jīng)發(fā)展成為標(biāo)準(zhǔn)的計(jì)算機(jī)數(shù)據(jù)庫語言。

1986年美國國家標(biāo)準(zhǔn)協(xié)會ANSIAmerican National Standards Institute)和國際標(biāo)準(zhǔn)化組織ISOInternational Standards Organization)頒布了SQL正式標(biāo)準(zhǔn),同是時(shí)確認(rèn)SQL語言為數(shù)據(jù)庫操作的標(biāo)準(zhǔn)語言,現(xiàn)在已有100多種遍布在從微機(jī)到大型機(jī)上的數(shù)據(jù)庫產(chǎn)品SQL產(chǎn)品。SQL語言基本上獨(dú)立于數(shù)據(jù)庫本身及其使用的機(jī)器、網(wǎng)絡(luò)、操作系統(tǒng),基于SQLDBMS開發(fā)商所提供的產(chǎn)品一般都具有良好的可移植性。

SQL語言最初由IBM的研究人員在70年代提出,最初的名稱為SEQUEL(結(jié)果),從80年代開始改名為SQL,看似是SEQUEL的縮寫,但一般又理解為結(jié)構(gòu)化查詢語言Structure Query Language。

下面討論1991ANSI制定的SQL語言的核心。VFPSELECT-SQL可以據(jù)此理解之。

 

1.對單個(gè)表進(jìn)行查詢

下面考慮SQL對單個(gè)表進(jìn)行簡單的查詢。為了進(jìn)行實(shí)例分析,下面我們先建立三個(gè)表:

 

學(xué)生信息表ST

學(xué)號 *

姓名

主修

年齡

100

JONES

HISTORY

21

150

PARKS

ACCOUNTING

19

200

BAKER

MATH

50

250

GLASS

HISTORY

50

300

BAKER

ACCOUNTING

41

350

RUSSELL

MATH

20

400

RYE

ACCOUNTING

18

450

JONES

HISTORY

24

 

學(xué)生注冊表EN

學(xué)號 *

班名

注冊號

100

A100

1

150

B200

1

200

A100

2

200

C200

1

300

C100

1

400

B200

2

400

B100

1

400

C200

2

450

B200

3

 

面授安排表CL

班名 *

時(shí)間

教室

B200

MTH8

R001

A100

MWF3

R002

B100

MWF8

R002

C100

MWT3

R003

C200

MWF8

R004

 

⑴ 使用SQL進(jìn)行投影

投影是指取表的某些列的字段值。下面是使用SQL語句進(jìn)行投影的例子,從ST表中列出需要的學(xué)號、姓名和主修:

 

SELECT 學(xué)號,姓名,主修 FROM ST

學(xué)號   姓名         主修

100    JONES        HISTORY

150    PARKS        ACCOUNTING

200    BAKER        MATH

250    GLASS        HISTORY

300    BAKER        ACCOUNTING

350    RUSSELL      MATH

400    RYE          ACCOUNTING

450    JONES        HISTORY

 

 

SELECT 主修 FROM ST

主修

  HISTORY       

  ACCOUNTING    

  MATH          

  HISTORY       

  ACCOUNTING    

  MATH          

  ACCOUNTING    

  HISTORY 

 

 

SELECT DISTINCT 主修 FROM ST

主修

  ACCOUNTING    

  HISTORY       

  MATH 

 

 

⑵ 使用SQL進(jìn)行選擇

選擇是指到表的某些行的記錄值。請看下面的例子:

 

SELECT 學(xué)號,姓名,主修,年齡 FROM ST WHERE 主修=MATH

SELECT * FROM ST WHERE 主修=MATH

 

學(xué)號  姓名         主修             年齡

  200   BAKER        MATH              50

  350   RUSSELL      MATH              20

 

上述兩條件命令的結(jié)果是一樣的。我們可以將投影和選擇進(jìn)行合并如下:

 

SELECT 姓名,主修,年齡 FROM ST WHERE 主修=MATH

  姓名        主修            年齡

    BAKER        MATH              50

    RUSSELL      MATH              20

 

SELECT 姓名,主修,年齡 FROM ST WHERE 主修=MATHAND 年齡>21

  姓名         主修             年齡

    BAKER        MATH              50

 

 

SELECT 姓名,主修,年齡 FROM ST WHERE 主修 IN(MATH’,‘ACCOUNTING)

  姓名         主修             年齡

   PARKS        ACCOUNTING         19

   BAKER        MATH               50

   BAKER        ACCOUNTING         41

   RUSSELL      MATH               20

   RYE          ACCOUNTING         18

 

SELECT 姓名,主修,年齡 FROM ST WHERE 主修 NOT IN(MATH,ACCOUNTING)

  姓名         主修             年齡

   JONES        HISTORY            21

   GLASS        HISTORY            50

   JONES        HISTORY            24

 

SQL排序

SELECT 姓名,主修,年齡 FROM ST WHERE 主修=ACCOUNTING ORDER BY 姓名

  姓名         主修             年齡

   BAKER        ACCOUNTING         41

   PARKS        ACCOUNTING         19

   RYE          ACCOUNTING         18

SELECT 姓名,主修,年齡 FROM ST WHERE 主修 IN(MATH,ACCOUNTING)  ORDER BY 姓名 DESC,年齡 ASC

  姓名        主修            年齡

   RYE          ACCOUNTING         18

   RUSSELL      MATH               20

   PARKS        ACCOUNTING         19

   BAKER        ACCOUNTING         41

   BAKER        MATH               50

 

SQL內(nèi)置函數(shù)

SQL主要提供了前面我們提到的五個(gè)內(nèi)置函數(shù):COUNT、SUMAVG、MAX、MIN。

SELECT COUNT* FROM ST

  CNT

     8

上述語句計(jì)算表ST中的行數(shù),并用一行一列表示出來。

注意:除非和GROUP BY相連,在查詢的項(xiàng)中SELECT后內(nèi)置函數(shù)一般不和字段名一起使用。如下面的查詢語句雖然不是非法的,但結(jié)果的含義不清:

SELECT 姓名,COUNT*

  姓名        CNT

    JONES        8

請思考下面的兩個(gè)查詢語句的結(jié)果:

SELECT COUNT(主修) FROM ST

  Cnt_主修

     8

 

SELECT COUNTDISTINCT 主修) FROM ST

  DCnt_主修

     3

 

SQL內(nèi)置函數(shù)和分組

為了增強(qiáng)統(tǒng)計(jì)內(nèi)置函數(shù)的功能,內(nèi)置函數(shù)可以和分組函數(shù)合用,將源表中的數(shù)據(jù)分組,再對每一分組生成一個(gè)匯總行。例如:學(xué)生可以按照主修專業(yè)進(jìn)行分組,這意味著每一個(gè)專業(yè)將形成一個(gè)分組,然后可以對每一組進(jìn)行一定的統(tǒng)計(jì)。

 

SELECT 主修,COUNT* FROM ST GROUP BY 主修

  主修              Cnt

ACCOUNTING         3

HISTORY            3

MATH               2

 

有時(shí),我們不需要得到每一個(gè)分組的值,例如,我們對學(xué)生按照專業(yè)進(jìn)行分組,然后只需要具有兩個(gè)以上的行數(shù)的分組,在這種情況下,我們需要用到SQL中的HAVING關(guān)鍵字對不符合條件的分組進(jìn)行過濾。

 

下面的SQL語句可以統(tǒng)計(jì)出具有兩個(gè)以上學(xué)生的專業(yè),并統(tǒng)計(jì)該專業(yè)的學(xué)生數(shù)。

 

SELECT 主修,COUNT* FROM ST GROUP BY 主修 HAVING COUNT*>2

  主修              Cnt

ACCOUNTING         3

HISTORY            3

 

在上面的查詢中,還可以對查詢的學(xué)生進(jìn)行條件選擇,使用關(guān)鍵字WHERE進(jìn)行查詢,但是這樣會產(chǎn)生一定的模糊性,請看下例的結(jié)果,分析之:

 

SELECT 主修,AVG(年齡) FROM ST WHERE 姓名='JONES'

GROUP BY 主修 HAVING COUNT(*)>1

  主修              Avg_年齡

HISTORY            22.5

 

SELECT 主修,AVG(年齡) FROM ST  GROUP BY 主修 HAVING COUNT(*)>2

  主修              Avg_年齡

ACCOUNTING         26.00

HISTORY            31.67

 

SELECT 姓名,主修,AVG(年齡) FROM ST WHERE 姓名 IN('JONES','BAKER')

GROUP BY 主修 HAVING COUNT(*)>0

  姓名      主修              Avg_年齡

JONES    HISTORY            22.50

 

SELECT 姓名,主修,AVG(年齡) FROM ST WHERE 姓名 IN('JONES','BAKER')

GROUP BY 主修 HAVING COUNT(*)>1

  姓名      主修              Avg_年齡

BAKER    ACCOUNTING         41.00

JONES    HISTORY            22.50

BAKER    MATH               50.00

 

從上述結(jié)果來看,首先選擇適合條件的學(xué)生,對選擇出來的學(xué)生進(jìn)行分組,去除不適合HAVING條件的分組,顯示得到結(jié)果。

 

2.對多個(gè)表進(jìn)行查詢

 

下面我們將討論基于兩個(gè)或更多的表的SQL查詢語句。下面的例子基本上針對STCLEN三個(gè)表而言。

學(xué)生信息表ST

學(xué)號 *

姓名

主修

年齡

100

JONES

HISTORY

21

150

PARKS

ACCOUNTING

19

200

BAKER

MATH

50

250

GLASS

HISTORY

50

300

BAKER

ACCOUNTING

41

350

RUSSELL

MATH

20

400

RYE

ACCOUNTING

18

450

JONES

HISTORY

24

學(xué)生注冊表EN

學(xué)號 *

班名

注冊號

100

A100

1

150

B200

1

200

A100

2

200

C200

1

300

C100

1

400

B200

2

400

B100

1

400

C200

2

450

B200

3

面授安排表CL

班名 *

時(shí)間

教室

B200

MTH8

R001

A100

MWF3

R002

B100

MWF8

R002

C100

MWT3

R003

C200

MWF8

R004

 

⑴ 帶有子查詢的SQL查詢語句

假設(shè)我們需要知道入學(xué)到A100班的學(xué)生的名字,則來通過兩個(gè)步驟:首先通過條件班名為‘A100’在EN表中找到學(xué)生的學(xué)號,然后通過上面找到的學(xué)號‘100’和‘200’在ST表中找出這些學(xué)生的姓名。

如下面的兩個(gè)查詢語句:

SELECT 學(xué)號 FROM EN WHERE 班名=A100

學(xué)號

100

200

SELECT 姓名 FROM ST WHERE 學(xué)號 IN(‘100’,‘200’)

姓名

JONES

BAKER

我們可以將上述兩條語句進(jìn)行結(jié)合就可能直接得到我們需要的結(jié)果:

SELECT 姓名 FROM ST WHERE 學(xué)號 INSELECT 學(xué)號 FROM EN WHERE 班名=A100

姓名

JONES

BAKER

我們將第二個(gè)查詢語句稱為子查詢(SUBQUERY),它嵌套在主查詢的條件中。這種查詢方式是很有用的,但要注意子查詢的結(jié)果與主查詢的條件的類型匹配問題。

對于一般的SQL查詢語句而言,子查詢可以嵌套二層以上甚至更多,但VFP對子查詢的深度進(jìn)行了限制。請看下面的語句:

SELECT CL.班名 FROM CL WHERE 時(shí)間=MWF8

班名

B100

C200

SELECT EN.學(xué)號 FROM EN WHERE EN.班名 INSELECT CL.班名 FROM CL WHERE 時(shí)間=MWF8

學(xué)號

200

400

400

SELECT ST.姓名 FROM ST WHERE ST.學(xué)號 INSELECT EN.學(xué)號 FROM EN WHERE EN.班名 INSELECT CL.班名 FROM CL WHERE 時(shí)間=MWF8))

結(jié)果將提示:SQLSubquery nesting is too deep

按正常的理解,其結(jié)果應(yīng)是:

姓名

BAKER

RYE

也就是下面的語句的結(jié)果:

SELECT ST.姓名 FROM ST WHERE ST.學(xué)號 IN(‘200’,‘400’,‘400’)

同時(shí)通過上述查詢,我們得到一個(gè)重要的結(jié)論,RYE的報(bào)名有問題,或要將面授時(shí)間作調(diào)整,大家可以思考為什么?

 

SQL聯(lián)接查詢

子查詢的結(jié)果總是來自一個(gè)表,如果同時(shí)提供來自不同的表的數(shù)據(jù)(如每一個(gè)學(xué)生的學(xué)號、姓名、所在班名等),則必須將多個(gè)表(ST、EN)相聯(lián)接。

請看下面的語句:

 

SELECT ST.學(xué)號,ST.姓名,EN.班名,EN.注冊號 FROM ST,EN WHERE ST.學(xué)號=EN.學(xué)號

 

學(xué)號   姓名         班名        注冊號

100    JONES        A100         1

150    PARKS        B200         1

200    BAKER        A100         2

200    BAKER        C200         1

300    BAKER        C100         1

400    RYE          B200         2

400    RYE          B100         1

400    RYE          C200         2

450    JONES        B200         3

當(dāng)然,在WHERE條件中,可以加上其它的查詢結(jié)果的限定:

SELECT ST.學(xué)號,ST.姓名,EN.班名,EN.注冊號 FROM STEN WHERE ST.學(xué)號=EN.學(xué)號 AND ST.姓名=RYE AND EN.注冊號=2

學(xué)號   姓名         班名        注冊號

400    RYE          B200         2

400    RYE          C200         2

 

如果結(jié)果來自于兩個(gè)以上的表,我們可以使用相仿的方法,如下例:

SELECT ST.學(xué)號,CL.班名,CL.時(shí)間,EN.注冊號 FROM ST,EN,CL WHERE ST.學(xué)號=EN.學(xué)號 AND EN.班名=CL.班名 AND ST.姓名=BAKER

學(xué)號   班名         時(shí)間        注冊號

200    A100         MWF3         2

200    C200         MWF8         1

300    C100         MWT3         1

 

3. 回顧專用查詢

 

在專用查詢中,使用了除SELECT以外的其它幾個(gè)操作語句:UPDATEINSERT INTO、DELETESELECT INTO等等。

 

 

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多