1. 程式人生 > >Oracle 分頁寫法和rownum

Oracle 分頁寫法和rownum

當我們在Oracle中寫如下SQL,他會查出幾行資料呢?

select * from table where rownum <> 2 order by time desc 

 

字面意思看上去是把序號不等於2的記錄排除,是應該查出不等於2的所有記錄嗎?

當然答案並不是,而是返回按照時間time排序後的第一條記錄;

 

這就與rownum這個偽列的概念有關係了,這一列並不是固定的,它的出現只是給每一行資料標上一個序號,當我們使用上述SQL排除了第二行時,第三行就變成了第二行,繼續排除,最後只剩下一條資料;

 

所以當我們寫:

select * from table where rownum > 10 order by time desc  

這個SQL一條資料都不會返回,因為每次我們都排除了前十條資料,後十條就前移了,直到再也沒有一條資料;

 

所以我們寫分頁的時候,需要在原表基礎上加上序號,然後再在外層使用這個序號分頁;寫法如下:

select * 
from (selet rownum as rn,t1.* from a where ...)
where rn >10