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. css3动画效果:3 3D动画

    立方体旋转动画效果 css #container{ width: 400px; height: 400px; ; ; -webkit-perspective-origin:50% 225px; per ...

  2. Spring Cloud Zuul实现IP访问控制

    接着上篇文章 https://www.cnblogs.com/mxmbk/p/9569438.html IP访问限制和黑白名单如何做,需要解决以下几个问题: 1.如何识别正常访问和异常访问?(一段时间 ...

  3. x-webkit-speech语音搜索

    如果你没看到语音图标说明你的浏览器不支持x-webkit-speech 换个chrome你会发现输入框的右侧出现语音小图标.

  4. screen命令在freebsd安装和使用

    安装 # cd /usr/ports/sysutils/screen # make install clean 使用 # screen //以下^A表示同按“Ctrl + A”键 # ^A c //C ...

  5. Openstack使用NFS作为后端存储

    续:Openstack块存储cinder安装配置 接上使用ISCSI作为后端存储,使用NFS作为后端存储配置 参考官方文档:https://wiki.openstack.org/wiki/How_to ...

  6. mysqldump迁移说明

    使用mysqldump导出数据, 数据包含单行insert,带字段值 #使用mysqldump备份数据到文件, 主要在每个分片的主上面进行备份,确保数据是最新的. mysqldump -h192. - ...

  7. MongoDB-1:安装和配置

    一.简介 MongoDB一种非关系型数据库(NoSql),是一种强大.灵活.可扩展的数据存储方式,因为MongoDB是文档模型,自由灵活很高,可以让你在开发过程中畅顺无比,对于大数据量.高并发.弱事务 ...

  8. Linux学习笔记(6)磁盘分区(LVM)

    1.逻辑管理技术LVM的概念 1.1 LVM ,逻辑卷管理,以便扩展管理盘符. PV:物理卷 VG:卷组 LV:逻辑卷 PE(physical Extend):物理扩展(默认4M),就是我们逻辑卷管理 ...

  9. 静默安装oracle 11g及参数配置优化详解

    一.安装前准备工作1.修改主机名#vi /etc/hosts   //并添加内网IP地址对应的hostname,如下127.0.0.1           localhost::1           ...

  10. Spring Security教程 ---- 验证码功能的实现

    有三中方法可以实现验证码的功能 第一种是自定义一个filter,放在SpringSecurity过滤器之前,在用户登录的时候会先经过这个filter,然后在这个filter中实现对验证码进行验证的功能 ...