SQL 合并相关行

SQL 合并相关行,你想根据一个共同的列或者具有相同值的列做连接查询,并返回多个表中的行。例如,你想显示部门编号为 10 的全部员工的名字及其部门所在地,但这些数据分别存储在两个表里。你希望得到如下所示的结果集。

SQL 合并相关行 问题描述

ENAME      LOC
---------- -------------
CLARK      NEW YORK
KING       NEW YORK
MILLER     NEW YORK

SQL 合并相关行 解决方案

通过 DEPTNO 字段把 EMP 表和 DEPT 表连接起来。

1 select e.ename, d.loc
2   from emp e, dept d
3  where e.deptno = d.deptno
4    and e.deptno = 10

SQL 合并相关行 扩展知识

这个解决方案是一个关于连接查询的例子。更准确地说,它是内连接中的相等连接。连接查询是一种把来自两个表的行合并起来的操作。对于相等连接而言,其连接条件依赖于某个相等条件(例如,一个表的部门编号和另一个表的部门编号相等)。内连接是最早的一种连接,它返回的每一行都包含了来自参与连接查询的各个表的数据。
理论上,连接操作首先会依据 FROM 子句里列出的表生成笛卡儿积(列出所有可能的行组合),如下所示。

select e.ename, d.loc,
       e.deptno as emp_deptno,
       d.deptno as dept_deptno
  from emp e, dept d
where e.deptno = 10
 
ENAME      LOC           EMP_DEPTNO DEPT_DEPTNO
---------- ------------- ---------- -----------
CLARK      NEW YORK              10          10
KING       NEW YORK              10          10
MILLER     NEW YORK              10          10
CLARK      DALLAS                10          20
KING       DALLAS                10          20
MILLER     DALLAS                10          20
CLARK      CHICAGO               10          30
KING       CHICAGO               10          30
MILLER     CHICAGO               10          30

EMP 表里部门编号为 10 的全部员工与 DEPT 表的所有部门组合都被列出来了。然后,通过 WHERE 子句里的 e.deptnod.deptno 做连接操作,限定了只有 EMP.DEPTNODEPT.DEPTNO 相等的行才会被返回。

select e.ename, d.loc,
       e.deptno as emp_deptno,
       d.deptno as dept_deptno
  from emp e, dept d
 where e.deptno = d.deptno
   and e.deptno = 10
 
ENAME      LOC           EMP_DEPTNO DEPT_DEPTNO
---------- ------------- ---------- -----------
CLARK      NEW YORK              10          10
KING       NEW YORK              10          10
MILLER     NEW YORK              10          10

另一种写法是利用显式的 JOIN 子句(INNER 关键字是可选项)。

select e.ename, d.loc
  from emp e inner join dept d
    on (e.deptno = d.deptno)
where e.deptno = 10

如果你更喜欢在 FROM 子句里(而不是在 WHERE 子句里)写明连接逻辑,则可以使用 JOIN 子句。这两种风格都符合 ANSI 标准,本书涉及的关系数据库管理系统的最新版本也都支持它们。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程