SQL 叠加两个行集

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

SQL 叠加两个行集 问题描述

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

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

SQL 叠加两个行集 解决方案

使用集合运算 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

SQL 叠加两个行集 扩展知识

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.DEPTNODEPT.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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程