跳到主要内容

PostgreSQL JOIN 多表连接教程

JOIN 把多张表按关联条件组合起来,是关系型数据库的核心能力。本篇覆盖各种 JOIN 类型的行为差异与选型。

本篇内容​

  • INNER JOIN:只保留匹配的行
  • LEFT / RIGHT / FULL OUTER JOIN:保留不匹配的一侧
  • CROSS JOIN:笛卡尔积
  • SELF JOIN:自连接
  • ON 与 USING 的差别、表别名

INNER JOIN​

-- 用户与他们的订单(没有订单的用户不出现)
SELECT u.id, u.name, o.order_id, o.amount
FROM users u
INNER JOIN orders o ON o.user_id = u.id;

LEFT JOIN​

-- 所有用户 + 订单(没有订单的用户订单字段为 NULL)
SELECT u.id, u.name, o.order_id, o.amount
FROM users u
LEFT JOIN orders o ON o.user_id = u.id;

-- 经典用法:找出「没有订单的用户」
SELECT u.id, u.name
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE o.order_id IS NULL;

其他 JOIN 类型​

-- FULL OUTER JOIN:两侧不匹配的行都保留
SELECT u.id, o.order_id FROM users u
FULL OUTER JOIN orders o ON o.user_id = u.id;

-- CROSS JOIN:笛卡尔积(每行 × 每行)
SELECT u.name, p.name FROM users u CROSS JOIN products p;

-- SELF JOIN:同一张表连接自身(员工与上级)
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;
待补充(TODO)
  • 补充:LEFT JOIN 的 WHERE 与 ON 放置条件的区别(右表过滤写在 ON 才不会丢失左表行)
  • 补充:USING (col) 与 NATURAL JOIN 的写法与风险
  • 补充:多表 JOIN 的连接顺序与执行计划(嵌套循环 / 哈希连接 / 合并连接)
  • 补充:半连接与反连接的替代写法(EXISTS vs IN vs JOIN)