PostgreSQL中UNION和UNION ALL

作者:瀚高PG实验室 (Highgo PG Lab)- Kalath

在SQL中,UNION和UNION ALL运算符可以用来帮助我们获取多个表,并将结果放入一个表中,其中包含所有匹配的列。如果希望结果作为单个记录集返回,则使用此运算符会非常有帮助。

何时应该使用Union?

当多个表具有相同的结构但由于某种原因(通常出于性能考虑或存档目的)而被拆分时,通常需要使用UNION运算符。

而且,有以下几个注意事项:

1.所有单个查询必须具有相同数量的列和兼容的数据类型。

2.不匹配的查询将无法执行。

3.在构建查询时验证一致性。

4.默认情况下,UNION仅返回不同的值。

举个例子:

有两张表,内容分别是学生和教授的相关信息。如下所示:

postgres=# select * from students;
 id | name  |       major       
----+-------+-------------------
  1 | Wang  | Computer Science
  2 | Tang  | Civil Engineering
  3 | Zhang | English
(3 rows)

postgres=# select * from professors;
 id | name  |  major   
----+-------+----------
  1 | Zheng | Japanese
  2 | Hao   | Music
(2 rows)

要将这两个表合并在一起,需要运行此查询:

postgres=# select * from students union select * from professors;
 id | name  |       major       
----+-------+-------------------
  1 | Zheng | Japanese
  3 | Zhang | English
  1 | Wang  | Computer Science
  2 | Tang  | Civil Engineering
  2 | Hao   | Music
(5 rows)

注意:一旦此查询运行,数据将不会以任何特定顺序显示。当然,可以使用ORDER BY来确保数据正确排序。

何时应该使用UNION ALL?

前面提到,UNION运算符默认只返回不同的值。 如果希望结果包含所有值,即包括重复值,那么可以使用UNION ALL。

但是,UNION ALL也不保证生成的行将按任何特定顺序排列。因此,就像使用UNION一样,可以使用ORDER BY进行排序。

举个例子,有如下两张表::

postgres=# select * from club;
   name   | country 
----------+---------
 Bayern   | Germany
 Dortmund | Germany
 Bremen   | Germany
(3 rows)

postgres=# select * from champion;
   name    | country 
-----------+---------
 Chelsea   | England
 Barcelona | Spain
 Bayern    | Germany
(3 rows)

如果只是执行UNION,那么结果会如下所示:

postgres=# select * from club union select * from champion;
   name    | country 
-----------+---------
 Bayern    | Germany
 Bremen    | Germany
 Chelsea   | England
 Dortmund  | Germany
 Barcelona | Spain
(5 rows)

但是这样就会失去一条重复的记录。如果想要显示全部的记录,包括重复的部分,那么应该用UNION ALL替换UNION。

postgres=# select * from club union all select * from champion;
   name    | country 
-----------+---------
 Bayern    | Germany
 Dortmund  | Germany
 Bremen    | Germany
 Chelsea   | England
 Barcelona | Spain
 Bayern    | Germany
(6 rows)

现在结果中就会显示两张表中的所有记录。

注意:UNION ALL可以更快地执行,因为它不必过滤掉重复项。

UNION和UNION ALL是统一多个查询结果的好方法。可以使用UNION查看整个不同记录的集合,而且也可以使用UNION ALL查看包含重复记录的完整集。必要的时候可以使用ORDER BY来确保结果按照您想要的顺序进行显示。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值