SQL在取数据的时候,可以通过ROWNUM这一伪列获取行号。由于ROWNUM一定是从1开始的,因此,直接在WHERE子句使用
WHERE ROWNUM = 10
是不可取的。如果想要取到第n行数据,有两种方式:
(1)获取前n行,倒序排列,再获取第一行数据
SELECT * FROM ( SELECT * FROM copy_emp WHERE ROWNUM <= 1825574 ORDER BY ROWNUM DESC) WHERE ROWNUM = 1;
(2)获取行号+所有数据,将行号存成一列 rn
SELECT empno, ename, new_sal FROM ( SELECT ROWNUM rn, copy_emp.* FROM copy_emp WHERE ROWNUM <= 1825574) WHERE rn = 1825574;
其中第二种优于第一种,原因是,order by消耗了更多时间。
我构造了一个具有3670016行的数据如下,分别查询第1825574行的数据:
SELECT COUNT(*) FROM copy_emp;
得到的结果如下:
(1)
(2)
因此,当根据行号查询数据时,推荐使用第二种,即将ROWNUM存成单独的一列,再进行查询。