【Oracle】Oracle之SQL的集合运算符

前情提要:本篇博客详细介绍了oracle的SQL的集合运算符,包括UNION、UNION ALL、INTERSECT、MINUS,并且介绍了对应的操作规则和注意事项,并且有使用示例和解析

oracle版本:19c

一、集合运算符的类型和准则

集合操作

集合操作准则

  • SELECT列表中的表达式必须在个数上匹配。

  • 后续查询中每列的数据类型必须与第一个查询中其对应列的数据类型匹配。

  • 括号可用于更改执行顺序。

  • ORDER BY子句只能出现在语句的最后。

Oracle服务器和集合运算符

  • 除UNION ALL外,所有行都将自动消除(除UNION ALL运算符外其余集合运算符都会自动去重)。

  • 来自第一个查询的列名将出现在结果中(结果的列名是第一个查询写的列名)。

  • 默认情况下,输出以升序排序,但UNION ALL除外。

二、UNION 和 UNION ALL 运算符

2.1 UNION

UNION操作

UNION运算符使用示例:

sql 复制代码
SELECT 'A','B' FROM DUAL
UNION 
SELECT 'A','D' FROM DUAL;
sql 复制代码
-- UNION会自动去重
SELECT 'A','B' FROM DUAL
UNION 
SELECT 'A','B' FROM DUAL; 

2.2 UNION ALL

UNION ALL 使用示例:

sql 复制代码
-- UNION ALL 不会去重
SELECT 'A','B' FROM DUAL
UNION ALL
SELECT 'A','B' FROM DUAL;

三、INTERSECT运算符(相交运算符)

使用示例

sql 复制代码
select * from employees		-- 员工表中的所有人的信息
INTERSECT
select * from employees where salary > 10000;	-- 员工表中工资大于10000的人的信息
-- 最后相交返回的结果就是工资大于10000的人的信息

四、MINUS运算符(相减运算符)

使用示例

sql 复制代码
select * from employees		-- 所有员工的信息
minus 
select * from employees where salary > 10000;	-- 工资大于10000的员工的信息
-- 返回的结果就是所有员工减去工资大于10000的员工,也就是所有工资不大于10000的员工的信息
-- 可见返回了92行信息
sql 复制代码
-- 需要注意的是使用MINUS时要用大表-小表,比如上例中所有员工包含了107行信息,是大表,工资大于10000的员工包含了15行信息,是小表
-- 如果将小表写在前面就变成了小表-大表,会造成如下结果
-- 将上例查询内容调换位置
select * from employees where salary > 10000
minus 
select * from employees;
-- 可见查询结果为空,所以使用MINUS时要注意保证大表-小表

五、匹配SELECT列的数据类型

当一个或另一个表中不存在列时,必须匹配数据类型(使用TO_CHAR函数或任何其他转换函数)。

示例

sql 复制代码
-- 准备两个示例表B和C,可见B的ID3列和C的ID2列的数据类型不一样
SQL> DESC B;

Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
ID3                                                NUMBER
ID4                                                NUMBER(10)

SQL> DESC C;

Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
ID4                                                NUMBER
ID2                                                VARCHAR2(10)

-- 直接进行集合运算会报错,因为数据类型不一致
SQL> SELECT ID4,ID3 FROM B
  2  UNION
  3  SELECT ID4,ID2 FROM C;
SELECT ID4,ID3 FROM B
           *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression

-- 使用TO_CHAR转换ID3的数据类型,可见可以成功进行集合运算
SQL> SELECT ID4,TO_CHAR(ID3) AS HAHA FROM B
  2  UNION
  3  SELECT ID4,ID2 FROM C;

       ID4 HAHA
---------- ----------------------------------------
         3 10
         4 20
        10 100
        20 200

六、在集合操作中使用ORDER BY 子句

  • 在复合查询的末尾,ORDER BY子句只能出现一次。

  • 组件查询不能有单独的ORDER BY子句。

  • ORDER BY子句仅识别第一个SELECT查询的列。

  • 默认情况下,第一个SELECT查询的第一列用于按升序对输出进行排序。

示例

sql 复制代码
-- ORDER BY 只能放在语句的最后,并且只能识别第一个SELECT中查询的列
SQL> SELECT ID4,TO_CHAR(ID3) AS HAHA FROM B
  2  UNION
  3* SELECT ID4,ID2 FROM C ORDER BY HAHA;

       ID4 HAHA
---------- ----------------------------------------
         3 10
        10 100
         4 20
        20 200
相关推荐
这个DBA有点耶15 分钟前
数据库迁移怎么做到“零翻车“:金仓 KDMS/KDTS/KFS 工具链实测
数据库·架构·dba
阿里云云原生15 分钟前
当拨测遇上 APM:STAROps Agent 如何区分网络问题与后端问题
云原生
IT邦德1 小时前
Dify1.6基于ubuntu系统的部署实战
linux·运维·ubuntu
名字还没想好☜1 小时前
Next.js 用 Server Components 直连数据库:去掉 API 层的边界,和三条别踩的安全红线
前端·javascript·数据库·安全·react·next.js
蓝速科技1 小时前
蓝速科技会议电子门牌规模化部署与运维成本实测
运维·科技
许彰午2 小时前
# allbytaskid——一个接口扛六个DataStore
运维·服务器·php
迷迭香yy2 小时前
行业板块轮动因子实战从板块资金到因子建模的本地化Python全流程
数据库·人工智能·python
吠品2 小时前
Java byte数组与String互转:编码细节与踩坑记录
java·linux·服务器
牛奶咖啡132 小时前
AI助力运维——AIGC运维应用实践—Deepseek的介绍与本地部署选型
运维·人工智能·deepseek·deepseek能做什么·deepseek本地部署配置·本地部署选型避坑原则·本地部署的典型方案
木白CPP2 小时前
Linux 驱动UART子系统源码分析
linux·运维·服务器·驱动开发·嵌入式硬件·开源软件