內鏈接和外鏈接

內鏈接 php

內鏈接分爲: 相等鏈接,天然鏈接,和交叉鏈接 算法

顯式的內鏈接實例: 數據庫

SELECT * FROM employee INNER JOIN department ON employee.DepartmentID = department.DepartmentID

等價於: dom

SELECT * FROM employee,department WHERE employee.DepartmentID = department.DepartmentID

相等連接

SELECT * FROM employee INNER JOIN department ON employee.DepartmentID = department.DepartmentID
SELECT * FROM employee INNER JOIN department USING (DepartmentID)
天然鏈接

兩表作天然鏈接時,兩表中的全部名稱相同的列都將被比較,這是隱式的。天然鏈接獲得的結果表中,兩表中名稱相同的列只出現一次.
spa

SELECT * FROM employee NATURAL JOIN department
在  Oracle  裏用  JOIN USING  或  NATURAL JOIN  時,若是兩表共有的列的名稱前加上某表名做爲前綴,則會報編譯錯誤: "ORA-25154: column part of USING clause cannot have qualifier" 或 "ORA-25155: column used in NATURAL join cannot have qualifier".

交叉鏈接

交叉鏈接(cross join),又稱笛卡爾鏈接(cartesian join)或叉乘(Product),它是全部類型的內鏈接的基礎。把表視爲行記錄的集合,交叉鏈接即返回這兩個集合的笛卡爾積。這其實等價於內鏈接的連接條件爲"永真",或鏈接條件不存在.
code

顯式的交叉鏈接實例: orm

SELECT * FROM employee CROSS JOIN department

隱式的交叉鏈接實例: ip

SELECT * FROM employee ,department;



外鏈接

外鏈接並不要求鏈接的兩表的每一條記錄在對方表中都一條匹配的記錄. 鏈接表保留全部記錄 -- 甚至這條記錄沒有匹配的記錄也要保留. 外鏈接可依據鏈接表保留左表, 右表或所有表的行而進一步分爲左外鏈接, 右外鏈接和全鏈接. get

左外鏈接

左外鏈接 會返回左表的全部記錄和右表中匹配記錄的組合(若是右表中無匹配記錄, 來自於右表的全部列的值設爲 NULL).

若是左表的一行在右表中存在多個匹配行, 那麼左表的行會複製和右表匹配行同樣的數量, 並進行組合生成鏈接結果. it

SELECT * FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID

        這容許咱們去找到僱員的部門時, 顯示全部僱員, 即便這個僱員尚未關聯的部門.(在上面的內鏈接部分由一個相反的例子, 沒有關聯的部門號的僱員在結果中是不顯示的).


右外鏈接

右鏈接操做返回右表的全部行和這些行在左表中匹配的行(沒有匹配的, 來源於左表的列值設爲 NULL).

SELECT * FROM employee RIGHT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID
這容許咱們在找每個僱員以及他的部門信息時, 當這個部門裏沒有任何僱員時, 也把部分顯示出來.

實際上顯式的右鏈接不多使用, 由於它老是能夠被替換成左鏈接--換換表的位置就能夠了。


全鏈接

全鏈接是左右外鏈接的並集. 鏈接表包含被鏈接的表的全部記錄, 若是缺乏匹配的記錄, 即以 NULL 填充.

SELECT * FROM employee FULL OUTER JOIN department ON employee.DepartmentID = department.DepartmentID
這容許咱們查看每個在部門裏的員工和每個擁有僱員的部門, 同時, 還能看到不在任何部門的員工以及沒有任何員工的部門.

一些數據庫系統(如 MySQL)並不直接支持全鏈接, 但它們能夠經過左右外鏈接的並集(參: union)來模擬實現. 和上面等價的實例:

SELECT * FROM employee LEFT JOIN department ON employee.DepartmentID = department.DepartmentID UNION SELECT * FROM employee RIGHT JOIN department ON employee.DepartmentID = department.DepartmentID WHERE employee.DepartmentID IS NULL
SELECT * FROM employee LEFT JOIN department ON employee.DepartmentID = department.DepartmentID UNION SELECT * FROM employee RIGHT JOIN department ON employee.DepartmentID = department.DepartmentID WHERE employee.DepartmentID IS NULL

SQLite 不支持右鏈接, 全外鏈接能夠按照下面的方式模擬:

SELECT employee.*, department.* FROM employee LEFT JOIN department ON employee.DepartmentID = department.DepartmentID UNION SELECT employee.*, department.* FROM department LEFT JOIN employee ON employee.DepartmentID = department.DepartmentID WHERE employee.DepartmentID IS NULL

自鏈接

自鏈接就是和自身鏈接

試圖找到這樣的記錄: 每條記錄包含兩個僱員, 他們來自於同一個國家. 

SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.Country FROM Employee F, Employee S WHERE F.Country = S.Country AND F.EmployeeID < S.EmployeeID ORDER BY F.EmployeeID, S.EmployeeID;
  • F 和 S 是僱員表(employee)的第一個和第二個拷貝的別名
  • 條件 F.Country = S.Country 排除了在不一樣國家的僱員的組合. 這個例子僅僅指望獲得在相同國家的僱員的組合.
  • 條件 F.EmployeeID < S.EmployeeID 排除了僱員號(EmployeeID)相同的組合.
  • F.EmployeeID < S.EmployeeID 排除了重複的組合. 沒有這個條件的話, 將生成相似下面表中的無用數據(僅以 United Kingdom 爲例)

替代方式

外鏈接查詢獲得的結果也能夠經過關聯子查詢獲得. 例如

SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID

也能夠寫成以下樣子:

SELECT employee.LastName, employee.DepartmentID, (SELECT department.DepartmentName FROM department WHERE employee.DepartmentID = department.DepartmentID ) FROM employee


鏈接算法

執行一個鏈接操做, 存在三種基本的算法.嵌套循環、合併鏈接、哈希鏈接

原文連接:http://zh.wikipedia.org/wiki/%E8%BF%9E%E6%8E%A5_(SQL)#.E8.87.AA.E7.84.B6.E8.BF.9E.E6.8E.A5

相關文章
相關標籤/搜索