联结是一种机制,用来在一条Select语句中关联表,创建连结的方式是:指定要联结的所有表以及关联他们的方式
- 内联结 :即等值连结,它基于两个表之间的相等测试,将一个表中的行与另一个表中的行相关联
- 外联结:外联结包括没有关联的行,外联结使用 OUTER JOIN + RIGHT/LEFT ,若为Left则从左边的表选择所有的行从右边的表选择关联的行,若为right则相反
示例:
- 内联结 Leetcode 181 超过经理收入的员工
- 外联结 Leetcode 175. 组合两个表
内联结使用示例:
Leetcode 181 超过经理收入的员工
Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。
+----+-------+--------+-----------+
| Id | Name | Salary | ManagerId |
+----+-------+--------+-----------+
| 1 | Joe | 70000 | 3 |
| 2 | Henry | 80000 | 4 |
| 3 | Sam | 60000 | NULL |
| 4 | Max | 90000 | NULL |
+----+-------+--------+-----------+
给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。
在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。
+----------+
| Employee |
+----------+
| Joe |
+----------+
解题思路:
1.进行表的自连结
select *
from
employee as e1,
employee as e2;
2.选择表1中经理ID等于表2中ID的行
3.选择2中匹配行中的表一Salary>表2Salary的员工
select e1.Name as Employee
from
employee as e1,
employee as e2
where e1.ManagerId=e2.Id and e1.Salary>e2.Salary
外联结使用示例:
Leetcode 175. 组合两个表
表1: Person
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
+-------------+---------+
PersonId 是上表主键
表2: Address
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
+-------------+---------+
AddressId 是上表主键
编写一个 SQL 查询,满足条件:
无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State
解题思路:
- 需要提供的信息源自于两个表,且无论person是否有地址信息都需要提供其基本的姓名信息,因此采用外连接
- 因为左外联结更具有普适性,因此这里使用左外连接,并将Person表放在左边(因为需要包含所有的Person信息)
select FirstName, LastName, City, State
From Person left join Address on Person.PersonId=Address.PersonId