数据库每日一题---第10天:组合两个表

250 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

一、问题描述

: 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.表连接
2.建议用时10~25min

三、问题分析

这一题就是一道考察连接基础的问题,我把SQL里面常见的几种语言列举一下:

  • A inner join B:内连接,取交集

  • A left join B:左外连接,取A全部,B没有对应的值,则为null

  • A right join B:右外连接,取B全部,A没有对应的值,则为null

  • A full outer join B:全外连接,取并集,彼此没有对应的值为null

这一题,我们看一下题目的要求:两个表 PersonAddress,如果右侧的地址号未出现在左侧表中,直接置为null。

那么选择哪一种连接方式,就显而易见了。简单的选择一下左外连接,一下子问题就会迎刃而解

四、编码实现

select p.firstName,p.lastName,a.city,a.state
from Person p
left join Address a on p.personId=a.personId

五、测试结果

1.png

19.png