在sql server中: 
select top 10 from users;而在oracle上网搜到的是:
select * from (select * from users order by userid desc) where rownum<=5;
或select * from users where rownum<=5 order by userid desc;为什么在from后面可以写select语句啊, 哪位高手解释一下原理? from后面不是接表名吗?  
以上两种查询有什么区别? 分别有在什么场合?

解决方案 »

  1.   

    from 后面跟select是子查询,用的很多,尤其是类似于TOT,或者多表关联查询你这两句出来的结果有区别
    假设数据
    userid
    1
    3
    2
    8
    6
    7
    9
    5
    4第一句出来的结果是
    userid
    9
    8
    7
    6
    5
    第二句出来的结果是
    8
    6
    3
    2
    1说明下,rownum可以看作个隐藏的字段,是当前显示的行号,第一句是先降序后,再取rownum的前五位
    原始数据
    userid rownum
    1       1
    3       2
    2       3
    8       4
    6       5
    7       6
    9       7
    5       8
    4       9
    先降序后就变成了
    userid rownum
    9       1
    8       2
    7       3
    6       4
    5       5
    4       6
    3       7
    2       8
    1       9
    所以出来的结果就是
    userid
    9
    8
    7
    6
    5
    而第二句先取前五位,再排序就是

    userid rownum
    1       1
    3       2
    2       3
    8       4
    6       5
    然后降序
    8
    6
    3
    2
    1
      

  2.   

    两种语法主要用途当然是取最前面的5条纪录,不过目地不同,用法不同如果只是取查询结果的前五位,那就先ROWNUM再ORDER BY
    如果是要取号码最大或者最小的前五位,就必须先ORDER BY再取ROWNUM<=5,要注意的是rownum不能直接跟在order by后面,所以要有子查询
      

  3.   

    为什么在from后面可以写select语句啊
    =================================
    这就是内嵌视图,这里的select 语句可以看作一个视图。
    select   *   from   users   where   rownum <=5   order   by   userid   desc;
    =============================================================
    取排序前的前5条记录(很少用)
    select   *   from   (select   *   from   users   order   by   userid   desc)   where   rownum <=5; 
    ==============================================================================
    取排序后的前5条记录(经常用)
      

  4.   

    关于这两个语句的执行过程和区别Floor All Above都做了分析
    我想说的是from后面为什么一定要跟表呢?不是很像嵌套嘛.如果一张表里可以解决所有查询...
    那自然不会有子查询(Subqueries) 、各种Join,Union之类、各种分析函数(Analytic Functions)等等了 ~可能你习惯了如下的查询:
    --:求供应工程J1零件为红色的供应商号SNOselect distinct sno
    from spj,p
    where spj.jno='j1'
    and spj.pno=p.pno
    and color='红';--事实上下面的则更高效select distinct sno
    from spj
    where jno='j1'
    and exists
    (select *
    from p
    where spj.pno=p.pno and color='红');--或者 select distinct sno
     from spj
     where jno='j1'
     and pno in
     (select pno 
     from p
     where color='红');
      

  5.   

    KAO
    居然是半年多前的贴子,此楼主居然都没结贴,楼主被列为不予回答的行列