PostgreSQL中UNION的使用

目录

文档用途

详细信息

文档用途

UNION操作符计算所涉及的SELECT语句所返回的行的并集。如果希望结果作为单个记录集返回,则此运算符非常有用。

详细信息

1.UNION的使用

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

使用UNION运算符时,有以下几个注意事项:

1)作为UNION两个操作数的SELECT语句必须产生相同数量的列并且对应位置上的列必须具有兼容的数据类型。

2)默认情况下,UNION的结果不会包含重复行。

3)除非用圆括号指定计算顺序,同一个SELECT语句中的多个UNION操作符会从左至右计算。

4)截至目前,FOR NO KEY UPDATE、FOR UPDATE、FOR SHARE和FOR KEY SHARE不能用于UNION结果或者UNION的任何输入。

举例说明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来确保数据按您指定的顺序显示。

2.UNION ALL的使用

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

但是,UNION ALL也不保证生成的结果将按任何特定顺序排列。因此,和使用UNION一样,您需要使用ORDER BY进行排序来确保数据按您指定的顺序显示。

举例说明UNION ALL的应用场景:

有如下两张表,其中包含一条重复的记录:

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的执行速度更快,因为它不必过滤掉重复项。

order by的详细使用请登录【瀚高技术支持平台】查看

https://support.highgo.com/#/index/docContent/05e3936e00a50ebc

猜你喜欢

转载自blog.csdn.net/pg_hgdb/article/details/84333487
今日推荐