左外连接
左外连接(也称为左连接或外连接)是一个连接,可确保左表中的所有行都被表示; 如果右表中没有匹配的行,则其对应的字段为 NULL
。
以下示例将选择所有部门以及在该部门中工作的员工的名字。没有员工的部门仍会在结果中返回,但员工姓名将为 NULL:
SELECT Departments.Name, Employees.FName
FROM Departments
LEFT OUTER JOIN Employees
ON Departments.Id = Employees.DepartmentId
这将从示例数据库返回以下内容 :
Departments.Name | Employees.FName |
---|---|
HR |
詹姆士 |
HR |
约翰 |
HR |
乔纳森 |
销售 | 迈克尔 |
技术 | 空值 |
那怎么办?
FROM 子句中有两个表:
ID |
FName 参数 | LName | 电话号码 | 经理 ID | DepartmentID | 薪水 | 聘用日期 |
---|---|---|---|---|---|---|---|
1 |
詹姆士 | 工匠 | 1234567890 | 空值 | 1 | 1000 | 2002 年 1 月 1 日 |
2 |
约翰 | 约翰逊 | 2468101214 | 1 | 1 | 400 | 23-03-2005 |
3 |
迈克尔 | 威廉姆斯 | 1357911131 | 1 | 2 | 600 | 12-05-2009 |
4 |
乔纳森 | 工匠 | 1212121212 | 2 | 1 | 500 | 24-07-2016 |
和
ID |
名称 |
---|---|
1 |
HR |
2 |
销售 |
3 |
技术 |
首先,从两个表中创建一个笛卡尔积,给出一个中间表。
符合连接条件的记录( Departments.Id = Employees.DepartmentId )以粗体突出显示; 这些被传递到查询的下一个阶段。
由于这是 LEFT OUTER JOIN,所有记录都从连接的 LEFT 侧返回(Departments),而如果 RIGHT 侧的任何记录与连接标准不匹配,则会给出 NULL 标记。在下表中,这将返回带有 NULL
的 Tech
ID |
名称 | ID | FName 参数 | LName | 电话号码 | 经理 ID | DepartmentID | 薪水 | 聘用日期 |
---|---|---|---|---|---|---|---|---|---|
1 | HR | 1 | 詹姆士 | 工匠 | 1234567890 | 空值 | 1 | 1000 | 2002 年 1 月 1 日 |
1 | HR | 2 | 约翰 | 约翰逊 | 2468101214 | 1 | 1 | 400 | 23-03-2005 |
1 |
HR | 3 | 迈克尔 | 威廉姆斯 | 1357911131 | 1 | 2 | 600 | 12-05-2009 |
1 | HR | 4 | 乔纳森 | 工匠 | 1212121212 | 2 | 1 | 500 | 24-07-2016 |
2 |
销售 | 1 | 詹姆士 | 工匠 | 1234567890 | 空值 | 1 | 1000 | 2002 年 1 月 1 日 |
2 |
销售 | 2 | 约翰 | 约翰逊 | 2468101214 | 1 | 1 | 400 | 23-03-2005 |
2 | 销售 | 3 | 迈克尔 | 威廉姆斯 | 1357911131 | 1 | 2 | 600 | 12-05-2009 |
2 |
销售 | 4 | 乔纳森 | 工匠 | 1212121212 | 2 | 1 | 500 | 24-07-2016 |
3 |
技术 | 1 | 詹姆士 | 工匠 | 1234567890 | 空值 | 1 | 1000 | 2002 年 1 月 1 日 |
3 |
技术 | 2 | 约翰 | 约翰逊 | 2468101214 | 1 | 1 | 400 | 23-03-2005 |
3 |
技术 | 3 | 迈克尔 | 威廉姆斯 | 1357911131 | 1 | 2 | 600 | 12-05-2009 |
3 |
技术 | 4 | 乔纳森 | 工匠 | 1212121212 | 2 | 1 | 500 | 24-07-2016 |
最后,评估 SELECT 子句中使用的每个表达式以返回我们的最终表:
Departments.Name | Employees.FName |
---|---|
HR |
詹姆士 |
HR |
约翰 |
销售 | 理查德 |
技术 | 空值 |