postgresql-集合运算

news/2024/7/9 22:30:39 标签: postgresql, 数据库

postgresql-集合运算

  • 简介
  • UNION
  • INTERSECT
  • EXCEPT
  • 分组与排序
  • 集合操作优先级

简介

数据库中的表(table)本质上就是由行(row)组成的集合。因此,PostgreSQL 同样支持集
合论中的集合操作,包括并集(UNION)、交集(INTERSECT)和差集(EXCEPT):

  • UNION 操作符用于将两个查询结果合并成一个结果集,返回出现在第一个查询或者出现
    在第二个查询中的数据
  • INTERSECT 操作符用于返回两个查询结果中的共同部分,即同时出现在第一个查询结
    果和第二个查询结果中的数据
  • EXCEPT 操作符用于返回出现在第一个查询结果中,但不在第二个查询结果中的数据
    这三个操作符的作用如下图所示:
    在这里插入图片描述

UNION

UNION 操作符用于将两个查询结果合并成一个结果集,返回出现在第一个查询或者出现在
第二个查询中的数据:

-- 语法
SELECT column1, column2
 FROM table1
UNION [DISTINCT | ALL]
SELECT col1, col2
 FROM table2;

其中,DISTINCT 表示将合并后的结果集进行去重;ALL 表示保留结果集中的重复记录;如
果省略,默认为 DISTINCT。例如

SELECT * FROM (values(1),(2)) t1(n)
union
SELECT * FROM (values(1),(3)) t2(n);

在这里插入图片描述

SELECT * FROM (values(1),(2)) t1(n)
union all
SELECT * FROM (values(1),(3)) t2(n);

在这里插入图片描述
第一个查询结果中只有一个数字 1,第二个查询结果中保留了重复的数字 1。

INTERSECT

INTERSECT 操作符用于返回两个查询结果中的共同部分,即同时出现在第一个查询结果和
第二个查询结果中的数据:

-- 语法
SELECT column1, column2
 FROM table1
INTERSECT [DISTINCT | ALL]
SELECT col1, col2
 FROM table2;

其中,DISTINCT 表示将合并后的结果集进行去重;ALL 表示保留结果集中的重复记录;如
果省略,默认为 DISTINCT。例如:

select * from (values(1),(2)) t1(n)
intersect
select * from (values(1),(3)) t2(n);

在这里插入图片描述
在这里插入图片描述

select * from (values(1),(1),(2)) t1(n)
intersect all
select * from (values(1),(1),(3)) t2(n);

在这里插入图片描述
第一个查询结果中只有一个数字 1;第二个查询虽然使用了 ALL 选项,结果也只有一个 1;
第三个查询结果中有两个 1。

EXCEPT

EXCEPT 操作符用于返回出现在第一个查询结果中,但不在第二个查询结果中的数据:

select column1, column2
 from table1
except [distinct | all]
select col1, col2
 from table2;

其中,DISTINCT 表示将合并后的结果集进行去重;ALL 表示保留结果集中的重复记录;如
果省略,默认为 DISTINCT。例如:

select * from (values(1),(1),(2)) t1(n)
except
select * from (values(1),(3)) t2(n);

在这里插入图片描述

select * from (values(1),(1),(2)) t1(n)
except all
select * from (values(1),(3)) t2(n);

在这里插入图片描述
第一个查询结果中没有数字 1;第二个查询结果中保留了一个数字 1。

分组与排序

对于分组操作,集合操作符中的每个查询都可以包含一个 GROUP BY,不过它们只针对各
自进行分组;如果想要对最终结果进行分组,需要在外层嵌套一个 SELECT 语句:

select n, count(*) from (
 select * from (values(1),(2)) t1(n)
 union all
 select * from (values(1),(3)) t2(n)) t
group by n;

在这里插入图片描述
如果要对集合运算的数据进行排序,需要将 ORDER BY 子句写在最后;集合操作符中的第
一个查询中不能出现排序操作:

select * from (values(1),(2)) t1(n)
order by n
union all
select * from (values(1),(3)) t2(n);

