Oracle基礎知識:偽列rownum,偽列就像表中的列一樣,但是在表中並不存儲。偽列只能查詢,不能進行增刪改操作。
在查詢的結果集中,ROWNUM為結果集中每一行標識一個行號,第一行返回1,第二行返回2,以此類推。通過ROWNUM偽列可以限制查詢結果集中返回的行數。
ROWNUM與ROWID不同,ROWID是插入記錄時生成,ROWNUM是查詢數據時生成。ROWID標識的是行的物理地址。ROWNUM標識的是查詢結果中的行的次序。
案例4:查詢出員工表中前5名員工的姓名,工作,工資。
代碼演示:ROWNUM
SQL> SELECT ROWNUM,ENAME,JOB,SAL FROM EMP WHERE ROWNUM<=5;
|
案例5:查詢出工資最高的前5名員工的姓名、工資和工資。
案例分析
“工資最高的前5名”需要先降序排序,再取前5名,但是生成ROWNUM操作比排序要早,排序時已經連同ROWNUM一起排序了,因此不能直接在案例1的語句中直接加上Order by就行,而是需要對排序的結果重新做二次查詢,產生新的ROWNUM才能作為查詢的條件依據。
代碼演示:ROWNUM應用
SQL> SELECT ROWNUM,T.* FROM ① 2 (SELECT ENAME,JOB,SAL 3 FROM EMP ORDER BY SAL DESC) T ② 4 WHERE ROWNUM<=5 5 /
|
代碼解析:
① T是子查詢②的別名,這里的ROWNUM是第二次查詢后的ROWNUM。
案例6:查詢出表EMP中第5條到第10條之間的記錄。
案例分析
這是分頁的應用。在查詢條件中,如果查詢條件中ROWNUM大於某一正整數,則不返還任何結果。
代碼演示:ROWNUM分頁
SQL> SELECT * FROM 2 (SELECT ROWNUM R,ENAME,JOB,SAL ① 3 FROM EMP WHERE ROWNUM<=10) ② 4 WHERE R>5 ③ 5 /
|
代碼解析:
① 內部查詢中得到ROWNUM 並且用別名R記錄,供外層條件③使用。
② 內部查詢的ROWNUM,與外出的ROWNUM列是平等的兩列。
③ 使用的R是內層產生的ROWNUM,在外層看來,內層查詢的ROWNUM是正常的一列。
來源:Oracle培訓