SQL 叠加两个行集

本文介绍了如何使用UNIONALL操作合并不同表中的数据行,以获取包含员工姓名和部门名称的结果集。强调了UNIONALL与UNION的区别,UNIONALL会包含所有不重复的行,而UNION会去除重复。此外,还提到了在使用集合运算时,数据类型和列数的一致性要求,并建议避免不必要的DISTINCT和UNION操作以提高效率。
摘要由CSDN通过智能技术生成

描述:

你想返回保存在多个表中的数据,理论上需要将一个结果集叠加在另一个之上。这些表可以没有相同的键,但它们的列的数据类型必须相同。例如,你想显示 EMP 表里部门编号为 10 的员工的名字和部门编号,以及 DEPT 表中各个部门的名称和编号。你希望得到如下所示的结果集。

ENAME_AND_DNAME     DEPTNO
--------------- ----------
CLARK                   10
KING                    10
MILLER                  10
----------
ACCOUNTING              10
RESEARCH                20
SALES                   30
OPERATIONS              40

方法:

使用集合运算 UNION ALL 合并多个表中的行。

select ename as ename_and_dname, deptno
from emp
where deptno = 10
union all
  select '----------', null
  from t1
  union all
  select dname, deptno
  from dept

扩展知识:

UNION ALL 将多个表中的行并入一个结果集。对于所有的集合运算来说,SELECT 列表里的所有项目必须保持数目相同,且数据类型匹配。例如,下面的两个检索都将失败。

select deptno  |  select deptno, dname
  from dept    |    from dept
 union all     |   union
select ename   |  select deptno
  from emp     |    from emp

尤其需要注意的是,如果有重复项,UNION ALL 也将一并纳入。如果你希望过滤掉重复项,可以使用 UNION 运算符。例如,如果针对 EMP.DEPTNO 和 DEPT.DEPTNO 执行 UNION 操作,就只会返回如下所示的 4 行数据。

select deptno
  from emp
 union
select deptno
  from dept

运行结果: 

DEPTNO
----------
        10
        20
        30
        40

使用 UNION 而不是 UNION ALL,则很可能会进行一次排序操作,以便删除重复项。当处理大型结果集的时候要想到这一点。大体而言,使用 UNION 等同于针对 UNION ALL 的输出结果再执行一次 DISTINCT 操作,如下所示。

select distinct deptno
  from (
select deptno
  from emp
 union all
select deptno
  from dept )

 运行结果:

DEPTNO
----------
        10
        20
        30
        40

除非有必要,否则不要在查询中使用 DISTINCT 操作,同样的规则也适用于 UNION。除非有必要,否则不要用 UNION 代替 UNION ALL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值