Leetcode - Mysql 组合两个表

问题描述:

表1: Person (PersonId 是表主键)

Leetcode - Mysql 组合两个表_第1张图片

表2:Address (AddressId 是上表主键)

Leetcode - Mysql 组合两个表_第2张图片

编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:

FirstName, LastName, City, State

问题分析:

  • 使用 连接查询,连接查询分为内链接和外连接
  • 内连接( join )会舍弃2个表不匹配的数据
  • 外连接( left join | right join )除了显示符合条件的记录外,还显示表中的记录

概念比较含糊,那就实际操作一下,体会下两者的区别:

题目要求:无论 person 是否有地址信息,都需要基于上述两表提供
首先根据要求,造出一个有Person信息,但无地点信息的2个表
  • 先在表Person表中添加第4个数据,但不添加对应 Address表 数据:
    Leetcode - Mysql 组合两个表_第3张图片
若使用内链接( join ),完成上述题目:
select P.FirstName,P.Lastname,A.City,A.State from Person P join Address A on P.PersonId = A.PersonId;

结果:如下图,与要求不符,没有显示出 第4个人的数据
Leetcode - Mysql 组合两个表_第4张图片

若使用外链接( left join | right join ),完成上述题目:
  • left join: 左外连接(左连接), 以左表为主表
  • right join: 右外连接(右连接), 以右表为主表

在此,将Person作为主表 用 left join,完成上述题目:

select P.FirstName,P.Lastname,A.City,A.State from Person P left join Address A on P.PersonId = A.PersonId;

结果:正确,如下图,显示出第4个人的信息
Leetcode - Mysql 组合两个表_第5张图片

总结:

在做此题目时,要选择使用外连接,即:

select P.FirstName,P.Lastname,A.City,A.State from Person P left join Address A on P.PersonId = A.PersonId;

你可能感兴趣的:(MySQL)