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)