175.combine-two-tables

表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
分析
因为表 Address 中的 personId 是表 Person 的外关键字,所以我们可以连接这两个表来获取一个人的地址信息。
考虑到可能不是每个人都有地址信息,我们应该使用 outer join 而不是默认的 inner join。
题解(mysql):
以下这种解法是错误的!
原因是题目要求:无论 person 是否有地址信息,都需要基于上述两表提供 person 的相关信息

select FirstName,LastName,City,State from Person, Address where Address.PersonId = Person.PersonId

下面才是正解:

select FirstName,LastName,City,State from Person left join Address on Address.PersonId = Person.PersonId

左外连接和右外连接

  • 左外连接,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
  • 与左外连接相反,右外连接,左表只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
    那么上题当然也可以用右外连接来求解
select FirstName,LastName,City,State from Address right join Person on Address.PersonId = Person.PersonId

总结:在进行求解时,要看清题目要求,合理进行求解。