3 回答

TA貢獻1825條經驗 獲得超6個贊
rownum是在你操作數據的時候,會默認生成一個序號從1開始,一直到記錄的總條數,數字不會跳躍。
幾種常見的用法:
select rownum,c1 from t1 where rownum != 10 返回的結果是前9條,原因很簡單,取出來前9條后,跳過第10條,后面的會繼續補充第10條,這樣一直到結尾都還是第十條,不滿足條件,也就是前面的 9條。
select rownum,c1 from t1 where rownum between 1 and 10;查詢的結果是1到10條,從序號1到10的數據。
select rownum,c1 from t1 where rownum between 2 and 10;查詢結果為空,因為跳過第一條,下一條記錄繼續rownum為1.一直到數據結束也還是1.也就不存在從2開始的數據。

TA貢獻1847條經驗 獲得超7個贊
在我說什么時候產生的之前,我想說一下SELECT這個查詢語句的執行順序問題:
語法是:
select * from table_name
where conditons1
group by some_column
having conditions2
order by some_column;
執行時是這樣的:先從表中查詢出所有的數據,然后conditions1中篩選出符合條件的數據,然后對數據進行分組,having是對分組后的數據進行篩選,最后進行排序,不過聚合函數與group by一起出現時,聚合函數會后執行.
明白這個之后,rownum這個偽列就不可能會在where之后出現,所以不管查詢有什么條件,在完成
select * from table_name這個時候,它就出現了,就會在表的每一行上按順序加上rownum.
比如你說的這個查詢如果想按順序出現rownum應該這樣寫:
select a.*,rownum a_rownum from(
select * from test group by a.sysid
) a;
當然了里面的子查詢要正確;
如果說你想對test表中的數據查詢出來之后,按SYSID這一列進行排序后查詢3到5條數據,類似于小數據量(千萬條以內)的先排序后分頁:語句可以這樣寫
select * from (
select a.*,rownum t_rownum from (
select * from test order by sysid
)
) where t_rownum between 3 and 5;
總之就是說:select a.* ,rownum a_rownum from table_name a時就會在列上按順序加上rownum.
添加回答
舉報