西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

首頁(yè)西西教程數(shù)據(jù)庫(kù)教程 → SQL多表鏈接查詢、嵌入SELECT語(yǔ)句的子查詢技術(shù)

SQL多表鏈接查詢、嵌入SELECT語(yǔ)句的子查詢技術(shù)

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2013/1/10 9:43:51字體大。A-A+

作者:西西點(diǎn)擊:0次評(píng)論:12次標(biāo)簽: 查詢

  • 類型:PPC|WM平臺(tái)大。322KB語(yǔ)言:中文 評(píng)分:6.6
  • 標(biāo)簽:
立即下載

高級(jí)查詢技術(shù)主要是涉及多個(gè)表的鏈接查詢技術(shù)、嵌入SELECT語(yǔ)句的子查詢技術(shù),把多個(gè)查詢聯(lián)合起來(lái)的聯(lián)合技術(shù)等。

1. 連接查詢

需要同時(shí)從兩個(gè)或者連個(gè)以上的表中檢索數(shù)據(jù)。鏈接就是允許同時(shí)從兩個(gè)表或者兩個(gè)以上的表中檢索數(shù)據(jù),指定這些表中的某個(gè)或者某些列作為連接條件。在SQL Server中,可以使用兩種連接語(yǔ)法的形式,一種是ANSI鏈接語(yǔ)法形式,這是連接條件出現(xiàn)在FROM子句中;另外一種SQL Server鏈接語(yǔ)法形式,這是連接條件出現(xiàn)在WHERE條件中。

1. ANSI鏈接

鏈接錯(cuò)做可以同時(shí)查詢兩個(gè)或者多個(gè)表中的數(shù)據(jù),所生成的結(jié)果集包含多個(gè)表中的字段,需要使用連個(gè)表中共同擁有的字段以連接多個(gè)表。

進(jìn)行連接操作時(shí),SQL一行一行地比較所指定的字段,然后把比較后的結(jié)果和滿足條件的數(shù)據(jù)合并,并生成新的記錄。

有三種連接方式:內(nèi)連接、外連接和交叉連接。在一個(gè)SELECT語(yǔ)句中,可以連接多個(gè)表;鏈接通過(guò)擴(kuò)展SELECT語(yǔ)句的FROM字句,增加了兩個(gè)關(guān)鍵字:JOIN和ON

JOIN:指定要了鏈接的表

ON:指定這些表共同擁有的字段

在表的主鍵和外部鍵的基礎(chǔ)上,指定連接條件。

ANSI鏈接語(yǔ)法形式如下所示:

SELECT table_name.column_name, table_name.column_name,……

FROM { table_name[ join_type] JOIN table_name  ON   search_conditions}

WHERE[ search_conditions]

其中[ join_type ]可以為如下三個(gè)關(guān)鍵字形式:

INNER(內(nèi)連接):鏈接查詢結(jié)果集中僅包含滿足條件的行,內(nèi)連接是SQL Server缺省的連接方式,可以把INNER JOIN簡(jiǎn)寫成 JOIN;

OUTER(外連接):鏈接查詢結(jié)果集中既包含哪些滿足條件的行,還包含其中某個(gè)表的全部行,有三種形式的外連接:左外連接、右外連接、全外連接。

例如:已經(jīng)選修了4號(hào)課程的同學(xué)信息的示例,該示例涉及到了學(xué)生表和選修課:
SELECT 學(xué)生表

FROM  學(xué)生表  JOIN  選課表   ON   學(xué)生表.學(xué)號(hào)  選課表.學(xué)號(hào)

WHERE   選課表   課程號(hào)=4

2. SQL Server鏈接

多表連接,可以在FROM子句后直接指定多個(gè)表,語(yǔ)義上表示從這幾個(gè)表的笛卡爾積中檢索數(shù)據(jù),可以用WHERE子句設(shè)定過(guò)濾條件。

SQL Server鏈接語(yǔ)法形式如下:

SELECT  table_name.column_name,table_name.column_name,……

FROM { table_name,table_name,……}

WHERE table_name.column_name join_operator table_name.column_name

在此種語(yǔ)法形式中,F(xiàn)ROM子句列出了連接時(shí)所使用到的全部表名,WHERE子句指定哪些行應(yīng)該出現(xiàn)在結(jié)果集中,即用WHERE子句設(shè)定過(guò)濾條件。在WHERE子句中,在兩個(gè)連接的列中使用鏈接運(yùn)算符。  

