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 ;
