四、oracle子查询

目录

4.1.单行子查询

4.2. TopN 查询

4.3. 分页查询

4.4. exists

4.5. 对于 in 和 exists 的性能区别:


4.1.单行子查询

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

子查询空值/多值问题

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

(空值)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);//非法

 


多行子查询

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

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

select * from emp  where job in (select job from emp where ename= 'MARTIN' or ename = 'SMITH');

 


4.2. TopN 查询

select * from emp where rownum=1 orrownum=2;


4.3. 分页查询

select * from (select rownum no,e.*from  (select * from emp order by saldesc) e where rownum<=5 ) where no>=3; 

select * from  (select rownum no,e.* from(select * from emp order by sal desc) e) where  no>=3 and no<=5;


4.4. exists

EXISTS 的执行流程 

select * from t1 where exists ( selectnull 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


4.5. 对于 in 和 exists 的性能区别:

  如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用 in,反之如果外层的主

查询记录较少,子查询中的表大,又有索引时使用 exists。 

  其实我们区分 in 和 exists 主要是造成了驱动顺序的改变(这是性能变化的关键),如果是 exists

那么以外层表为驱动表,先被访问,如果是 IN,那么先执行子查询,所以我们会以驱动表的快速返

回为目标,那么就会考虑到索引及结果集的关系了 

另外 IN 是不对 NULL 进行处理

如: 

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

为空 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发哥1997

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值