数据库练习——leetcode(175):组合两张表 外连接
一、题目
二、解析
本题主要考察多表连接。
按题意要求,使用outer join时可以保证指定表的每条记录都出现----即使没有匹配, outer join又可以分为left join, right join, full join。
我们想让Address表中即使没有Person,也让Person有Address属性,所以连接后Person表要完整显示出来,address没有的显示为None.
- 那么我们可以用 Person表 left join Address,或者反过来用right join。
select A.FirstName, A.LastName, B.City, B.State from Person A
left join Address B on A.PersonId = B.PersonId;
- 大神做法:
select A.FirstName, A.LastName, B.City, B.State from Person A
left join (select distinct PersonId, City, State from Address) B
on A.PersonId = B.PersonId;
通过先对Address表去除重复的项,减少连接次数,提高效率,降低时间
三、内连接与外连接
- 内连接
inner join
:查询的结果是两个表匹配到的数据 - 右连接
right join
:查询的结果是两个表匹配的数据,右表特有的数据,对于左表中不存在的数据使用null填充 - 左连接
left join
:查询的结果是两个表匹配的数据,左表特有的数据,对于右表中不存在的数据使用null填充
举例:
-- student表
select * from students;
-- class表
select * from classes;
- 内连接
select * from students as s inner join classes as c on s.cls_id=c.id;
- 右连接
select * from students as s right join classes as c on c.id=s.cls_id;
- 左连接
select * from students as s left join classes as c on c.id=s.cls_id;