跳至內容

連接

出自Taiwan Tongues 台語維基
於 2025年8月22日 (五) 17:10 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

SQL 中的連接(` JOIN `)語句用佇咧將資料庫內底的兩个濟濟的表組合起來。由 " 連接 " 生成的集合,會當予人儉做表示,抑是當做表來使用。` JOIN ` 語句的含義是共兩張表的屬性通過𪜶的值組合做伙。是因為 ANSI 標準的 SQL 列出著五種 ` JOIN ` 方式:內連接(` INNER `), 全外連接(` FULL OUTER `), 倒外連接(` LEFT OUTER `), 正外連接(` RIGHT OUTER `)佮交叉連接(` CROSS `)。 佇咧特定的情形下,一塊表(基本表,視圖,抑是講連接表)會當佮家己的進行連接,成做自連接(self-join)。

程式設計師用 ` JOIN ` 為詞表示愛得著 " 連接 " 後的集合。若求值以後叫詞為真,組合了後的記錄就會按照預期的方式來生成,如一个記錄集,抑是一張臨時表。

範例用表

通常會對關聯式資料庫進行規格化,以消除重複資訊,譬如講實體類型有一對偌關係的時陣。比如講,一个部門可能佮足濟倩員相關聯。將部門佮員工的單獨表連接起來,會當有效地建立另外一个表示,將兩个表中的資訊組合做伙。

下文中的解說 " 連接 " 攏用佇遮的兩張表現。表內底的記錄(走)用搬的無仝類型的 " 連接 " 和 " 連接謂詞 " 的作用。佇下跤兩塊表中,` Department . DepartmentID ` 是主鍵,` Employee . DepartmentID ` 是外來鍵。

注:雇員 " Williams " 無佇咧部門表中的任何一个部門。仝款," 市場部 " 目前無員工列出。

這是因為欲做了建立乎 SQL。

交叉連接

交叉連接(cross join), 閣稱𥰔仔卡爾連接(cartesian join)抑是叉仔乘(Product), 伊是所有類型的內連接的基礎。共表現做行記錄的集合,交叉連接就倒轉來這兩个集合的𥰔仔卡爾積。這其實等於內底連接的條件做 " 永真 ",抑是連接條件無存在。

若是 A 和 B 是兩个集合,𪜶的相扯連接就記為 : A × B。

用佇交叉連接的 SQL 代碼佇咧 ` FROM ` 列出表名,但並無包含任何過濾的連接謂詞。

顯式的交叉連接實例 :

隱式的交叉連接實例 :

交叉連接袂應用任何謂詞去過濾結果表中的記錄。程式設計師會當用 ` WHERE ` 語句進一步過濾結果集。

佇咧 SQL : 兩千空一十一標準中,交叉連接是可選的 F 四百空一「Extended joined table」包的一部份。

通常用於檢查侍服器的效能。

內連接

內連接(inner join)是應用程式中用的普遍的 " 連接 " 操作,伊一般攏是預設連接類型。內底連接是因為詞將兩張表(如 A 和 B)的列組合做伙,產生新的後果表。查詢會將 A 表的每一逝佮 B 表的每一行進行較,並揣出滿足連接謂詞的組合。當連接謂詞被滿足,A 和 B 中匹配的行會照列組合(並排組合)結果集中的一行。連接產生的後果集,會當定義為首先對兩張表做𥰔仔卡爾積(交叉連接)--將 A 中的每一逝和 B 中的每一行組合,然後倒轉來滿足連接謂詞的記錄。實際上 SQL 產品會趕緊用其他的方式去實現連接,𥰔仔卡爾積運算是非常無效率。

SQL 定義了兩種無仝款的語法去表示 " 連接 "。首先是 " 顯式連接符號 ",伊顯式的使用關鍵字 ` JOIN `,其次是 " 隱式連接符號 ",伊使用所謂的 " 隱式連接符號 "。隱式連接符號共需要連接的表放到 ` SELECT ` 語句的 ` FROM ` 部份,並用弄號隔開。按呢就構成一个 " 交叉連接 ",` WHERE ` 語句可能下置一寡過濾謂詞(過濾條件)。 遐的過濾謂詞佇咧功能上等價若是顯式連接符號。SQL 八十九標準干焦支援內部連接佮交叉連接,因此只有隱式連接這種表達方式;SQL 九十二標準增加了對外部連接的支援,這才有了 ` JOIN ` 表達式。

內連接 " 會當進一步被分做:相連接,自然連接,佮交叉連接(相連紲)。

程式愛應該特別注意共接依照的列可能包括 NULL 值,NULL 值無佮任何值匹配(甚至佮伊本身)--除非連接條件中顯式的使用 ` IS NULL ` 抑是 ` IS NOT NULL ` 等謂詞。

