LC175 组合两个表
一.任务描述:
表: Person
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | +-------------+---------+ personId 是该表的主键(具有唯一值的列)。 该表包含一些人的 ID 和他们的姓和名的信息。
表: Address
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | AddressId | int | | PersonId | int | | City | varchar | | State | varchar | +-------------+---------+ addressId 是该表的主键(具有唯一值的列)。 该表的每一行都包含一个 ID = PersonId 的人的城市和州的信息。
编写解决方案,报告 Person
表中每个人的姓、名、城市和州。如果 personId
的地址不在 Address
表中,则报告为 null
。
以 任意顺序 返回结果表。
结果格式如下所示。
示例 1:
输入: 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 的地址信息。
二.解题思路:
问题分析:这是一个数据关联查询问题,需要将人员基本信息表与地址信息表进行关联
关键点识别:
不是所有人员都有地址记录,需要使用外连接
需要保留Person表中的所有记录
当Address表中无匹配记录时,相关字段应返回null
技术选择:使用LEFT JOIN实现左外连接,确保Person表的所有记录都被保留
三.代码实现:
MySQL
# Write your MySQL query statement below
SELECT p.firstName,p.lastName,a.city,a.state
FROM Person p
LEFT JOIN Address a ON p.personId = a.personId;
四.优化方向:
索引优化:
为Person表的personId字段创建主键索引(已存在)
为Address表的personId字段创建索引,加快连接查询速度
CREATE INDEX idx_personId ON Address(personId);
五.总结:
1.核心技巧:
LEFT JOIN的使用:确保主表(Person)的所有记录都被返回,即使关联表(Address)中没有匹配记录
NULL值处理:当连接条件不满足时,关联表的字段自动返回NULL
表别名使用:简化SQL语句,提高可读性
2.扩展思考:如果需要统计没有地址信息的人员数量,可以添加WHERE条件:
SELECT COUNT(*)
FROM Person p
LEFT JOIN Address a ON p.personId = a.personId
WHERE a.personId IS NULL;