SQL 左外连接

示例

左外部联接(也称为左联接或外部联接)是一种联接,可确保表示左表中的所有行;如果右表中没有匹配的行,则其对应字段为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)的记录以粗体突出显示;这些将传递到查询的下一个阶段。

因为这是LEFT OUTER JOIN,所以所有记录都是从联接(部门)的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子句中使用的每个表达式进行求值,以返回最终表:

部门名称员工名
人力资源詹姆士
人力资源约翰
营业额理查德
科技类空值