比如講,下跤來查詢通過 Employee 表和 Department 表示因為有的屬性 DepartmentID 連接兩表。兩表 DepartmentID 匹配的所在(如連接謂詞被滿足), 查詢將組合兩表的 _ LastName _,_ DepartmentID _ 和 _ DepartmentName _ 等列,共𪜶囥到尾仔來做這途的(一條記錄)里。當 DepartmentID 不匹配,就袂去結果表中生成任何資料。

顯式的內連接實例 :

等價於 :

顯式的內底連接的輸出結果 :

雇員 " Williams " 和部門 " 市場部 " 攏無出現。𪜶咧預期得的表中無任何匹配的記錄 : " Williams " 無關聯的部門,號碼為三十五的部門內底無任何雇員。按呢乎,佇咧 " 連接 " 後的表中,就無關於著 Williams 抑是市場部的資訊矣。佮預期相對預期的結果,這个行為可能是一个微妙的 Bug。連接可能會當避免這款情形。

相連結

相連接(equi-join,抑是equijoin), 是較連接(_ θ 連接 _)的一種特例,伊的連接叫詞干焦用著相比較。使用其他較運算子(如 ` < `)的毋是相連接。頭前的查詢已經展示一个相連紲的實例 :

SQL 九十二提供了一種可選的簡短符號去表達相連接,伊使用 ` USING ` 關鍵字(Feature ID F 四百空二):

` USING ` 結構並毋但是語法糖,頂懸查詢的結果佮使用顯式謂詞得著的查詢得著的結果是無仝的。特別地,佇咧 ` USING ` 部份列出的列(column)將佇連接結果的臨時表內底干焦出現一擺,而且無表名限定的列名。佇頂懸的彼个例中,連接結果的臨時表產生單獨的名做 ` DepartmentID ` 的列,毋是 ` employee . DepartmentID ` 抑是 ` department . DepartmentID `。

MS SQL Server 和 Sybase 無支援 ` USING ` 語句。

自然連接

自然連接比相連接的進一步特例化。兩表做自然連接時,兩表中的所有的名稱仝款的列攏將被較,這是隱式的。自然連接會著的結果表內底,兩表中名稱仝款的列干焦出現一改。

頂頭用佇內底連接的查詢實例會當用自然連接的方式表示這改 :

用矣 ` USING ` 語句了後,佇連接表中,DepartmentID 列干焦出現一擺,而且無表名作字首 :

佇咧 Oracle 里用 ` JOIN USING ` 抑是 ` NATURAL JOIN ` 時,若準兩表共有的列的名稱前加上某表名作為字條,則會報編譯錯誤 : " ORA 鋪二交五千一百五十四 : column part of USING clause cannot have qualifier " 抑是 " ORA 鋪二交五千一百五十五 : column used in NATURAL join cannot have qualifier "。

外連接

外連接並無要求連接的兩表的逐條記錄佇對方表內攏一條匹配的記錄。愛保留所有的記錄(甚至這條記錄無匹配的記錄嘛愛保留)的表稱為保留表。外連接可依據連接表保留左表,正表抑是全部表的行而進一步分做倒外連接,正外連接佮全連接。

( 佇這个情形下 _ left _ < _ 倒 _ > 和 _ right _ < _ 正 _ > 表示 ` JOIN ` 關鍵字的兩爿。)

咧標準的 SQL 語言內底,外連接無隱式的連接符號。

外部連接既然包含 ON 子句閣包含 WHERE 子句時,應當干焦共表之間的接條件寫佇 ON 子句內底,對表中資料的篩選必須寫佇咧 WHERE 子句內底。若內底連接的各條件表達式既然會當囥佇 ON 子句閣會當囥佇咧 WHERE 子句內底。這是因為對外部連接,保留表當中予人 ON 子句篩除掉的行愛予人添加轉來,毋才會操作了後才會用 WHERE 子句去篩選連接結果中的各行。

倒外連接

倒外連接(left outer join), 亦簡稱為倒連接(left join), 若是 A 和 B 兩表進行左外連接,結果表中將包括 " 左表 "(即表 A)的所有咧記錄,就算講遐的記錄佇咧 " 正表 " B 無符合連接條件的匹配。這意味就算講 ` ON ` 語句在 B 內底的匹配項是零條,連接操作猶是會倒轉去一條記錄,猶毋過這條記錄中來自 B 的每一列的值攏為 NULL。這意味對倒外連接會倒轉去講的所有記錄佮正表中匹配記錄的組合(你若正表內底無匹配的記錄,來自正表的所有列的值設為 NULL)。 若是倒表的一逝佇正表內底存在多个匹配行,遐爾仔左表的行會複製佮正表匹配行仝款的數量,並且進行組合生連接結果。

如,這允准阮揣著雇員的部門的時陣,顯示所有倩員,即使這个雇員猶無關聯的部門。(佇頂懸的內連接部份由一个倒反的例,無關聯的部門號的雇員佇咧結果當中是無顯示的)。

倒外連接實例 : ( 相對內連接加添的行用趨體標出)

正外連接

