select * from(select rownum myno,a.* from (select * from emp order by sal desc) a) b where myno>=5 and myno<=10;
以上的语句由内到外划分可分为3部分:
1.select * from emp order by sal desc
这条查询语句是为其查询结果排序的,这个相当容易理解,再次不多讲解。
2.select rownum myno,a.* from (select * from emp order by sal desc) a
这条查询语句将第一条查询语句作为子查询,可以将第一条语句的查询结果作为一个临时表,并且别名为a。这张临时表中的记录与原来的emp表相同,只是全部排序过。
本查询语句的查询结果就是 rownum myno 和 a.*.
rownum myno 就是每条记录系统自动给赋予的rownum,读到这里有的朋友会问:为什么要给他起个别名呢? 答案是:不得不起,不然后面的业务没法开展。而且我们之所以能实现TOP N的查询第二种的实现最大的功臣就是这个别名了,继续往下看你就会明白。
a.*就好理解了,指的就是a表的所有内容
3.select * from(select rownum myno,a.* from (select * from emp order by sal desc) a) b where myno>=5 and myno<=10;
这条语句就是把第二条的查询结果作为子查询,作为一张临时表进行操作,别名为b.
b表中不仅有排序好的emp表的所有记录,此时它还多了一列实体列myno.通过对myno的操作进行查询就没有什么问题了。因为它是本来就存在的,并不是系统在查询时才临时生成的。你可以把myno理解为b表的固有列。如果在第三次查询时你用的是rowno而不是myno进行操作,那么你还会进入系统临时产生rowno的错误当中。