一、基本逻辑

对于外部查询返回的每一行数据,内部查询都要执行一次。在关联子查询中是信息流是双向的。外部查询的每行数据传递一个值给子查询,然后子查询为每一行数据执行一次并返回它的记录。然后,外部查询根据返回的记录做出决策。

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

二、举例

员工表的主要信息:

要解决的问题:检索工资大于同职位的平均工资的员工信息。

2.1 直觉的做法

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

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

代码如下:

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

结果如下:

然后利用子查询,对他们进行对比(幻想)

代码如下:

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

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

2.2 正确的做法

正确的做法是使用关联子查询。代码如下。

 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已经对此进行过优化。

如何正确理解SQL关联子查询的更多相关文章

  1. 一文让你彻底理解SQL关联子查询

    员工表的主要信息: 需求:检索工资大于同职位的平均工资的员工信息. 直觉的做法 员工多,而相应的职位(如销售员.经理.部门经理等)少,因此首先想到的思路是对职位分组,这样就能分别得到各个职位的平均工资 ...

  2. SQL关联子查询

    SQL关联子查询执行顺序: 1.先取到主查询中的相关数据,一次取一行主查询的数据 2.然后传入子查询,进行子查询 3.最后做主查询where筛选,注意子查询的where条件同样需要加在主查询后 参考: ...

  3. 一文让你彻底理解SQL的子查询

    什么是子查询 当一个查询是另一个查询的条件时,称之为子查询. 为什么要使用子查询 在SELECT.INSERT.UPDATE或DELETE命令中只要是表达式的地方都可以包含子查询,子查询甚至可以包含在 ...

  4. SQL进阶系列之6用关联子查询比较行与行

    写在前面 使用SQL对同一行数据进行列间的比较很简单,只需要在WHERE子句里写上比较条件就可以了,对于不同行数据进行列间比较需要使用自关联子查询. 增长.减少.维持现状 需要用到行间比较的经典场景是 ...

  5. mssql sql高效关联子查询的update 批量更新

    /* 使用带关联子查询的Update更新     --1.创建测试表 create TABLE Table1     (     a varchar(10),     b varchar(10),   ...

  6. SQL基础教程(第2版)第5章 复杂查询:5-3 关联子查询

    第5章 复杂查询:5-3 关联子查询 ● 关联子查询会在细分的组内进行比较时使用.● 关联子查询和GROUP BY子句一样,也可以对表中的数据进行切分.● 关联子查询的结合条件如果未出现在子查询之中就 ...

  7. 神奇的 SQL 之子查询,细节满满 !

    前言 开心一刻 有一天,麻雀遇见一只乌鸦. 麻雀问:你是啥子鸟哟 ? 乌鸦说:我是凤凰. 麻雀说:哪有你龟儿子这么黢黑的凤凰 ? 乌鸦说:你懂个铲铲,老子是烧锅炉的凤凰. 子查询 讲子查询之前,我们先 ...

  8. SQL Fundamentals: 子查询 || WHERE,HAVING,FROM,SELECT子句中使用子查询,WITH子句

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

  9. 利用带关联子查询Update语句更新数据

    Update是T-sql中再简单不过的语句了,update table set column=expression  [where condition],我们都会用到.但update的用法不仅于此,真 ...

随机推荐

  1. 逆向-PE导出表

    PE-导出表 ​ 动态链接库要想给别人用实现加载时或运行时链接就必须提供函数和数据的地址.exe一般不会有这个,大部分是DLL文件的.导出分为名字导出和序号导出. 名字导出先找名字,再通过名字表的索引 ...

  2. 第七篇 Django-认证系统

    Django-认证系统 阅读目录(Content) 1 Cookie 与 Session 概念 查看cookie 登陆应用 Django中操作Cookie 1.获取Cookie 2.设置Cookie ...

  3. Mac使用安卓模拟器-网易MuMu

    先看下效果图 近期,因为小编把安卓手机倒手了,但现在还想看看一些安卓应用.所以就搜罗了很多市场上的模拟器. 最终选定了网易的MuMu,总体感觉网易也是花了很大的心思,整体效果超赞. 下载地址 网易Mu ...

  4. 【Android】家庭记账本手机版开发报告二

    一.说在前面 昨天 完成了对记账本的账单的增删 今天 完善昨天的框架结构( 1.引入ViewModel管理数据.使MainActive 只管理界面.不再管数据了 2.引入AsyncTask.后台执行. ...

  5. WIN10怎么查看端口,并杀死进程

    在命令行执行一下命令 netstat -ano | findstr "

  6. windows自带的颜色编辑器居中

    void xxx::SetOSDColor(CLabelUI * pLabel) { COLORREF color = RGB(*, *, *); CColorDialog cdlg(color, C ...

  7. Kmeans应用

    1.思路 应用Kmeans聚类时,需要首先确定k值,如果k是未知的,需要先确定簇的数量.其方法可以使用拐点法.轮廓系数法(k>=2).间隔统计量法.若k是已知的,可以直接调用sklearn子模块 ...

  8. web.xml中filter加载顺序出现的问题

    刚刚遇到了一个问题,项目中需要用到characterEncodingFilter和HiddenHttpMethodFilter,但是post请求还是会中文乱码,找了半天原因,后来发现,filter加载 ...

  9. 科学 multi port

    issues/679 create new UUID cat /proc/sys/kernel/random/uuid example config : multi port , multi user ...

  10. 2019 年 Google 编程之夏活动报告

    2019 年 Google 编程之夏活动报告 主要介绍了 GSoC 2019 活动的几个课题并讲述了整个活动的组织过程 Google 编程之夏活动不仅仅是一个夏日的实习项目,对于组织和一些社区的成员来 ...