在查询的时候经常遇见这样的问题,即----查询数据库中前多少条的记录,那么这个是怎么实现的呢?
这里我们要用到ROWNUM,也就是伪列。
ROWNUM是Oracle从8开始提供的一个伪列,是把SQL出来的结果进行编号,始终从1开始,常见的用途就是用来分页输出。
比如下面例子:
1.
SELECT name FROM student WHERE ROWNUM<=5
这条语句就是输出student表中前5个学生姓名,在这里用途上类似于sql sever的top,不过rownum对于指定区间的输出应该说更好用。
2.
SELECT name FROM (SELECT s.*, ROWNUM rn FROM student s) WHERE rn >= 5 AND rn <= 10
这条语句即是输出第5到第10条纪录,这里之所以用rownum rn,是把rownum转成实例,因为rownum本身只能用 <=的比较方式,只有转成实列,这样就可做 >=的比较了。
3.
在实际用途中,常常会要求取最近的几条纪录,这就需要先对纪录进行排序后再取 rownum <=
一般常见的语句有:
(1)
SELECT name
FROM (SELECT
FROM student s
ORDER BY order_date DESC)
WHERE ROWNUM <= 10
(2)
SELECT
FROM student s
WHERE ROWNUM <= 10
ORDER BY order_date DESC
这两种语句都有一定的道理,之所以出现这种情况,主要还是因为查询效率的不同。前面条语句,是要进行全表扫描后再排序,然后再取10条纪录,后一条语句则不会全表扫描,只会取出10条纪录,很明显后条语句的效率会高许多。
那为什么出现这种情况呢呢,那就在于在执行顺序上争议,是先执行排序再查询,还是先查询再排序呢?对于此语句,普遍的认为执行顺序是先取10条纪录再排序的。所以第二条语句在此题目中应该是错误的。但实际上并非如此,此语句的执行顺序和order by的字段有关系,如果你order by 的字段是PK(主键),则是先排序,再取10条(速度比第一种语句快),而排序字段不是PK 时,是先取10条再排序,此时结果就与要求不一样了,所以第二种写法一定要在排序字段是主键的情况下才能保证结果正确。