子查询可以返回单行结果,可以返回多行结果,也可以不返回结果。

如果子查询未返回任何行,则主查询也不会返回任何结果

(空值)select * from emp where sal > (select sal from emp where empno = 8888);

如果子查询返回单行结果,则为单行子查询,可以在主查

询中对其使用相应的单行记录比较运算符

(正常)select * from emp where sal > (select sal from emp where empno = 7566);

如果子查询返回多行结果,则为多行子查询,此时不允许

对其使用单行记录比较运算符

(多值)select * from emp where sal > (select avg(sal) from emp group by deptno);//非法

子查询中常用方法

1。any即任何一个。如果在where条件中加入>any,意思是大于任何一个,也就是大于最小的

select * from emp t

where t.sal>

any(select sal from hhgy.emp where deptno=30)

2。some即一些。和any的用法基本相同。用any的地方都可以用some代替。不过some大多用在=操作中。表示等于所选集合中的任何一个。当然any也可以用于=操作中,效果和some相同。

select * from emp t

where t.sal=

some(select sal from hhgy.emp where deptno=30)

3。all即所有。如果在where条件中加入>all,意思是大于每一个,也就是大于最大的。

select * from emp t

where t.sal>

all(select sal from hhgy.emp where deptno=30)

4。In

select * from emp t

where t.deptno in(30,40)

5。exists

select * from hhgy.emp where exists(select * from hhgy.emp where deptno=30)

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

如:

select 1 from dual where null in (0,1,2,null)

为空

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.y;

相对的

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再对内表进行查询。

例如:表A(小表),表B(大表)
1:
select * from A where cc in (select cc from B)

效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc)

效率高,用到了B表上cc列的索引。

相反的
2:
select * from B where cc in (select cc from A)

效率高,用到了B表上cc列的索引;
select * from B where exists(select cc from A where cc=B.cc)

效率低,用到了A表上cc列的索引。

from http://www.cnblogs.com/Johnny_Z/archive/2010/11/07/1870939.html

带in的关联子查询是多余的,因为in子句和子查询中相关的操作的功能是一样的。如:
select staff_name from staff_member where staff_id in
(select staff_id from staff_func where staff_member.staff_id=staff_func.staff_id);

为非关联子查询指定exists子句是不适当的,因为这样会产生笛卡乘积。如: 
select staff_name from staff_member where staff_id 
exists (select staff_id from staff_func);

not in 和not exists

如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。
所以无论哪个表大,用not exists都比not in要快。

尽量不要使用not in子句。使用minus 子句都比not in 子句快,虽然使用minus子句要进行两次查询: 
select staff_name from staff_member where staff_id in (select staff_id from staff_member minus select staff_id from staff_func where func_id like '81%');

in 与 "=" 的区别

select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'

的结果是相同的。

转载于:https://my.oschina.net/liangzhenghui/blog/484846

