天天看點

學習筆記 |《SQL必知必會》| ch12 — ch13 進階聯結表

第12課 聯結表

  • 這一課會介紹什麼是聯結。
  • 為什麼使用聯結。
  • 如何編寫使用聯結的

    SELECT

    語句。

12.1 聯結

12.1.1 關系表

  • 關系表的設計就是要把資訊分解成多個表,一類資料一個表。
  • 各表通過某些共同的值互相關聯,是以才叫

    關系資料庫

12.1.2 為什麼使用聯結

可伸縮scale

:能夠适應不斷增加的工作量而不失敗。
  • 設計良好的資料庫或應用程式稱為可伸縮性好。
  • 聯結

    ,是一種機制,用來在一條

    SELECT

    語句中關聯表,是以稱為聯結。
  • 使用特殊的文法,可以聯結多個表傳回一組輸出,聯結在運作時關聯表中正确的行。

12.2 建立聯結

  • 建立聯結非常簡單,指定要聯結的所有表以及關聯它們的方式即可。使用

    完全限定列名

    的方式。

12.2.1

WHERE

子句的重要性

  • 在一條

    SELECT

    語句中聯結幾個表時,相應的關系是在運作中構造的。
  • 在資料庫表的定義中沒有訓示

    DBMS

    如何對表進行聯結的内容。你必須自己做這件事情。
  • 在聯結兩個表時,實際要做的是将第一個表中的每一行與第二個表中的每一行配對。

    WHERE

    子句作為過濾條件,隻包含那些比對給定條件(這裡是聯結條件)的行。沒有WHERE子句,第一個表中的每一行将與第二個表中的每一行配對,而不管它們邏輯上是否能配在一起。

笛卡兒積(cartesian product)

  • 由沒有聯結條件的表關系傳回的結果為笛卡兒積。檢索出的行的數目将是第一個表中的行數乘以第二個表中的行數。
提示:

叉聯結

有時,傳回笛卡兒積的聯結,也稱

叉聯結(cross join)

12.2.2 内聯結

  • 目前為止使用的聯結稱為

    等值聯結(equijoin)

    ,它基于兩個表之間的相等測試。這種聯結也稱為

    内聯結(inner join)

12.2.3 聯結多個表

  • SQL

    不限制一條

    SELECT

    語句中可以聯結的表的數目。建立聯結的基本規則也相同。首先列出所有表,然後定義表之間的關系。

注意:聯結中表的最大數目

雖然

SQL

本身不限制每個聯結限制中表的數目,但實際上許多

DBMS

都有限制。

第13課 建立進階聯結

  • 本課首先講授了如何以及為什麼使用别名,然後讨論不同的聯結類型以及每類聯結所使用的文法。
  • 我們還介紹了如何與聯結一起使用聚集函數,以及在使用聯結時應該注意的問題。

13.1 使用表别名

SQL

除了可以對列名和計算字段使用别名,還允許給表名起别名。這樣做有兩個主要理由:

  • 縮短

    SQL

    語句
  • 允許在一條

    SELECT

    語句中多次使用相同的表

表别名不僅能用于

WHERE

子句,還可以用于

SELECT

的清單、

ORDER BY

子句以及其他語句部分。

  • 表别名隻在查詢執行中使用。與列别名不一樣,表别名不傳回到用戶端。

13.2 使用不同類型的聯結

  • 自聯結(self-join)

  • 自然聯結(natural join)

  • 外聯結(outer join)

13.2.1 自聯結

  • 使用表别名的一個主要原因是能在一條

    SELECT

    語句中不止一次引用相同的表。

提示:用自聯結而不用子查詢

自聯結通常作為外部語句,用來替代從相同表中檢索資料的使用子查詢語句。雖然最終的結果是相同的,但許多

DBMS

處理聯結遠比處理子查詢快得多。應該試一下兩種方法,以确定哪一種的性能更好。

13.2.2 自然聯結

無論何時對表進行聯結,應該至少有一列不止出現在一個表中(被聯結的列)。标準的聯結(前一課中介紹的内聯結)傳回所有資料,相同的列甚至多次出現。自然聯結排除多次出現,使每一列隻傳回一次。

  • 系統不完成這項工作,由你自己完成它。自然聯結要求你隻能選擇那些唯一的列,一般通過對一個表使用通配符

    (SELECT *)

    ,而對其他表的列使用明确的子集來完成。
  • 事實上,我們迄今為止建立的每個内聯結都是自然聯結,很可能永遠都不會用到不是自然聯結的内聯結。

13.2.3 外聯結

許多聯結将一個表中的行與另一個表中的行相關聯,但有時候需要包含沒有關聯行的那些行。

  • 聯結包含了那些在相關表中沒有關聯行的行。這種聯結稱為外聯結。
  • 在使用

    OUTER JOIN

    文法時,必須使用RIGHT或LEFT關鍵字指定包括其所有行的表(

    RIGHT

    指出的是

    OUTER JOIN

    右邊的表,而

    LEFT

    指出的是

    OUTER JOIN

    左邊的表)。

提示:外聯結的類型

要記住,總是有兩種基本的外聯結形式:左外聯結和右外聯結。它們之間的唯一差别是所關聯的表的順序。換句話說,調整

FROM

WHERE

子句中表的順序,左外聯結可以轉換為右外聯結。是以,這兩種外聯結可以互換使用,哪個友善就用哪個。
  • 還存在另一種外聯結,就是全外聯結(

    full outer join

    ),它檢索兩個表中的所有行并關聯那些可以關聯的行。與左外聯結或右外聯結包含一個表的不關聯的行不同,全外聯結包含兩個表的不關聯的行。

13.3 使用帶聚集函數的聯結

  • 聚集函數用來彙總資料。這些函數也可以與聯結一起使用。

13.4 使用聯結和聯結條件

  • 注意所使用的聯結類型。一般我們使用内聯結,但使用外聯結也有效。
  • 關于确切的聯結文法,應該檢視具體的文檔,看相應的

    DBMS

    支援何種文法(大多數

    DBMS

    使用這兩課中描述的某種文法)。
  • 保證使用正确的聯結條件(不管采用哪種文法),否則會傳回不正确的資料。
  • 應該總是提供聯結條件,否則會得出

    笛卡兒積

  • 在一個聯結中可以包含多個表,甚至可以對每個聯結采用不同的聯結類型。雖然這樣做是合法的,一般也很有用,但應該在一起測試它們前分别測試每個聯結。這會使故障排除更為簡單。