提要:在本教程中,您将学习如何使用 PostgreSQL 的 UNION 运算符将多个查询的结果合并到一个结果集里。

PostgreSQL UNION 简介

PostgreSQL 的 UNION 运算符用于将多个查询的结果合并到单个结果集里,我们又把它称为联合查询并集。下面是两张表联合查询的语法:

SELECT
 column_1,
 column_2
FROM
 tbl_name_1
UNION
SELECT
 column_1,
 column_2
FROM
 tbl_name_2;

联合查询的规则是:

  • 字段的个数和顺序必须相同
  • 查询中的相应字段必须具有兼容的数据类型

UNION 会移除所有重复的行,要保留重复的行,需要使用 UNION ALL

UNION 可能将第一个查询的结果集放在第二个查询的结果集之前、之后或之间。可以使用 ORDER BY 对合并后的结果集进行排序。

通过 UNION 可以将一些结构相似,但没进行归类的数据进行合并。比如,在做报表时、在统计库存时。

PostgreSQL UNION 示例

假设有两个表:

  • sales2007q1 表:存储 2007 年第 1 季度的销售数据
  • sales2007q2 表:存储 2007 的第 2 季度的销售数据

sales2007q1 表的数据:

sales2007q1

sales2007q2 表的数据:

sales2007q2

UNION

使用下面的语句,将两张表的数据进行合并:

SELECT *
FROM
 sales2007q1
UNION
SELECT *
FROM
 sales2007q2;

结果如下:

union result

UNION ALL

上面的例子只返回了 5 行,原因在于,UNION 去除了一条重复的记录。如果需要保留这条重复的记录,需要使用 UNION ALL,如下所示:

SELECT *
FROM
 sales2007q1
UNION ALL
SELECT *
FROM
 sales2007q2;

union all result

UNION 和 ORDER BY

在使用 UNIONUNION ALL 时,可以使用 ORDER BY 对合并后的数据进行排序。ORDER BY 子句需要放在最后的那条查询之后,如下所示:

SELECT *
FROM
 sales2007q1
UNION ALL
SELECT *
FROM
 sales2007q2
ORDER BY 
 name ASC,
 amount DESC;

union all with order by

如果你在每个查询里都使用了 ORDER BY,那么合并后的结果集并不会按你预期的那样进行排序。因为当 UNION 操作符组合来自每个查询的排序结果集时,它不能保证最终结果集中的行的顺序。

上一篇:PostgreSQL的HAVING
下一篇:PostgreSQL的交集