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存成單獨的一列,再進行查詢。