内链接 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