问题
你想执行基于相同列或相同列值的连接,以返回多张表中的行。例如,你想显示所有部门编号为 30 的员工的姓名以及每位员工所属部门的位置,但这些数据存储在两张表中。
解决方案
基于 DEPTNO 连接 EMP 表和 DEPT 表。
select e.name, d.loc
from emp e,
dept d
where e.deptno = d.deptno
and e.deptno = 30
扩展
上述解决方案使用了连接,准确地说是相等连接——内连接的一种。连接是一种将两张表中的行合并的操作,而相等连接是基于相等条件(比如一张表的部门编号与另一张表的部门编号相等)的连接。内连接是最基本的连接,它返回的每一行都包含来自参与连接查询的各张表的数据。
从概念上说,为生成结果集,连接首先会创建 FROM 子句中指定的表的笛卡儿积(所有可能的行组合)。
select e.name,
d.loc,
e.deptno as emp_deptno,
d.deptno as dept_deptno
from emp e,
dept d
where e.deptno = 30;
这将返回 EMP 表中部门编号为 30 的每位员工与 DEPT 表中每个部门的组合。然后 WHERE 子句中涉及 e.deptno 和 d.deptno(连接)的表达式会对结果集进行限制,使其只包含 EMP.DEPTNO 和 DEPT.DEPTNO 相等的行。
select e.name, 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 = 30
另一种解决方案是显式地指定 JOIN 子句(关键字 INNER 是可选的)。
select e.name,
d.loc,
e.deptno as emp_deptno,
d.deptno as dept_deptno
from emp e
inner join dept d
on (e.deptno = d.deptno)
where e.deptno = 30
如果你喜欢在 FORM 子句(而不是 WHERE 子句)中指定连接逻辑,那么可以使用 JOIN 子句。
点个赞吧,这对我非常重要!