一、Oracle的子查询分为两类分别是嵌套子查询和非嵌套子查询。所谓嵌套子查询是指,子查询是一个独立的查询不与外部查询相关,子查询将被先执行,而且只被执行一次,子查询执行完成后,再执行外部的查询,外部查询在执行过程中会使用到子查询的结果。下面我们来看嵌套子查询。

hr@OCM> set autot traceonly;
hr@OCM> SELECT employee_id,first_name,salary
2 FROM employees
3 WHERE
4 department_id=(SELECT department_id
5 FROM departments where department_name='IT');

nested query叫:inner query,main query叫outer query。

outer query是:SELECTemployee_id,first_name,salary

FROM employees;

Nested query是:SELECTdepartment_id

FROM departments where department_name='IT';

看上图的执行计划,是先执行:id=3(DEPARTMENTS做全表扫描,通过部门名称过滤出部门编号)即先执行nested query,然后再执行id=2(对EMPLOYEES表的DEPARTMENT_ID列上的索引做范围扫描,然后能索引的键值找到EMPLOYEES表中的编号、姓名、薪水),取后执行outer query。最后SELECT出来的数据来自于outer query。

通过上面的分析:子查询可以向主查询提供常量查询条件,子查询被优先执行,产生的结果作为主查询的过滤条件,然后主果询以这个条件过滤出结果,返回给用户数据。

二、上面的语句也可以转化成表连接的方式:

 hr@OCM> SELECT  employee_id,first_name,salary
2 FROM employees e,departments d
3 WHERE e.department_id=d.department_id
4 AND department_name='IT';

三、也可以用子查询非嵌套化,解除构成子查询的查询语句与主查询语句的嵌套关系或者通过表的连接方式替代子查询,以获得良的执行速度。事实上,几乎大部分的子查询都要经过转化。在子查询非嵌套化不可能实现时,优化器会制定把子查询放在最优先或最后位置 执行的独立执行计划。此时,这个查询语句的执行速度会随着子查询被放在最优先或最后位置执行的顺序不同而不同。

hr@OCM> SELECT department_id, last_name, salary
2 FROM employees x
3 WHERE salary > (SELECT AVG(salary)
4 FROM employees
5 WHERE x.department_id = department_id)
6 ORDER BY department_id;

总结:如果优化器无法将其连接转为表连接查询,而只能为其中的主查询和子查询制定相应的执行计划 。如果处理类型为需要将子查询的结果提供给主查询的列,且在子查询中能够使用索引,那么优化器就将制定优先执行子查询的执行计划。如果处理类型为在主查询被执行的同时验证子查询的FILTER,或在读取了各个集合数据之后再对其进行合并,那么就会按照hash连接的方式来执行。

A答案是说:先执行outer query,再执行nested query

B答案是说:先执行nested query,再执行outer query

C答案是说:只有返回了nested query的结果,才能执行outer query

D答案是说:nested query返回的结果能估算出outer query中返回的每一行。

库题的答案是:AD,个人觉得BD答案更合适

为什么B错呢?这个答案有点疑异,我们大家一起来讨论!!!!

[每日一题] OCP1z0-047 :2013-07-24 子查询――外查询与内查询的执行顺序的更多相关文章

  1. 老男孩IT教育-每日一题汇总

    老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...

  2. CISP/CISA 每日一题 14

    CISA 每日一题(答) 自动无人值守运行(LIGHTS-OUT)优势:1.信息系统运行成本的遏制/减少:2.持续运行(24/7):3.减少系统错误和中断次数. I/O 控制人员负责保证:1.批处理信 ...

  3. 【JavaScript】【dp】Leetcode每日一题-解码方法

    [JavaScript]Leetcode每日一题-解码方法 [题目描述] 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -& ...

  4. 【python】Leetcode每日一题-最大数

    [python]Leetcode每日一题-最大数 [题目描述] 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数. 注意:输出结果可能非常大,所以你需要返回一个 ...

  5. 每日一题20180330-Linux

    一.问题 1.1 统计/var/log/下所有文件个数 1.2 查找出/var/log目录下面修改时间是7天以前,大小在50k到2M之间,并以.log结尾的文件把这些文件复制到/data目录中 1.3 ...

  6. 【Java每日一题】20170106

    20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  7. 【Java每日一题】20170105

    20170104问题解析请点击今日问题下方的"[Java每日一题]20170105"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  8. 【Java每日一题】20170104

    20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  9. 【Java每日一题】20170103

    20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  10. 【Java每日一题】20161230

    // 20161229问题解析请点击今日问题下方的"[Java每日一题]20161230"查看(问题解析在公众号首发,公众号ID:weknow619)package Dec2016 ...

随机推荐

  1. 『Python』Python 调用 ZoomEye API 批量获取目标网站IP

    #### 20160712 更新 原API的访问方式是以 HTTP 的方式访问的,根据官网最新文档,现在已经修改成 HTTPS 方式,测试可以正常使用API了. 0x 00 前言 ZoomEye 的 ...

  2. 2048 swift

    AppearanceProvider.swift import UIKit protocol AppearanceProviderProtocol:class { func tileColor(val ...

  3. 海园帮忙写的JQUERY功能,实现了我们想要的,我觉得有点屌哟~~

    需求就是为了可以在WEB在线更新代码期间,如果执行时间较长的话, 就在提交按钮之后,按钮变为灰色. 同时,一个DIV里每隔两秒刷新输出. 当更新完成之后(检测文档中的关键字串),按钮变为可提交状态~~ ...

  4. Xamarin.Forms WebView

    目前本地或网络的网页内容和文件加载 WebView是在您的应用程序显示Web和HTML内容的视图.不像OpenUri,这需要用户在Web浏览器的设备上,WebView中显示您的应用程序内的HTML内容 ...

  5. RR 和RC隔离问题

    Sesssion 1: mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +--------------- ...

  6. 130+ essential vim commands

    Basics :e filename Open filename for edition :w Save file :q Exit Vim :q! Quit without saving :x Wri ...

  7. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  8. Git学习资料整理

    Git作为一个优秀的版本控制系统,是我们开发人员必须要学会使用的一个工具,接触git一年多以来,也看了不少相关资料,今天把我所看过的一些学习资源整理一下. Git入门当然首推廖雪峰廖老师的教程:Git ...

  9. [MongoDB] Introduce to MongoDB

    1. Use or create a database: use wandRecorder You will use keyword to create or fetch a exicting dat ...

  10. LA 6448 Credit Card Payment

      [题目] 你的信用卡目前欠M元,每月的汇率是R,每月的利息要四舍五入为小数点后两位,你每月还B元,问多少月能还清. 输入 先是T代表测试数据组数 接下来T行,每行有三个实数,R,M,B每个实数小数 ...