PostgreSQLの交-并-差集(INTERSECT、UNION、EXCEPT)

PostgreSQLの交-并-差集(INTERSECT、UNION/UNION ALL、EXCEPT)

INTERSECT用于求交集,UNION/UNION ALL用于求并集,EXCEPT用于求差集。

用法如下:

query1 INTERSECT query2

query1 UNION query2 

query1 EXCEPT query2

其中query1和query2的SELECT子句中字段个数必须相同,且对应的数据类型必须相同(如果int和bigint结果取bigint,varchar(5)和varchar(10)结果取varchar(10)),字段名可以不同,但是最终结果会以第一个SELECT子句中字段名称返回。

1.造数据

create table tbl_test1(
 a int,
 b varchar(10),
 c varchar(5)
);

create table tbl_test2(
 e int,
 f varchar(10),
 g varchar(32)
);

insert into tbl_test1(a,b,c) values (1,'HA','12'),(2,'ha','543');

insert into tbl_test2(e,f,g) values (1,'HA','dh'),(3,'hk','76sskjhk');

2.INTERSECT

两个查询使用INTERSECT求交集的结果使用图片表示如下:

示例1.

select a,b from tbl_test1 intersect select e,f from tbl_test2 ;

3.UNION / UNION ALL

两个查询使用UNION的结果使用图片表示如下:

UNION默认会去重,即重复数据只会返回一行

UNION ALL会保留重复数据,返回所有行。

示例1.

select a,b from tbl_test1 union select e,f from tbl_test2 ;
 

示例2.

 select a,b from tbl_test1 union all select e,f from tbl_test2 ;

示例3.

 select a,c from tbl_test1 union all select e,g from tbl_test2 ;

4.EXCEPT

两个查询使用EXCEPT(A EXCEPT B)求差集的结果:

示例1.

select a,b from tbl_test1 except select e,f from tbl_test2 ;

作者: BORS

原文地址:https://www.cnblogs.com/bors/p/postgresql_intersect_union_except.html