查詢結果可包含來自多個表或表值對象的資料。若要組合來自多個表值對象的資料,可使用 SQL 的 JOIN 操作。
自動聯結表
當將兩個或多個表添加到查詢中時,查詢和視圖設計器會嘗試確定它們是否相關。如果相關,查詢和視圖設計器自動在表示表或表結構對象的矩形之間添加聯結線。
如果滿足下列條件,查詢和視圖設計器將表識別為聯結的表:
資料庫包含指定該表是相關的資訊。
如果兩個表中各自的一列具有相同的名稱和資料類型。該列必須至少在一個表中是主鍵。例如,假設添加 employee 和 jobs 表,如果 job_id 列是 jobs 表的主鍵,並且每個表中都有一個名為 job_id 的列,且具有相同的資料類型,那麼查詢和視圖設計器將自動聯結這兩個表。
查詢和視圖設計器檢測到搜尋條件(WHERE 子句)實際上就是聯結條件。例如,可以添加表 employee 和 jobs,然後建立一個搜尋條件,搜尋這兩個表的 job_id 列中的相同值。當執行搜尋時,查詢和視圖設計器檢測到該搜尋條件可導致聯結,然後根據該搜尋條件建立聯結條件。
手動聯結表
當向查詢中添加兩個或更多表時,查詢和視圖設計器將嘗試根據公用資料或資料庫中儲存的關於這些表如何相關的資訊來聯結它們。有關詳細資料,請參見如何:自動聯結表。但是,如果查詢和視圖設計器未自動聯結這些表,或者您希望在這些表之間建立其他聯結條件,則可手動聯結這些表。
除基於包含相同資訊的列之外,還可以基於任意兩列之間的比較建立聯結。例如,如果資料庫包含 titles 和 roysched 兩個表,則可將 titles 表的 ytd_sales 列中的值與 roysched 表的 lorange 和 hirange 列中的值相比較。建立該聯結將使您得以尋找特定的書名,這些書截止到目前的年銷售額位於版稅的最高和最低範圍之內。
建立外部聯結
預設情況下,查詢和視圖設計器在表之間建立內部聯結。如果要在結果集中包含在聯結表無匹配項的資料行,可建立外部聯結。
當建立外部聯結時,表在 SQL 陳述式中出現的順序(在 SQL 窗格中反映)非常重要。添加的第一個表成為“左”表,而第二個表成為“右”表。(表在“關係圖”窗格中實際出現的順序並不重要。)當您指定左方外部聯結或右方外部聯結時,引用的順序是將這些表添加到查詢中的順序,以及它們在“SQL”窗格中的 SQL 陳述式中出現的順序。
建立外部聯結
自動或手動建立外部聯結。有關詳細資料,請參見如何:自動聯結表或如何:手動聯結表。
在“關係圖”窗格中選擇聯結線,然後從“查詢設計工具”菜單中選擇“從 <tablename> 中選擇所有行”,選擇命令,以包括您要包括其中更多行的表。
選擇第一個表可建立左方外部聯結。
選擇第二個表可建立右方外部聯結。
選擇兩個表可建立完整外部聯結。
當您指定外部聯結時,查詢和視圖設計器將修改聯結線以指示外部聯結。
此外,查詢和視圖設計器將修改“SQL”窗格中的 SQL 陳述式,以反映聯結類型的變化,如下列語句所示:
|
SELECT employee.job_id, employee.emp_id, employee.fname, employee.minit, jobs.job_descFROM employee LEFT OUTER JOIN jobs ON employee.job_id = jobs.job_id |
因為外部聯結包含不匹配的行,所以可使用它尋找與外鍵約束衝突的行。為此,可建立一個外部聯結,然後添加搜尋條件以尋找在最右側表的主鍵列為空白的行。例如,下列外部聯結尋找 employee 表中在 jobs 表中無相應行的那些行:
|
SELECT employee.emp_id, employee.job_idFROM employee LEFT OUTER JOIN jobs ON employee.job_id = jobs.job_idWHERE (jobs.job_id IS NULL) 聯結類型 當聯結表時,建立的聯結類型影響出現在結果集內的行。可以建立下列聯結類型:
內部聯結 僅顯示兩個聯結表中的匹配行的聯結。(這是查詢和視圖設計器中的預設聯結類型。)例如,可以聯結 titles 表和 publishers 表以建立顯示每個書名的出版商名稱的結果集。在內部聯結中,結果集內不包含沒有出版商資訊的書名,也不包含沒有書名的出版商。這類聯結所得到的 SQL 可能像下面這樣:
|
SELECT title, pub_nameFROM titles INNER JOINpublishers ON titles.pub_id = publishers.pub_id |
說明: |
當建立內部聯結時,包含 NULL 的列不與任何值匹配,因此不包括在結果集內。空值不與其他的空值匹配。 |
外部聯結 即使在聯結表中沒有相關行的行也可包括在內的聯結。可以建立外部聯結的三個變體來指定要包括的不匹配行:
左方外部聯結 包括第一個命名表(“左”表,出現在 JOIN 子句的最左邊)中的所有行。不包括右表中的不匹配行。例如,下面的 SQL 陳述式說明這樣一個左方外部聯結,它在 titles 表和 publishers 表之間聯結以包括所有的書名,甚至包括那些沒有出版商資訊的書名:
|
SELECT titles.title_id, titles.title, publishers.pub_nameFROM titles LEFT OUTER JOIN publishers ON titles.pub_id = publishers.pub_id |
右方外部聯結 包括第二個命名表(“右”表,出現在 JOIN 子句的最右邊)中的所有行。不包括左表中的不匹配行。例如,在 titles 和 publishers 表之間的右方外部聯結將包括所有的出版商,甚至包括那些在 titles 表中沒有書名的出版商。得到的 SQL 可能像下面這樣:
|
SELECT titles.title_id, titles.title, publishers.pub_nameFROM titles RIGHT OUTER JOIN publishers ON titles.pub_id = publishers.pub_id |
完整外部聯結 包括所有聯結表中的所有行,不論它們是否匹配。例如,titles 和 publishers 之間的完整外部聯結顯示所有書名和所有出版商,甚至包括那些在另一個表中沒有匹配值的行。
|
SELECT titles.title_id, titles.title, publishers.pub_nameFROM titles FULL OUTER JOIN publishers ON titles.pub_id = publishers.pub_id |
說明: |
有些資料庫(如 Oracle)不支援完整外部聯結。 |
完全聯結 在這類聯結的結果集內,兩個表中每對可能成對的行佔一行。例如,在通過作者 CROSS JOIN(完全聯結)出版商輸出的結果集內,每個可能的作者/出版商組合佔一行。得到的 SQL 可能像下面這樣:
|
SELECT *FROM authors CROSS JOIN publishers |
|