题目
表:Person
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| PersonId | int |
| FirstName | varchar |
| LastName | varchar |
+-------------+---------+
personId 是该表的主键列。
该表包含一些人的 ID 和他们的姓和名的信息。
表:Address
+-------------+---------+
| 列名 | 类型 |
+-------------+---------+
| AddressId | int |
| PersonId | int |
| City | varchar |
| State | varchar |
+-------------+---------+
addressId 是该表的主键列。
该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。
编写一个SQL查询来报告Person表中每个人的姓,名,城市和州.如果personId的地址不在Address表中,则报告为空null,以任意顺序返回结果表.
查询结果格式如下所示:
输入:
Person表:
+----------+----------+-----------+
| personId | lastName | firstName |
+----------+----------+-----------+
| 1 | Wang | Allen |
| 2 | Alice | Bob |
+----------+----------+-----------+
Address表:
+-----------+----------+---------------+------------+
| addressId | personId | city | state |
+-----------+----------+---------------+------------+
| 1 | 2 | New York City | New York |
| 2 | 3 | Leetcode | California |
+-----------+----------+---------------+------------+
输出:
+-----------+----------+---------------+----------+
| firstName | lastName | city | state |
+-----------+----------+---------------+----------+
| Allen | Wang | Null | Null |
| Bob | Alice | New York City | New York |
+-----------+----------+---------------+----------+
解释:
地址表中没有 personId = 1 的地址,所以它们的城市和州返回 null。
addressId = 1 包含了 personId = 2 的地址信息。
解答思路:
1.先以personid连接表;
2.因为要求没有地址返回空,并不是所有的都有地址,但是所有的姓名都有,所以左连接,地址没有默认为空.
3.查看要打印的内容是什么,让他们的列保持一致即可.
考察点:
LEFT JOIN: 保留左表内容,右表不存在的列使用 Null 代替
参考答案:
select
firstName,
lastName,
City as `city`,
State as `state`
from Person
left join Address
on Person.PersonId = Address.PersonId;