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