PostgreSQL 集合运算教程
集合运算把多个查询的结 果纵向合并:UNION 取并集、INTERSECT 取交集、EXCEPT 取差集。它们的列数与类型必须兼容。
本篇内容
- UNION 与 UNION ALL 的区别
- INTERSECT:交集
- EXCEPT:差集
- 集合运算的执行顺序与整体 ORDER BY
UNION 与 UNION ALL
-- UNION:合并并去重(有去重开销)
SELECT email FROM users
UNION
SELECT email FROM archived_users;
-- UNION ALL:合并不去重(更快,保留重复行)
SELECT email FROM users
UNION ALL
SELECT email FROM archived_users;
INTERSECT 与 EXCEPT
-- INTERSECT:两张表都出现的邮箱
SELECT email FROM users
INTERSECT
SELECT email FROM archived_users;
-- EXCEPT:在 users 中但不在 archived_users 中的邮箱
SELECT email FROM users
EXCEPT
SELECT email FROM archived_users;
整体排序与分页
集合运算的 ORDER BY / LIMIT 作用于最终合并结果,写在最后一条 SELECT 之后:
SELECT id, name FROM users
UNION ALL
SELECT id, name FROM archived_users
ORDER BY id
LIMIT 20;
待补充(TODO)
- 补充:列数不等、类型不一致时的报错与隐式转换规则
- 补充:多个集合运算连用时的优先级(INTERSECT 高于 UNION / EXCEPT)与括号写法
- 补充:与 JOIN 的选型(纵向合并用集合运算,横向组合用 JOIN)