跳到主要内容

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)