例如:檢索出至少已經(jīng)有一門課程及格的同學(xué)的信息示例:

  SELECT  DISTINCT   學(xué)生表   *

FROM  學(xué)生表   選課表

WHERE   學(xué)生表.學(xué)號(hào)=選課表.學(xué)號(hào)   AND  選課表.成績(jī)=60

3. 子查詢

子查詢是一系列SELECT語(yǔ)句。SELECT語(yǔ)句可以嵌套在其他許多語(yǔ)句中,例如SELECT、INSERT、UPDATE、DELETE等,這些嵌套的SELECT語(yǔ)句就稱為子查詢。子查詢可以把一個(gè)復(fù)雜的查詢分解成一系列的邏輯步驟,這樣就可以用一個(gè)單個(gè)的語(yǔ)句解決一個(gè)復(fù)雜的查詢問(wèn)題。當(dāng)一個(gè)查詢依賴于另一個(gè)查詢的結(jié)果時(shí),子查詢會(huì)很有用。

使用子查詢時(shí),應(yīng)注意:

子查詢要用括號(hào)起來(lái)

只需要一個(gè)值或一系列的值,就可以用子查詢代替一個(gè)表達(dá)式

子查詢中不能查詢包含數(shù)據(jù)類型是text或image的字段

子查詢中也可以再包含子查詢,嵌套可以多至32層

1. 把子查詢用作派生的表

可以用子查詢產(chǎn)生一個(gè)派生的表,用于代替FROM子句中的表。派生表示FROM子句中子查詢的一個(gè)特殊用法,用一個(gè)別名或用戶自定義的名字來(lái)引用這個(gè)派生表。FROM子句中的子查詢將返回一個(gè)結(jié)果集,這個(gè)結(jié)果集所形成的表將被外層SELECT語(yǔ)句使用。

例如:內(nèi)層查詢用子查詢產(chǎn)生了一個(gè)派生的表,外層查詢將使用內(nèi)層查詢的結(jié)果集。在功能上,派生表本身就等同于一個(gè)完整的查詢

SLECT  A  *

FROM  select   學(xué)號(hào),姓名,年齡  from   學(xué)生表

              Where  班級(jí)=‘GZ02計(jì)6’  as   a

2. 把子查詢用作表達(dá)式

在T-SQL中,所有使用表達(dá)式的地方,都可以用子查詢來(lái)代替。此時(shí)子查詢必須返回單個(gè)的值或某一個(gè)字段的值。子查詢可以返回一系列的值來(lái)代替出現(xiàn)在WHERE子句中的IN關(guān)鍵字的表達(dá)式。

例如:查詢GZ02計(jì)7班同學(xué)的平均年齡以及每個(gè)同學(xué)年齡與平均年齡的差

 SELECT  avg(年齡)  FROM 學(xué)生表  as  平均年齡

其計(jì)算結(jié)果作為選擇列表中的一個(gè)輸出列,并作為算術(shù)表達(dá)式的一部分輸出:

年齡-(SELECT avg(年齡)  FROM  學(xué)生表)   as   年齡差

3. 相關(guān)子查詢

相關(guān)子查詢可被用作動(dòng)態(tài)表達(dá)式,這個(gè)表達(dá)式的值相對(duì)于外層查詢的每一行而變化。查詢處理器為外層查詢的每一個(gè)記錄計(jì)算子查詢的值,一次一行,而這個(gè)子查詢每次都會(huì)被作為一個(gè)表達(dá)式而被計(jì)算并返回給外層查詢。相關(guān)子查詢是動(dòng)態(tài)執(zhí)行的子查詢和外層查詢間的一個(gè)非常有效的聯(lián)合。

使用相關(guān)子查詢時(shí),內(nèi)層子查詢被反復(fù)執(zhí)行,外層查詢有多少記錄,內(nèi)層查詢就被齒形多少次。

例如:查詢已選修課程號(hào)的1且成績(jī)?cè)?0分以上的同學(xué)的學(xué)號(hào)及姓名:

SELECT  學(xué)號(hào)   姓名

FROM   學(xué)生表

WHERE   90  <=(  SELECT  成績(jī)

                      FROM   選課表

                         WHERE  學(xué)生表.學(xué)號(hào)=選課表.學(xué)號(hào)   AND   課程號(hào)=1)

4. 使用EXISTS和NOT EXISTS操作符

在相關(guān)子查詢中可以使用EXISTS和NOT EXISTS操作符判斷某個(gè)值是否在一系列的值中。SQL Server處理帶有EXISTS和NOT EXISTS操作符的子查詢時(shí):

