子查询及LEFT JOIN的组合使用

概述

我们有几张表,

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

应该是这样的,如果有问题的话,我们再探究

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值