正外連接,亦簡稱正連接,伊佮倒外連接完全類似,只不過是作連接的表示的順序顛倒反爾。若是 A 表右連接 B 表,遐爾 " 正表 " B 中的每一逝佇連接表中至少會出現一擺。若是 B 表的記錄佇遐 " 左表 " A 揣著匹配行,連接表中來源於著 A 的列的值設為 NULL。

正連接操作倒轉來正表的所有行和遮的行佇倒表的內面匹配的行(無匹配的,來源佇左表的列值設為 NULL)。

比如講,這允准阮咧揣每一个雇員以及伊的部門的資訊時,當這个部門內底無任何雇員的時陣,嘛共部門顯示出來。

正連接的實例 : ( 相對內連接加添的行用趨體標出)

實際上顯式的右連接真少使用,因為伊總是會當替換做左連接--換換表的位置就會使得矣,另外咧,正連接相對左連接並無啥物額外的功能。上表仝款會使使用倒連接會著 :

全連接

全連接是倒爿正外連接的併集。連接表包含講予人接的表的所有記錄,你若欠缺匹配的記錄,即以 NULL 填充。

如,這允准咱檢視每一个佇部門內底的員工佮每一个有倩員的部門,同時,閣會當看著無佇咧任何部門的員工以及無任何員工的部門。

全連接實例 :

一寡資料庫系統(如 MySQL)並無直接共支援全連接,但是𪜶會當通過左右外連接的併集(參 : union)來類比實現。佮頂頭等價的實例 :

SQLite 無支援右連接,全外連接會當按照下跤的方式類比 :

自連接

自連接就是佮家己。下跤的例是一个足好的說明。

範例

構建一个查詢,伊試圖揣著按呢的記錄:逐條記錄包含兩个雇員,𪜶是來自仝一个國家。準講你若兩張倩員表(` Employee `), 遐只要第一張表的雇員佮第二張表的雇員佇咧仝款的國家的就行矣,你會當用一个通常的連接(相連接)操作去得著這个表。猶毋過,遮所有倩員資訊攏佇一張單獨的大表里。

下跤一个修改過的雇員表 ` Employee ` :

範例解決方案的查詢會當寫做如下 :

伊執行了後共生做下跤的表現 :

關於這个例,請注意 :

  • ` F ` 和 ` S ` 是雇員表(employee)的第一个佮第二个副本的別名
  • 條件 ` F . Country=S . Country ` 排除了佇無仝國家的雇員的組合。這个例干焦向望得著仝國家的雇員的組合。
  • 條件 ` F . EmployeeID < S . EmployeeID ` 排除了雇員號(` EmployeeID `)仝款的組合。
  • ` F . EmployeeID < S . EmployeeID ` 排除了重複的組合。無這个條件的話,將生成類似下面表中的無用資料(干焦以 Germany 做例)

干焦當中的兩行滿足上原初問題的要求,頭一項佮上尾一項對本例來講攏無路用。

替代的方式

外連接查詢得著的結果嘛會當通過關聯子查詢得著。 比如講嘛會當寫做如下形體 :

實現

===連接演算法===執行相連紲操作,存在三種基本的演算法。

岫狀迴圈(LOOP JOIN)

岫狀迴圈類似 C 語言編程的時陣的雙重迴箍仔。作為外層迴圈逐行掃描的表示,號做外部輸入表;針對外部輸入表的每一行,愛逐行掃描檢查匹配的另外一張表示,號做內部輸入表(和內層回轉)。 適用佇咧外部輸入表的行數較少,內部輸入表建立了索引的情形。

合併連接(MERGE JOIN)

類似兩个有序陣列的合併。兩个輸入表攏佇咧合併列頂懸排序;然後順序從兩張表現出做連接或者是棄嫌。抑若預先起好矣索引,合併連接的計算複雜度是線性的。

雜鬥連接(HASH JOIN)

真適用佇咧查詢的中間結果,通常是無索引的臨時表;以及中央結果的行數足大時的。雜鬥連接選擇行數較細的輸入表作為生成輸入,著其實連接列值應用雜鬥函式,共其行(的儲存位置)囥入去雜鬥桶內底。

參見

  • Composition of relations

參考文獻

參照

來源

外部連結

  • SQL SERVER-Introduction to JOINs-Basic of JOINs
  • SQL Inner Join with visual explanation
  • Sybase ASE 十五 Joins
  • MySQL 五曉空 Joins
  • Oracle Joins-Quick Reference
  • PostgreSQL Join with Query Explain
  • PostgreSQL 八堵三 Joins
  • Joins in Microsoft SQL Server
  • Joins in MaxDB 七堵六
  • Joins in Oracle 十一 g
  • Various join-algorithm implementations
  • A Visual Explanation of SQL Joins
  • Another visual explanation of SQL joins , along with some set theory
  • SQL join types classified with examples
  • An alternative strategy to using FULL OUTER JOIN