全书目录

第八篇:PostgreSQL 完全指南 —— 时间档案馆宇宙

第九章:连接 —— 不是把表“拼起来”,而是按关系找档案

1 分钟 221 字 第 173 / 962 个阅读单元

连接(Join)本质上是:

根据键,把不同档案柜里的记录对上号。

先看关系图:

text
districts 1 --- n citizens 1 --- n permits 1 --- n permit_events

查某个区的市民及其有效通行证:

sql
SELECT
  c.citizen_id,
  c.full_name,
  d.name AS district_name,
  p.permit_id,
  p.permit_type,
  p.status
FROM citizens c
JOIN districts d
  ON d.district_id = c.district_id
LEFT JOIN permits p
  ON p.citizen_id = c.citizen_id
 AND p.status = 'active'
WHERE c.status = 'active';

这里:

  • JOIN / INNER JOIN:两边都能对上的才保留
  • LEFT JOIN:左边全保留,右边对不上就补 NULL

可以把它理解成:

text
先拿市民档案
再去行政区档案柜查所属区
再去通行证档案柜查有没有有效证
查不到证,也保留这个市民

一个常见错误是把过滤条件放错地方。

比如 LEFT JOIN 时,如果把右表条件误写到 WHERE,很容易把“没匹配到右表”的左侧行也过滤掉,结果看起来像突然变成了 INNER JOIN