菜鸟晋级之力扣SQL爆刷简单题-175题组合两个表
文章目录
175. 组合两个表
1.题目描述
编写解决方案,报告 Person 表中每个人的姓、名、城市和州。如果 personId 的地址不在 Address 表中,则报告为 null。
正确代码:
select firstName, lastName, city, state
from Person left join Addressc
on Person.PersonId = Address.PersonId
;
2.解题思路
方法:使用 join...on
-
因为表 Address 中的 personId 是表 Person 的外关键字,所以我们可以连接这两个表来获取一个人的地址信息。
-
考虑到可能不是每个人都有地址信息,我们应该使用 outer join 而不是默认的 inner join。
-
如果没有某个人的地址信息,使用 where 子句过滤记录将失败,因为它不会显示姓名信息。
3.知识记录
错误代码:
select firstName, lastName, city, state
from Person **join** Address
**where** Person.PersonId = Address.PersonId
;
3.1. left join使用(各类join区别)
1.join(Nested Loop Join-嵌套循环连接)
- 通过 驱动表的结果集 作为循环基础数据,然后一条一条的通过 该结果集 中的数据作为过滤条件到下一个表中查询数据,然后合并结果。
- 如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据
- 所以驱动表的选择非常重要,驱动表的数据小可以显著降低扫描的行数。(驱动表就是主表,left join中的左表就是驱动表,right join中的右表是驱动表)
2.inner join和outer join 区别
注:outer join分为left和right(left joinleft outer join ;right joinright outer join)
- inner join on:内联操作,将符合ON条件的A表和B表结果均搜索出来,然后合并为一个结果集
- left join on(合并去左边):左联操作,将符合ON条件的B表结果搜索出来,然后左联到A表上,然后将合并后的A表输出
- right join on(合并去右边):右联操作,将符合ON条件的A表结果搜索出来,然后右联到B表上,然后将合并后的B表输出
where 和 on 区别
-
on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回表中的记录(有null的数据也会返回)
-
where条件是在临时表生成好后,再对临时表进行过滤的条件(where后的条件对临时表中的记录进行过滤)
做left join操作的时候,先笛卡尔积处理,无论是否有空,都是表之间的连接
如果是on,直接输出;如果是where,在这个基础上再对null进行过滤,但是这样其实就没有left join的意义了。
所以,一般用outer join的时候,就用on
如果对您有帮助的话,可以加我的公众号~
https://mp.weixin.qq.com/s/B1tkQoUW2QNwZBeBe7-WRQ
网络安全学习记录日记