示例
左外部联接(也称为左联接或外部联接)是一种联接,可确保表示左表中的所有行;如果右表中没有匹配的行,则其对应字段为NULL。
以下示例将选择所有部门以及在该部门工作的员工的名字。没有员工的部门仍会返回结果,但员工名称将为NULL:
SELECT Departments.Name, Employees.FName
FROM Departments
LEFT OUTER JOIN Employees
ON Departments.Id= Employees.DepartmentId
这将从示例数据库返回以下内容:
部门名称员工名人力资源詹姆士
人力资源约翰
人力资源约翰松
营业额麦可
科技类空值
那么这是如何工作的呢?
FROM子句中有两个表:
ID姓名名称号码ManagerId部门编号薪水雇用日期1詹姆士史密斯1234567890空值110002002年1月1日
2约翰约翰逊2468101214114002005年3月23日
3麦可威廉姆斯1357911131126002009年12月5日
4约翰松史密斯1212121212215002016年7月24日
和
ID名称1人力资源
2营业额
3科技类
首先,从给出中间表的两个表中创建笛卡尔乘积。
符合联接条件(Departments.Id=Employees.DepartmentId)的记录以粗体突出显示;这些将传递到查询的下一个阶段。
因为这是LEFTOUTERJOIN,所以所有记录都是从联接(部门)的LEFT一侧返回的,而如果RIGHT一侧的任何记录不符合联接条件,则它们都将被赋予NULL标记。在低于此表将返回技术与NULL
ID名称ID姓名名称号码ManagerId部门编号薪水雇用日期1人力资源1詹姆士史密斯1234567890空值110002002年1月1日
1人力资源2约翰约翰逊2468101214114002005年3月23日
1人力资源3麦可威廉姆斯1357911131126002009年12月5日
1人力资源4约翰松史密斯1212121212215002016年7月24日
2营业额1詹姆士史密斯1234567890空值110002002年1月1日
2营业额2约翰约翰逊2468101214114002005年3月23日
2营业额3麦可威廉姆斯1357911131126002009年12月5日
2营业额4约翰松史密斯1212121212215002016年7月24日
3科技类1詹姆士史密斯1234567890空值110002002年1月1日
3科技类2约翰约翰逊2468101214114002005年3月23日
3科技类3麦可威廉姆斯1357911131126002009年12月5日
3科技类4约翰松史密斯1212121212215002016年7月24日
最后,对SELECT子句中使用的每个表达式进行求值,以返回最终表:
部门名称员工名人力资源詹姆士
人力资源约翰
营业额理查德
科技类空值