Oracle之子查询:Top-N问题

学习了SQL子查询,遇到个Top-N问题,即:加入有张工资表(这里使用Oracle SCOTT用户的emp表),需要查找工资最高的3个员工信息,以下列格式输出:

乍眼一看,这很简单啊,对sal进行排序就可以了啊。

select rownum,empno,ename,sal
from emp
order by sal desc;

但是,前面的行号呢?题目只要求输出前三行啊。。。

那这样可不可以呢?

select * from(select rownum,empno,ename,sal
              from emp
              order by sal desc)
where rownum<=3;

结果:

行号不对!只好寻求伟大的度娘。。。

在oracle中有一个:rownum,是一个伪行,表示查询结果的行号
  1. 一旦生成就不会变化(会先按没有排序的时候生成rownum)
  2.rownum ,只能使用<或=,不能使用>或>=与=

明白了,原来,要想使用rownum求得Top-N,就得先排序得出结果,然后再使用rownum

select rownum,empno,ename,sal
from(select empno,ename,sal
     from emp
     order by sal desc)
where rownum<=3;

执行结果:

原文地址:https://www.cnblogs.com/Burgess-Fan/p/6793683.html