外層查詢測(cè)試子查詢返回的記錄是否存在

基于查詢所指定的條件,子查詢返回TRUE或FALSE

子查詢不產(chǎn)生任何數(shù)據(jù)

例如:同時(shí)選修了1號(hào)課程和2號(hào)課程的同學(xué)的信息:

          SELECT  學(xué)號(hào),姓名,班級(jí)

           FROM   學(xué)生表

               WHERE   EXISTS(SELECT  *   FROM  選課表

                                    WHERE   學(xué)號(hào)=學(xué)生表.學(xué)號(hào)  AND  課程號(hào)=1)

              AND  EXISTS(SELECT  *  FROM  選課表

                                WHERE   學(xué)號(hào)=學(xué)生表.學(xué)號(hào)  AND   課程號(hào)=2)

① 找外層表“學(xué)生表”的第1行,根據(jù)其“學(xué)號(hào)”值處理內(nèi)層查詢

② 用外層的“學(xué)號(hào)”與內(nèi)層表“選課表”的“學(xué)號(hào)”比較,由此決定外層條件的真、假,如果為真,則此記錄為符合條件的結(jié)果,反之,則不輸出。

③ 順序處理外層表“學(xué)生表”中的第2、3、4、。。。行

檢索出每一門選修課都幾個(gè)的同學(xué)信息

SELECT * FROM  學(xué)生表    WHERE 

  NOT  EXISTS( SELECT * FROM  選課表

                    WHERE   學(xué)生表.學(xué)號(hào)=選課表.學(xué)號(hào)  AND  成績(jī)<60)

AND  EXISTS( SELECT  *  FROM   選課表

                        WHERE   學(xué)生表.學(xué)號(hào)=選課表.學(xué)號(hào))

使用TOP限制結(jié)果集

在使用SELECT語(yǔ)句進(jìn)行查詢時(shí),有時(shí)我們希望列出前幾個(gè)結(jié)果,而不是全部結(jié)果。例如,競(jìng)賽時(shí),可能只取成績(jī)最高的前三名,這時(shí)就需要使用TOP關(guān)鍵字來(lái)選取輸出的結(jié)果

使用TOP的格式為:

SELECT  TOP  n[ percent] [with  ties]  查詢列表

其中:

n:為非負(fù)整數(shù)

TOP n:表示取查詢結(jié)果的前n行

TOP  n  percent:表示取查詢結(jié)果的前n%行

With ties:表示包括并列的結(jié)果

例如:檢索出總分在前5位的同學(xué)的學(xué)號(hào)及其總分:

SELECT  TOP  5   WITH  TIES   學(xué)號(hào), SUM(成績(jī))   AS  總分

FROM  選課表

GROUP BY 學(xué)號(hào)

ORDER BY 總分 DESC

使用TOP時(shí),注意最好與ORDER BY子句一起使用,因?yàn)檫@樣的前幾名才有意義。但當(dāng)使用WITH TIES時(shí),要求必須使用ORDER BY子句

合并多個(gè)結(jié)果集

可以將兩個(gè)或多個(gè)查詢的結(jié)果組合為一個(gè)結(jié)果集,這就是合并多個(gè)屆國(guó)際的含義。使用UNION可以實(shí)現(xiàn)合并多個(gè)查詢結(jié)果集的目的。作用UNION的格式為:

SELECT   語(yǔ)句1

UNION

SELECT   語(yǔ)句2

UNION [ALL]

……

SELECT   語(yǔ)句n

使用UNION,應(yīng)注意幾點(diǎn):

在默認(rèn)情況下,UNION運(yùn)算符刪除全部空余。如果使用ALL選項(xiàng),那么空余行不刪除:

所有查詢語(yǔ)句中的列數(shù)和列的順序必須相同

所有查詢語(yǔ)句中的對(duì)應(yīng)列的數(shù)據(jù)類型必須兼容

如果在UNION語(yǔ)句中,包含一個(gè)ORDER BY子句,那么整個(gè)結(jié)果集都要排序

在結(jié)果集中,列名來(lái)自第1個(gè)SELECT子句

例如:對(duì)GZ02計(jì)6班和GZ02計(jì)7班學(xué)生的查詢結(jié)果合并為一個(gè)結(jié)果集:

SELECT  *  FROM  學(xué)生表   WHERE  班級(jí)=‘GZ02計(jì)6’

UNION

SELECT  *  FROM  學(xué)生表    WHERE  班級(jí)=‘GZ02計(jì)7’

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(12)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)