第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 外聯結
許多聯結将一個表中的行與另一個表中的行相關聯,但有時候需要包含沒有關聯行的那些行。
- 聯結包含了那些在相關表中沒有關聯行的行。這種聯結稱為外聯結。
- 在使用
文法時,必須使用RIGHT或LEFT關鍵字指定包括其所有行的表(OUTER JOIN
指出的是RIGHT
右邊的表,而OUTER JOIN
指出的是LEFT
左邊的表)。OUTER JOIN
提示:外聯結的類型
要記住,總是有兩種基本的外聯結形式:左外聯結和右外聯結。它們之間的唯一差别是所關聯的表的順序。換句話說,調整
或
FROM
子句中表的順序,左外聯結可以轉換為右外聯結。是以,這兩種外聯結可以互換使用,哪個友善就用哪個。
WHERE
- 還存在另一種外聯結,就是全外聯結(
),它檢索兩個表中的所有行并關聯那些可以關聯的行。與左外聯結或右外聯結包含一個表的不關聯的行不同,全外聯結包含兩個表的不關聯的行。full outer join
13.3 使用帶聚集函數的聯結
- 聚集函數用來彙總資料。這些函數也可以與聯結一起使用。
13.4 使用聯結和聯結條件
- 注意所使用的聯結類型。一般我們使用内聯結,但使用外聯結也有效。
- 關于确切的聯結文法,應該檢視具體的文檔,看相應的
支援何種文法(大多數DBMS
使用這兩課中描述的某種文法)。DBMS
- 保證使用正确的聯結條件(不管采用哪種文法),否則會傳回不正确的資料。
- 應該總是提供聯結條件,否則會得出
。笛卡兒積
- 在一個聯結中可以包含多個表,甚至可以對每個聯結采用不同的聯結類型。雖然這樣做是合法的,一般也很有用,但應該在一起測試它們前分别測試每個聯結。這會使故障排除更為簡單。