sql允许多层嵌套,子查询是嵌套在其他查询中的查询。我们可以把子查询当做一张表来看到,即外层语句可以把内嵌的查询结果当做一张表使用。

子查询查询结果有三种情况

不返回查询记录。若子查询不返回记录则主查询也不会有查询记录

查询单行记录。若子查询返回的是单行记录,则在主查询中可以对该单行记录使用比较运算符

查询多行记录。若子查询返回多行记录,则在主查询中不能对该子查询记录使用比较运算符

条件比较
=,!=,<>,<,>,<=,>=,
any,some,all
is null,is not null
between x and y
in(list),not in(list)
exists(sub-query)
like _ ,%,escape ‘\‘ _\% escape ‘\’

子查询常用方法

1、any 即任何一个 ,大都用大于或小于的时候

select * from emp e where e.sal > any(1000,2000,3000);  --大于其中其中任何一个

select * from emp e where e.sal > any(select s.losal from salgrade s );--大于其中其中任何一个

2、some 一些,和any的用法相同,不过some大都用在 等于的时候

select * from emp e where e.sal = some(1000,2000,3000);--等于其中其中任何一个

select * from emp e where e.sal = some(select s.losal from salgrade s );--等于其中其中任何一个

3、all 所有,即同时满足所有的

select * from emp e where e.sal > all(1000,2000,3000);--同时大于所有的

select * from emp e where e.sal > all(select s.losal from salgrade s );--同时大于所有的

4、in

select * from emp e where e.deptno in (10,20);

等同于  select * from emp e where e.deptno='10' or e.deptno='20';

所以当主表查询数据量大,子查询数据量少的情况使用in

5、exists

exists(sub-query 只要这里面能返回一条结果,整个表达式就为true)

select e1.* from emp e1  where  exists( select 1 from dept d1 where (d1.deptno=10 or d1.deptno=20) and d1.deptno=e1.deptno);

当主查询数据量小,子查询数据量大的情况使用exists

In和exists的区别

执行效率上的比较
比如Select * from T1 where x in ( select y from T2 )
执行的过程相当于:
select * 
  from t1, ( select distinct y from t2 ) t2
 where t1.x = t2.y1 or  t1.x = t2.y2 ....;
所以当子查询数据量较大时执行效率会降低

select * from t1 where exists ( select null from t2 where y = x )
执行的过程相当于:
for x in ( select * from t1 )
   loop
      if ( exists ( select null from t2 where y = x.x )
      then 
         OUTPUT THE RECORD
      end if
end loop
表 T1 不可避免的要被完全扫描一遍

in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询。

如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。 其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 另外IN是不对NULL进行处理

oracle 子查询详解 in和exists的区别的更多相关文章

  1. Mysql高手系列 - 第12篇:子查询详解

    这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...

  2. Oracle---SQL子查询---详解

    子查询其实就是指嵌入到其他语句中的select语句,也称其为嵌套查询. 值得注意的在DDL语句中应用子查询的时候子查询可以使用order by 子句. 但是在DML语句中的where子句,set子句中 ...

  3. oracle表分区详解

    原文来自:http://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html oracle表分区详解 从以下几个方面来整理关于分区表的概念及 ...

  4. Oracle cursor_sharing 参数 详解

    一. 官网的说明 http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams042.htm#REFRN10025 ...

  5. Oracle执行计划详解

    Oracle执行计划详解 --- 作者:TTT BLOG 本文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html --- 简介:   ...

  6. Oracle权限管理详解

    Oracle权限管理详解 转载--CzmMiao的博客生活 Oracle 权限 权限允许用户访问属于其它用户的对象或执行程序,ORACLE系统提供三种权限:Object 对象级.System 系统级. ...

  7. oracle rac IP详解

    rac环境下vip/public/private IP的区别 每个节点要2块网卡, 3个IP,虚拟IP或者叫做业务IP,单个网卡当掉可以“漂”到其他网卡是继续提供服务 在Oracle RAC环境下,每 ...

  8. [转]Oracle执行计划详解

    Oracle执行计划详解 --- 作者:TTT BLOG 本文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html --- 简介:   ...

  9. Oracle函数sys_connect_by_path 详解

    Oracle函数sys_connect_by_path 详解 语法:Oracle函数:sys_connect_by_path 主要用于树查询(层次查询) 以及 多列转行.其语法一般为:       s ...

随机推荐

  1. js写css()方法,记得加引号“ ”,除非是数字

    js写css()方法,记得加引号“ ”,除非是数字.如: $("#android").css({ "position": "absolute" ...

  2. CSS 快速入门

    特点: CSS 将网页内容和显示样式进行分离,提高了显示效果的功能. CSS 和 html 相结合的四种方式: style 属性的方式 每个 html 标签中都有一个 style 样式属性, 该属性的 ...

  3. MySQL 乐观锁与悲观锁

    悲观锁 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁. 悲观锁: ...

  4. divison in python2 and python3

    python2 >>> / >>> /2.0 1.5 >>> / >>> /2.0 2.0 >>> >& ...

  5. 洛谷 [BJOI2012]最多的方案

    洛谷 这题是旁边同学介绍的,听他说记忆化搜索可以过... 不过我还是老老实实的想\(dp\)吧- 先看看数据范围,\(n\leq10^{18}\)相当于\(n \leq fib[86]\). 以前打\ ...

  6. MySQL数据库(2)- 库的操作、表的操作、数据的操作、存储引擎的介绍

    一.库的操作 1.系统数据库 执行如下命令,查看系统数据库: mysql> show databases; 参数解释: information_schema: 虚拟库,不占用磁盘空间,存储的是数 ...

  7. 006-虚拟机中centos7实现nat静态ip上网

    1.设置虚拟机网卡VMnet8 2.修改虚拟机参数 (1).点击编辑-->虚拟网络编辑器,如下图设置 (2)nat设置如下[使用默认即可,记住网关.掩码等,非常重要,因为在centos里面要设置 ...

  8. Android学习九---OpenCV4android org.opencv.feature2d

    不管是在识别,配准等应用中,提取图像的特征都是很关键的一环,提取特征是先找出图像的关键点(如角点,边缘点等),然后用描述子来描述这些点,最后整幅图像就可以表示成一个特征向量,特征向量就可以利用在后续识 ...

  9. phpexcel导出带生成图片完美案例

    // 导出exl public function look_down(){ $id = I('get.id'); $m = M ('offer_goods'); $where['offer_id'] ...

  10. Python(函数的参数)

    函数参数的使用 def foo(x,y): pass foo(1,2) 形参:就是变量名 实参:就是变量值 形参:位置形参,默认参数,*args,命名关键字参数,**kwargs 实参: 按位置传值的 ...