深入解析:Leetcode_175.组合两个表
分析:
通过查看输出,最后需要得出firstName lastName city state 这四个字段
观察到,Person表和Address表通过personId关联,所以这就是我们联查的条件
得出:
内连接写法:
select firstName ,lastName , city , state from Person as p, Address as a where p.personId = a.personId;
-- 显式内连接(更推荐,连接条件与筛选条件分离,可读性更高)
select p.firstName, p.lastName, a.city, a.state
from Person as p
inner join Address as a
on p.personId = a.personId;
但是这样就对了吗?
NONONO
我们没有照顾到 city 为 null 的人,每个人都必须照顾到,也就是所选表中的字段必须全部照顾到,查看Person表,我们需要照顾Person表中的每一个人,也就是每个人都必须要查询到,此时,就使用到了左链接
LEFT JOIN:返回左表的所有记录,以及右表中能匹配上的记录。如果右表没有匹配项,结果集中右表的字段则为 NULL。
INNER JOIN:只返回两个表中都能匹配上的记录。
RIGHT JOIN:返回右表的所有记录,以及左表中能匹配上的记录。如果左表没有匹配项,结果集中左表的字段则为 NULL。
左链接写法:
select firstName ,lastName , city , state from Person as p left join Address as a on p.personId=a.personId;
性能优化:大多数数据库对左连接的优化更好
右链接写法:
select firstName ,lastName , city , state from Address as a right join Person as p on p.personId=a.personId;