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
总结:在进行求解时,要看清题目要求,合理进行求解。