SQL关联子查询的详解

我们先来看一下SQL关联子查询的基本逻辑的定义
对于外部查询返回的每一行数据,内部查询都要执行一次。在关联子查询中是信息流是双向的。外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录。然后,外部查询根据返回的记录做出决策。

是不是没看懂,下面详细解释SQL中关联子查询的逻辑。

有一张员工表,它的主要信息为:
在这里插入图片描述
要解决的问题:检索工资大于同职位的平均工资的员工信息。

一般我们会这样想:

员工多,而相应的职位(如销售员、经理、部门经理等)少,因此首先想到的思路是对职位分组,这样就能分别得到各个职位的平均工资,再比较每个人的工资和他对应职位的平均工资,大于则被筛选出来。

首先得到各个职位的平均工资

代码如下:

1 select job,avg(sal) from emp
2 group by job;

结果如下:
在这里插入图片描述
然后利用子查询,对他们进行对比(幻想)

代码如下

select * from emp where sal >
(select avg(sal) from emp
group by job);

但是子表查询结果是5行,因此这段代码根本无法执行。

正确的做法应该是用关联子查询

select * from emp e where sal > 
(select avg(sal) from emp where job = e.job);

第一步
先执行外层查询,即先执行:

select * from emp e;

在这里插入图片描述
也就是该表的所有内容。又因为子查询中连接了这个表本身(where job = e.job ),所以将第一条记录转到子查询。
在这里插入图片描述
第二步
这条进入子查询后,子查询job是CLERK,所以先筛选出所有Job=‘CLERK’的,再对他们取平均。

相当于执行了:

select avg(sal) from emp where job='CLERK';

结果是
在这里插入图片描述
第三步
这个结果进入外层查询where和SMITH这个人的sal进行对比,相当于执行了

select * from emp where sal>1037.5 and job='CLERK';

结果是:
在这里插入图片描述
循环
然后就抽出第一次外层查询的第二条(ALLEN)
在这里插入图片描述
继续如上第一、二、三部。

这样会重复计算吗?每条记录都执行,第二行的ALLEN和第三行的WARD都是SALESMAN(销售人员),那么他们在子查询中会重复计算一次平均工资进行比较。这样会不会设计重复计算?答案是不会,效率并没有降低,SQL已经对此进行过优化。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值