oracle 中关于 union 和 union all 的不同作用简介

本文介绍了Oracle中UNION和UNION ALL的不同用法。二者使用规范相同,如内部SELECT语句列数、类型、顺序需一致等。通过不同示例对比发现,UNION会去除重复数据,只保留一行;而UNION ALL会保留重复数据。可按需选择使用。

今天简单介绍一下union 和union all 的不同用法,仅供参考:

先说一下 UNION  和 UNION ALL 共同的使用规范:

(1) 内部的每个 SELECT 语句必须拥有相同数量的列;

(2) 同一列也必须拥有相似的数据类型;

(3) 每个 SELECT 语句中的列的顺序必须相同;

另外:结果集中的列名总是等于 UNION 或者 UNION ALL 中第一个 SELECT 语句中的列名。

然后,我们再来对比看一下不同情况下使用 UNION 或者 UNION ALL 查询出来的效果:

union:

1. 每一行的数据不完全相同

select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual

union

select '张三' as 姓名, '男' as 性别, 20 as 年龄, '五道口职业技术学院' as 学校 from dual

union

select '李四' as 姓名, '女' as 性别, 19 as 年龄, '五道口职业技术学院' as 学校 from dual

union

select '王五' as 姓名, '男' as 性别, 21 as 年龄, '五道口职业技术学院' as 学校 from dual

查询结果如下:

2.存在两行一模一样的数据:

select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual

union

select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual

union

select '李四' as 姓名, '女' as 性别, 19 as 年龄, '五道口职业技术学院' as 学校 from dual

union

select '王五' as 姓名, '男' as 性别, 21 as 年龄, '五道口职业技术学院' as 学校 from dual

查询结果:

对比上面两个SQL和查询结果可知:

使用union进行连接的时候,会去除重复的数据,只保留一行

 

union all:

1.每一行的数据不完全相同

select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual

union all

select '张三' as 姓名, '男' as 性别, 20 as 年龄, '五道口职业技术学院' as 学校 from dual

union all

select '李四' as 姓名, '女' as 性别, 19 as 年龄, '五道口职业技术学院' as 学校 from dual

union all

select '王五' as 姓名, '男' as 性别, 21 as 年龄, '五道口职业技术学院' as 学校 from dual

查询结果:

此时,与使用 "union" 的第一种情况相比,并没有什么不一样的,在这种情况下,"union" 和 "union all" 的效果是一样的

2.存在两行一模一样的数据:

select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual

union all

select '张三' as 姓名, '男' as 性别, 18 as 年龄, '五道口职业技术学院' as 学校 from dual

union all

select '李四' as 姓名, '女' as 性别, 19 as 年龄, '五道口职业技术学院' as 学校 from dual

union all

select '王五' as 姓名, '男' as 性别, 21 as 年龄, '五道口职业技术学院' as 学校 from dual

查询结果:

此时,对比 "union all" 自身的第一种情况,可以看到查询结果并没有发生什么改变,即使有重复数据,也会保留下来;但是,对比 "union" 的第二种情况,可以看出明显的区别:"union all" 会保留重复数据

 

综上所述:

如果需要保留重复数据就使用 "union all",需要去除重复数据就使用 "union";

Oracle 数据库中,`UNION ALL` 是一种用于合并两个或多个 `SELECT` 查询结果集的关键字。与 `UNION` 不同的是,`UNION ALL` 不会去除重复的记录,而是将所有查询结果中的行全部返回,包括重复的行[^3]。 ### 功能 - **合并结果集**:`UNION ALL` 允许将多个 `SELECT` 语句的结果合并为一个结果集。每个 `SELECT` 的列数数据类型必须匹配,但列名可以不同。 - **保留重复记录**:与 `UNION` 会自动去重不同,`UNION ALL` 不进行任何去重操作,因此性能通常优于 `UNION`。 - **提高查询效率**:由于不进行去重排序操作,`UNION ALL` 的执行速度更快,适用于不需要去重的场景[^3]。 ### 使用方法 基本语法如下: ```sql SELECT column1, column2, ... FROM table1 UNION ALL SELECT column1, column2, ... FROM table2; ``` 例如,在 `scott` 用户的 `emp` 表中,以下查询将返回 `deptno >= 20` `deptno <= 30` 的所有员工记录(包括重复记录): ```sql SELECT * FROM emp WHERE deptno >= 20 UNION ALL SELECT * FROM emp WHERE deptno <= 30; ``` 需要注意以下几点: - 各个 `SELECT` 语句的列数必须相同,列的数据类型也应兼容。 - 列的顺序必须一致,否则可能导致数据错位。 - 可以结合 `ORDER BY` 使用,但需将 `SELECT` 查询包裹在子查询中再进行排序[^4]。例如: ```sql SELECT * FROM ( SELECT name, age FROM student ORDER BY age ) UNION ALL SELECT * FROM ( SELECT name, age FROM person ORDER BY age ); ``` ### 注意事项 - `UNION ALL` 不会对结果进行排序,如果需要排序,必须显式使用 `ORDER BY` 子句。 - `UNION ALL` 可以用于多个表的合并,但所有表的结构必须一致(列数、列类型)。 - 在大数据量查询中,`UNION ALL` 的效率优势更为明显,适合用于日志合并、报表汇总等场景[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值