1>exists 和in 为什么前者的性能高呢?它们之间有什么区别呢?
   2>返回4-7行记录
方案一:
select * from (
select id,name,rownum r from table_ora 
where rownum <8)
where r>3
方案二:
select * from
(select id,name,rownum r from
(select id,name from table_ora order by id) 
where rownum <8)
where r>3

解决方案 »

  1.   

    1、有点小错误,只能说exists大部分情况下比IN效率高,特别是在一个大表中查找时,因为机制不一样,EXISTS找到匹配纪录就返回
    2、如果ID是主键的话,两条语句返回的结果是一样,不是的话,结果会不一样
      

  2.   

    经常有人说exists比in效率高,
    实际上这个结论只在部分情况下成立
      

  3.   

    确实如此,exists在大表效率一般会高于In.
    对于第二个问题,认为方案一比较合适
      

  4.   

    不知道lz看的是什么书,个人感觉给的两个sql返回的结果不一样的几率比较大
      

  5.   

         达内老师给发的一些PDF
      

  6.   

    第二题主要看原始需求是什么
    比如说要求按ID排序的第四到第八条
    则此情况下,如果ID是主键的话,两种写法都正确
    如果ID不是主键的话,则只能用第二种方案
    如果不是按ID的话,则无法说谁对谁错
      

  7.   

         我有点不明白in 到exists 怎么转换,等下
      

  8.   

    其实从英文意思就能看出来
    in是判断是否被包含,需要把全表都检索一遍,例:select * from a where col in(select col from b where ...)
    exists 是判断是否存在,只要找到符合条件的的结果就返回,例:select * from a where exists (select count(1) from b where col=a.col)
      

  9.   

         exists 是先执行父查询再执行子查询,in相反
         我认为应该是先执行子查询再执行父查询要快啊?可以解释下吗?
      

  10.   

        功能是:列出表w_student 中sno =10的记录
         select * from w_student where sno  in(select sno from w_student where sno =101) 
        能否把这里的in替换成exists ?怎么替换啊?   
      

  11.   

    select * from w_student where sno=101
    觉得这样就行
      

  12.   

          如果我一定要用上exists 呢?请问下该怎么写啊?
      

  13.   


    1. 一般情况下exists效率高一点,因为在执行子查询的时候,exists是一碰到满足条件的记录就返回(不需要查找完整个记录集),而in必须查找完整个记录集才进行返回(in类似于执行表的连接查询);但是在两个大表之间的查询in的效率很可能高于exists,具体情况具体分析:)
     select * from w_student where sno in(select sno from w_student where sno =101)
     select * from w_student a where exists (select 1 from w_student b where b.sno = 101 and b.sno = a.sno)
    2. 方案一返回了物理存储顺序上的4-7条
       方案二返回了id排序上的4-7条
      

  14.   

       select * from w_student a where exists (select 1 from w_student b where b.sno = 101 and b.sno = a.sno) 中
    '1'是什么意思啊?