内链接和外链接

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

相关文章
相关标签/搜索