內鏈接 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
若是左表的一行在右表中存在多個匹配行, 那麼左表的行會複製和右表匹配行同樣的數量, 並進行組合生成鏈接結果. 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;
外鏈接查詢獲得的結果也能夠經過關聯子查詢獲得. 例如
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