1:找出公司里收入最高的前三名员工:SQL> select rownum, last_name, salary
2 from (select last_name, salary
3 from s_emp
4 order by salary desc)
5 where rownum<=3;ROWNUM LAST_NAME SALARY
---------- ------------------------- ----------
1 Velasquez 4750
2 Ropeburn 2945
3 Nguyen 2897.5注意:请大家分析一下一下语句为什么不对:SQL> select rownum, last_name, salary
2 from s_emp
3 where rownum<=3
4 order by salary desc;ROWNUM LAST_NAME SALARY
---------- ------------------------- ----------
1 Velasquez 4750
3 Nagayama 2660
2 Ngao 2000

解决方案 »

  1.   

    SQL> select rownum, last_name, salary 
    2 from s_emp 
    3 where rownum <=3 取出来的是前三条记录,并一定是收入最高的。
      

  2.   


    确切的说,如果salary 是主键的话,那两个语句都一样,第二个效率高
    如果不是主键的话,那第二个语句的结果就是错的
      

  3.   

    SQL> select rownum, last_name, salary
    2 from s_emp
    3 where rownum <=3
    4 order by salary desc; 
    ------------------------------
    这一句,是先从s_emp抽出前面三条,然后再进行排序
      

  4.   

    order by 和rownum的关系,请参考此贴,和排序的字段是不是主键有很大的关系,保险的作法是先排序再取rownum
    http://topic.csdn.net/u/20080827/17/5962849a-6504-4b4b-8d71-fcf9bf7f9664.html
      

  5.   

    如果salary是主键的话,就是先排序,再取三条
      

  6.   

    说的没错SQL> desc test_a;
    Name Type         Nullable Default Comments 
    ---- ------------ -------- ------- -------- 
    BM   NUMBER(4)    Y                         
    YP   VARCHAR2(10) Y                         
     
    SQL> insert into test_a values(1000,'a');
     
    1 row inserted
     
    SQL> insert into test_a values(2000,'a');
     
    1 row inserted
     
    SQL> insert into test_a values(3000,'a');
     
    1 row inserted
     
    SQL> insert into test_a values(4000,'a');
     
    1 row inserted
     
    SQL> insert into test_a values(5000,'a');
     
    1 row inserted
     
    SQL> insert into test_a values(6000,'a');
     
    1 row insertedSQL> commit;
     
    Commit completeSQL> select * from test_a;
     
       BM YP
    ----- ----------
     1000 a
     2000 a
     3000 a
     4000 a
     5000 a
     6000 a
     
    6 rows selectedSQL> select bm,yp from test_a where rownum<=3 order by bm desc;
     
       BM YP
    ----- ----------
     3000 a
     2000 a
     1000 aSQL> alter table test_a add primary key(bm);
     
    Table altered
     
    SQL>  select bm,yp from test_a where rownum<=3 order by bm desc;
     
       BM YP
    ----- ----------
     6000 a
     5000 a
     4000 a