JOIN中的外连接(external join)
外连接:
---外连接并不要求连接的两表的每一条记录在对方表中都有一条匹配记录.要保留所有记录(甚至这条记录没有匹配的记录也要保留)的表成为保留表.外连接可以一句连接表保 留左表,右表和全部表的行二进一步分为左外连接、右外连接、全连接.
(在这种情况下left<左>和right<右>表示Join关键字的两边.)
在标准的SQL语言中,外连接没有隐式的连接符号.
外部连接即包含ON子句
又包含WHERE子句
时,应当只把表之间的连接条件写在ON子句中,对表中数据的筛选必须写在WHERE子句中.
而内部连接的各条件表达式既可以放在ON子句又可以放在WHERE子句中.
这是因为对外部连接,保留表中被ON子句筛除掉的行要被添加回来,在此操作之后才会用WHERE子句取筛选连接结果中的各行.
左外连接
做外连接(left outer join),简称为左连接(left join) RRREWEQW QEQWQw QWe qWEqwEQWEQWEqweQ jjjkkk

- 左外连接会返回左表的所有记录和右表中匹配记录的组合;
- 如果右表中无匹配记录,来自于右表的所有列的值设置NULL;
- 如果左表的一行在右表中存在多个匹配行,那么左表的行会复制和右表匹配行一样的数量,并进行组合生成连接结果.
eg:
SELECT *
FROM employee
LEFT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID;
右外连接

SELECT *
FROM employee
RIGHT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID
显示的右连接很少使用,一般替换成左连接(换换表的位置就可以了),功能相同
SELECT *
FROM department
LEFT OUTER JOIN employee
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
自连接
自连接就是和自身连接
eg:构建一个查询,它试图找到这样的记录:每条记录包含两个雇员,他们来自同一个国家.如果你有两张雇员表(Employee),那么只要第一张表的雇员和第二张表的雇员在同样的国家就行了.你可以用一个铜像的连接(相等连接)操作去得到这个表.不过,这里所有雇员信息都在一张单独的达标例.
employeeID | LastName | City | DepartmentID |
---|---|---|---|
111 | 小紫 | 上海 | 31 |
222 | 小白 | 上海 | 33 |
333 | 小蓝 | 上海 | 33 |
444 | 小黑 | 广州 | 34 |
555 | 小灰 | 北京 | 34 |
666 | 小红 | 北京 | NULL |
查询所用SQL:
SELECT F.EmployeeID, F.LastName, S.EmployeeID, S.LastName, F.Country
FROM Employee F, Employee S
WHERE F.City = S.City
AND F.EmployeeID < S.EmployeeID
ORDER BY F.EmployeeID, S.EmployeeID;
通过City自连接后的雇员表(Employee)
EmployeeID | LastName | EmployeeID | LastName | City |
---|---|---|---|---|
111 | 小紫 | 222 | 小白 | 上海 |
111 | 小紫 | 333 | 小蓝 | 上海 |
222 | 小白 | 333 | 小蓝 | 上海 |
555 | 小灰 | 666 | 小红 | 北京 |
Notes:
F
和S
是雇员表的第一个和第二个拷贝的别名条件
F.City = S.City
排除了在不同城市
的雇员的组合.本实例仅仅期望得到在相同国家的雇员的组合.条件
F.EmployeeID < S.EmployeeID
排除了雇员号(EmployeeID)相同的组合
.F.EmployeeID < S.EmployeeID
排除了重复的组合
.没有这个条件,会生成类似下表的无用数据(以北京为例)EmployeeID LastName EmployeeID LastName City 555 小灰 555 小灰 北京 555 小灰 666 小红 北京 666 小红 555 小灰 北京 666 小红 666 小红 北京 只有中间两行满足初始问题的要求(重复的组合),第一行和最后一项对本例无用,但是在
相同的组合
的例子中有用
替代方式
外连接查询得到的结果也可以通过关联子查询得到.
eg:
SELECT employee.LastName, employee.DepartmentID,
department.DepartmentName
FROM employee LEFT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID
or:
SELECT employee.LastName, employee.DepartmentID,
(SELECT department.DepartmentName
FROM department
WHERE employee.DepartmentID = department.DepartmentID )
FROM employee