概述
我们有几张表,
EMP(员工表)
DEPT(部门表)
EMP_BOUNDS(员工奖金表)
我们需要完成这样一个事情,找出同时在在EMP(员工表),DEPT(部门表)中的员工信息,员工编号,员工名字,部门编号,部门所在地,在EMP_BOUNDS(员工奖金表)表中,找出员工获得奖金的日期,如下图
SQL
select a.ename,a.EMPNO,a.deptno,a.loc,b.RECEIVED
FROM(
select e.ename,e.EMPNO, e.deptno,d.loc
from emp e, dept d
where e.EMPNO=d.EMPNO
)a
LEFT JOIN
(
SELECT EMPNO,RECEIVED
FROM EMP_BONUS
)b ON b.EMPNO=a.EMPNO
不理解的话,可以从子查询多试几次,大体结构是内层查询+外层查询组成的子查询于LEFT JOIN的组合
使用如下sql也能达成目的
select e.ename,e.EMPNO, e.deptno, d.loc,eb.received
from emp e INNER JOIN dept d
on (e.EMPNO=d.EMPNO)
left join emp_bonus eb
on (e.empno=eb.empno)
在来看这种解法
select e.ename,e.EMPNO,e.deptno,d.loc,(select eb.received from emp_bonus eb
where eb.empno=e.empno) as received
from emp e, dept d
where e.empno=d.empno
真的棒,它将子查询用在了哪里,没错SELECT中,
那么写在SELECT中的子查询叫什么呐,叫标量子查询,
那么这个SQL的执行过程是怎样的呐?没错,先从emp和dept中筛选出where条件中匹配的数据,再筛选select中子查询中的数据,如果select中的子查询带where条件,那么再将筛选出的数据和select子查询中的数据进行匹配,匹配到了将值返回,没有匹配到返回null
应该是这样的,如果有问题的话,我们再探究