Oracle 子查询相关推荐

  1. oracle做子查询注意事项,Oracle子查询详解

    Oracle子查询详解,根据查询的结果(内部嵌套查询的结果)把子查询的类型分为单行子查询与多行子查询, 子查询概念 :当一个查询的结果是另一个查询的条件时,,称之为子查询. 使用子查询注意事项: 子查 ...

  2. oracle 语句 子查询,Oracle子查询

    在本教程中,您将了解有助于构建更多可读查询的Oracle子查询,并可在不使用复杂联接或联合的情况下编写查询. Oracle子查询简介 子查询是嵌套在另一个语句(如SELECT,INSERT,UPDAT ...

  3. oracle 查询 ppt,oracle子查询.ppt

    <oracle子查询.ppt>由会员分享,可在线阅读,更多相关<oracle子查询.ppt(26页珍藏版)>请在人人文库网上搜索. 1.子查询,目标,通过本章学习,您将可以: ...

  4. oracle之子查询_,Oracle子查询详解

    Oracle子查询详解,根据查询的结果(内部嵌套查询的结果)把子查询的类型分为单行子查询与多行子查询, 子查询概念 :当一个查询的结果是另一个查询的条件时,,称之为子查询. 使用子查询注意事项: 子查 ...

  5. oracle查询前几名,Oracle子查询前1名的结果(Oracle subquery top 1 result)

    Oracle子查询前1名的结果(Oracle subquery top 1 result) 我想为b的每个唯一值得到最高的1行,最小值为c的那个特定值. 即使可以有超过1行具有相同的最小值(只需选择第 ...

  6. oracle子查询不减少数据,Oracle性能优化-子查询到特殊问题

    编辑手记:前面我们介绍常用的子查询优化方法,但总有一些情况时在规律之外.谨慎处理方能不掉坑. 前文回顾: 作者简介:韩锋 精通包括Oracle.MySQL.informix等多种关系型数据库,有丰富的 ...

  7. 怎样学好Oracle子查询,Oracle学习(六):子查询

    Oracle学习(6):子查询 子查询 为何要用子查询 SQL> --查询工资比SCOTT高的员工信息 SQL> --1. 知道SCOTT的工资 SQL> select sal fr ...

  8. oracle复杂的子查询,Oracle 子查询(复杂select语句)

    在执行数据操作时,如果某个操作需要依赖于另外一个 select语句的查询结果,那么就可以把 select 语句迁入到该操作语句中,这样就形成了一个子查询.实际应用中,表与表之间相互关联,相互依存,这样 ...

  9. Oracle子查询中含group by 和order by,排序字段为聚合列的别名+数值函数,外层count统计出错

    该问题猜测是个bug,19c版本执行结果正常,11g版本错误 建议:如果子查询中有group by 和order by,排序字段还需用数值函数处理,避免直接用别名 Oracle版本:11g 原始SQL ...

  10. pg、mysql、oracle子查询兼容性对比

    背景: 今天在查看mysql数据库一条语句的执行计划时,提示子查询需要加别名,于是对pg.oracle都做了一个测试,对比一下三种数据库的区别. 数据库版本: pg11.6.mysql5.7.29.o ...

最新文章

  1. 在AD中批量添加多个用户帐号
  2. class priority_queue 简单介绍
  3. python递归实现_Python-递归实现
  4. window.showModalDialog乱码(完美)解决方案
  5. ci 页面php代码,Cicool v3.1.0 - PHP页面、表单、API、CRUD生成器
  6. 【优化算法】孪生支持向量机(TWSVM)【含Matlab源码 1257期】
  7. hex文件分析+Qt5制作Hex文件转Bin文件的工具(含源码+工具下载)
  8. 饿了么UI框架表单验证
  9. 微信 openid 变吗?
  10. 如何查看电脑操作系统及系统类型
  11. css用网络图片做背景图片,css 网页背景图片 怎样用CSS实现大背景网页效果
  12. 斯坦福大学计算机科学专业硕士排名,斯坦福大学计算机系统研究生排名关键的都看过来...
  13. 图片批量转换成pdf
  14. gwo算法matlab源代码,智能优化算法应用:基于GWO优化BP神经网络 - 附代码
  15. 常见的爬虫error以及解决方法
  16. 浅析深度学习中优化方法
  17. 1-计算机系统概述(CO)
  18. 【运维面试】面试官:你们公司的docker主要用来做啥?
  19. java list stream avg_使用jdk8的Stream来获取list集合的最小值、最大值、总和、平均数...
  20. testDirector如何对软件测试过程进行管理

热门文章

  1. Create a PCL visualizer in Qt with QtDesigner
  2. php组合设计模式(composite pattern)
  3. Codeforces 494E. Sharti
  4. 098 Validate Binary Search Tree 验证二叉搜索树
  5. SpringMVC+ZTree实现树形菜单权限配置
  6. [POI2008] Poc (原名 Trians) Treap+Hash
  7. Codeforces 235B Let's Play Osu!
  8. spring bean中scope=prototype“的作用
  9. 掌握 Ajax,第 8 部分: 在请求和响应中使用 XML
  10. Matlab练习:timer(2)