西西軟件下載最安全的下載網站、值得信賴的軟件下載站!

首頁西西教程數據庫教程 → SQL多表鏈接查詢、嵌入SELECT語句的子查詢技術

SQL多表鏈接查詢、嵌入SELECT語句的子查詢技術

相關軟件相關文章發(fā)表評論 來源:西西整理時間:2013/1/10 9:43:51字體大小:A-A+

作者:西西點擊:0次評論:12次標簽: 查詢

  • 類型:PPC|WM平臺大。322KB語言:中文 評分:6.6
  • 標簽:
立即下載

高級查詢技術主要是涉及多個表的鏈接查詢技術、嵌入SELECT語句的子查詢技術,把多個查詢聯合起來的聯合技術等。

1. 連接查詢

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

1. ANSI鏈接

鏈接錯做可以同時查詢兩個或者多個表中的數據,所生成的結果集包含多個表中的字段,需要使用連個表中共同擁有的字段以連接多個表。

進行連接操作時,SQL一行一行地比較所指定的字段,然后把比較后的結果和滿足條件的數據合并,并生成新的記錄。

有三種連接方式:內連接、外連接和交叉連接。在一個SELECT語句中,可以連接多個表;鏈接通過擴展SELECT語句的FROM字句,增加了兩個關鍵字:JOIN和ON

JOIN:指定要了鏈接的表

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

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

ANSI鏈接語法形式如下所示:

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 ]可以為如下三個關鍵字形式:

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

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

例如:已經選修了4號課程的同學信息的示例,該示例涉及到了學生表和選修課:
SELECT 學生表

FROM  學生表  JOIN  選課表   ON   學生表.學號  選課表.學號

WHERE   選課表   課程號=4

2. SQL Server鏈接

多表連接,可以在FROM子句后直接指定多個表,語義上表示從這幾個表的笛卡爾積中檢索數據,可以用WHERE子句設定過濾條件。

SQL Server鏈接語法形式如下:

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

在此種語法形式中,FROM子句列出了連接時所使用到的全部表名,WHERE子句指定哪些行應該出現在結果集中,即用WHERE子句設定過濾條件。在WHERE子句中,在兩個連接的列中使用鏈接運算符。  

例如:檢索出至少已經有一門課程及格的同學的信息示例:

  SELECT  DISTINCT   學生表   *

FROM  學生表   選課表

WHERE   學生表.學號=選課表.學號   AND  選課表.成績=60

3. 子查詢

子查詢是一系列SELECT語句。SELECT語句可以嵌套在其他許多語句中,例如SELECT、INSERT、UPDATE、DELETE等,這些嵌套的SELECT語句就稱為子查詢。子查詢可以把一個復雜的查詢分解成一系列的邏輯步驟,這樣就可以用一個單個的語句解決一個復雜的查詢問題。當一個查詢依賴于另一個查詢的結果時,子查詢會很有用。

使用子查詢時,應注意:

子查詢要用括號起來

只需要一個值或一系列的值,就可以用子查詢代替一個表達式

子查詢中不能查詢包含數據類型是text或image的字段

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

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

可以用子查詢產生一個派生的表,用于代替FROM子句中的表。派生表示FROM子句中子查詢的一個特殊用法,用一個別名或用戶自定義的名字來引用這個派生表。FROM子句中的子查詢將返回一個結果集,這個結果集所形成的表將被外層SELECT語句使用。

例如:內層查詢用子查詢產生了一個派生的表,外層查詢將使用內層查詢的結果集。在功能上,派生表本身就等同于一個完整的查詢

SLECT  A  *

FROM  select   學號,姓名,年齡  from   學生表

              Where  班級=‘GZ02計6’  as   a

2. 把子查詢用作表達式

在T-SQL中,所有使用表達式的地方,都可以用子查詢來代替。此時子查詢必須返回單個的值或某一個字段的值。子查詢可以返回一系列的值來代替出現在WHERE子句中的IN關鍵字的表達式。

例如:查詢GZ02計7班同學的平均年齡以及每個同學年齡與平均年齡的差

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

其計算結果作為選擇列表中的一個輸出列,并作為算術表達式的一部分輸出:

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

3. 相關子查詢

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

使用相關子查詢時,內層子查詢被反復執(zhí)行,外層查詢有多少記錄,內層查詢就被齒形多少次。

例如:查詢已選修課程號的1且成績在90分以上的同學的學號及姓名:

SELECT  學號   姓名

FROM   學生表

WHERE   90  <=(  SELECT  成績

                      FROM   選課表

                         WHERE  學生表.學號=選課表.學號   AND   課程號=1)

4. 使用EXISTS和NOT EXISTS操作符

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

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

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

子查詢不產生任何數據

例如:同時選修了1號課程和2號課程的同學的信息:

          SELECT  學號,姓名,班級

           FROM   學生表

               WHERE   EXISTS(SELECT  *   FROM  選課表

                                    WHERE   學號=學生表.學號  AND  課程號=1)

              AND  EXISTS(SELECT  *  FROM  選課表

                                WHERE   學號=學生表.學號  AND   課程號=2)

① 找外層表“學生表”的第1行,根據其“學號”值處理內層查詢

② 用外層的“學號”與內層表“選課表”的“學號”比較,由此決定外層條件的真、假,如果為真,則此記錄為符合條件的結果,反之,則不輸出。

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

檢索出每一門選修課都幾個的同學信息

SELECT * FROM  學生表    WHERE 

  NOT  EXISTS( SELECT * FROM  選課表

                    WHERE   學生表.學號=選課表.學號  AND  成績<60)

AND  EXISTS( SELECT  *  FROM   選課表

                        WHERE   學生表.學號=選課表.學號)

使用TOP限制結果集

在使用SELECT語句進行查詢時,有時我們希望列出前幾個結果,而不是全部結果。例如,競賽時,可能只取成績最高的前三名,這時就需要使用TOP關鍵字來選取輸出的結果

使用TOP的格式為:

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

其中:

n:為非負整數

TOP n:表示取查詢結果的前n行

TOP  n  percent:表示取查詢結果的前n%行

With ties:表示包括并列的結果

例如:檢索出總分在前5位的同學的學號及其總分:

SELECT  TOP  5   WITH  TIES   學號, SUM(成績)   AS  總分

FROM  選課表

GROUP BY 學號

ORDER BY 總分 DESC

使用TOP時,注意最好與ORDER BY子句一起使用,因為這樣的前幾名才有意義。但當使用WITH TIES時,要求必須使用ORDER BY子句

合并多個結果集

可以將兩個或多個查詢的結果組合為一個結果集,這就是合并多個屆國際的含義。使用UNION可以實現合并多個查詢結果集的目的。作用UNION的格式為:

SELECT   語句1

UNION

SELECT   語句2

UNION [ALL]

……

SELECT   語句n

使用UNION,應注意幾點:

在默認情況下,UNION運算符刪除全部空余。如果使用ALL選項,那么空余行不刪除:

所有查詢語句中的列數和列的順序必須相同

所有查詢語句中的對應列的數據類型必須兼容

如果在UNION語句中,包含一個ORDER BY子句,那么整個結果集都要排序

在結果集中,列名來自第1個SELECT子句

例如:對GZ02計6班和GZ02計7班學生的查詢結果合并為一個結果集:

SELECT  *  FROM  學生表   WHERE  班級=‘GZ02計6’

UNION

SELECT  *  FROM  學生表    WHERE  班級=‘GZ02計7’

    相關評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

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

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字數: 0/500 (您的評論需要經過審核才能顯示)