在这里插入图片描述

集合操作优先级

PostgreSQL 支持同时使用多个集合操作符,此时我们需要注意它们的优先级:

SELECT column1, column2
 FROM table1
UNION [DISTINCT | ALL]
SELECT col1, col2
 FROM table2
INTERSECT [DISTINCT | ALL]
SELECT c1, c2
 FROM table3;

多个集合操作符使用以下执行顺序:

  • 相同的集合操作符按照从左至右的顺序执行;
  • INTERSECT 的优先级高于 UNIONEXCEPT
  • 使用括号可以修改集合操作的执行顺序。
    以下示例使用了两个 UNION 操作符,其中一个增加了 ALL 选项:
select * from (values(1)) t1(n)
union all
select * from (values(1)) t2(n)
union
select * from (values(1)) t3(n);

在这里插入图片描述
查询最终的结果只有一个数字 1,因为最后的 UNION 去除了重复的数据。
以下示例使用了两个不同的集合操作符:

select * from (values(1)) t1(n)
union all
select * from (values(1)) t2(n)
intersect
select * from (values(1)) t3(n);

在这里插入图片描述
查询最终的结果包含了两个数字 1,因为 INTERSECT 先执行,最后的 UNION ALL 保留了
重复的数据

最后看一个使用括号的示例:

(
select * from (values(1)) t1(n)
union all
select * from (values(1)) t2(n)
)
intersect
select * from (values(1)) t3(n);

在这里插入图片描述


http://www.niftyadmin.cn/n/4985606.html

相关文章

C++中使用 do…while 循环

C中使用 do…while 循环 在有些情况(如程序清单 6.8 所示的情况)下,您需要将代码放在循环中,并确保它们至少执行一次。此时 do…while 循环可派上用场。 do…while 循环的语法如下: do {StatementBlock; // executed…

2023_Spark_实验二:IDEA安装及配置

一、下载安装包 链接:百度网盘 请输入提取码 所在文件夹:大数据必备工具--》开发工具(前端后端)--》后端 下载文件名称:ideaIU-2019.2.3.exe (喜欢新版本也可安装新版本,新旧版本会存在部分差异) IDEA …

stm32之27.iic协议oled显示

屏幕如果无法点亮,需要用GPIO_OType_PP推挽输出,加并上拉电阻 1.显示字符串代码 2.显示图片代码(unsigned强制转换(char*)) 汉字显示

人员位置管理,点亮矿山安全之路

矿山作为一个高危行业,安全问题一直备受关注。人员定位置管理是现代矿山安全管理的重要一环,可以帮助企业更好地实现对人员的实时监控和管理。因此,矿山人员位置管理系统对于矿山安全生产和管理非常重要,可以帮助减少安全事故的发…

分布式锁:业务锁和定时任务锁

一:业务锁 在代码业务逻辑加锁,防止不同业务操作相同业务表导致数据错乱,设置锁进行等待。这里锁使用的是ReentrantLock。详细的介绍可以参考: https://blog.csdn.net/jerry11112/article/details/112375167 Slf4j public class…

Python 中的 Promise 系列

文章目录 Python 中的异步编程回调函数在 Python 中try/exceptPython 中的 Promise 系列Promises 本篇文章将介绍如何用 Python 编写一系列 promise。 首先,我们将讨论 Python 中的异步编程。 接下来,我们将讨论 Python 中的回调函数。 最后&#xff0c…

第一百三十回 Flutter与原生平台通信

文章目录 概念介绍实现方法经验总结 我们在上一章回中介绍了Visibility组件相关的内容,本章回中将介绍 Flutter与原生平台通信相关的内容.闲话休提,让我们一起Talk Flutter吧。 概念介绍 在移动开发领域以Android和IOS SDK开发出的应用程序叫原生开发&…

修改linux中tomcat的端口

随便修改一个 以8055为例子 开放8081端口 firewall-cmd --permanent --add-port8081/tcp firewall-cmd --reload firewall-cmd --list-all