订阅更新

两表关联取人员信息:没有地址的人也不能丢

SQL 实战 123 题 · 第 1 题 简单 约 2 分钟读完

LeetCode 175 · LEFT JOIN、保留主表

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

这道题考的是保留主表的关联方式。人员是主体、地址是可选信息,所以用 Person LEFT JOIN Address ON PersonId,左表全部保留,没有地址的人城市和州返回 NULL。如果后面还要筛选地址条件,我会把条件放在 ON 里,避免 WHERE 把补出来的空行过滤掉。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

题意

人员表和地址表通过人员 ID 关联。要求列出每个人的名、姓、城市和州;有的人没有登记地址,这些人也必须出现在结果里,地址字段为空即可。

表结构

  • Person:PersonId(主键)、FirstName、LastName
  • Address:AddressId(主键)、PersonId、City、State

思路

关键词是「无论有没有地址都要返回」,也就是以人员表为主表、地址表只是补充信息,这正是 LEFT JOIN 的语义:左表每一行都保留,右表匹配不上的列填 NULL。用 INNER JOIN 会把没有地址的人直接过滤掉。

参考解法

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

易错点

  • 用了 INNER JOIN 或者逗号连接 + WHERE,会丢掉没有地址的人。
  • 如果要对地址加过滤条件(比如只要某个州),条件要写在 ON 里;写在 WHERE 里会把 LEFT JOIN 变回 INNER JOIN 的效果。
刷题进度保存在当前浏览器