oracle的sql語句的排序和分頁

2021-08-11 14:42:05 字數 1288 閱讀 5349

一、排序

在使用select語句查詢資料時,有時候查詢出來的資料會不一樣。應實際需求,一般都會在selec語句後面加上order by "欄位名",因為oracle在查詢並不是按照主鍵或有預設的排序,通過資料庫查詢,rowid這個是每個查詢結果的唯一標識,查詢時,都會生成乙個rowid,根據這個rowid順序展示資料。當然,正常在不加order by "欄位名"時,也許每次查詢的資料發現並沒有隨機,但是這個只是巧合。

如果存在查詢資料需要每次都要有不同的順序,可以select語句加上order by dbms_random.value(),這樣在查詢的資料每次都會不一樣。這個要看實際業務需求。

二、分頁

其次oracle在實現分頁的時候並不能像mysql的直接使用關鍵字limit就行,oracle就需要用到rownum。分頁查詢資料時,需要查詢出rownum,通過對rownum進行分頁操作。

如下:使用select t.*,rownum from table_name查詢出結果,正常的分頁就是按照每頁顯示條數(pagesize)和當前頁數(pagenum)計算分頁資料,所以這裡可以這樣寫:

select t.*,rownum from table_name where rownum >(pagesize * (pagenum - 1)) and rownum <((pagesize * (pagenum - 1) + pagesize));

但是出問題了,這樣寫當pagenum等於1時,可以查詢出資料,更改pagenum時就查詢不出來資料了,所以這樣的寫法是錯誤的。

經過修改後:

select t2.* from (select t1.*,rownum rn from table_name t1 where rownum < ((pagesize * (pagenum - 1) + pagesize)) t2 where rn>(pagesize * (pagenum - 1));

這樣就可以實現分頁查詢了。

但是這裡還是存在問題,就是上面說的,翻頁時可能會出現重複資料。因為這裡的沒有使用order by 關鍵字,所以在oracle查詢會出現隨機性。因此對這個sql再修改下:

select t2.* from (select t1.*,rownum rn from (select * from table_name order by "欄位名") t1

where rownum < ((pagesize * (pagenum - 1) + pagesize)) t2 where rn>(pagesize * (pagenum - 1));

這樣就保證在查詢資料是順序的,然後再對順序的資料進行分頁,這樣就會得到想要的結果了。

oracle 排序分頁 高效sql語句

最好還是利用分析函式row number over partition by col1 order by col2 比如想取出100 150條記錄,按照tname排序 select tname,tabtype from select tname,tabtype,row number over ord...

oracle排序並分頁sql語句

因為oracle沒有mysql的limit的語法,因此排序和分頁不能方便的完成,但是通過三次巢狀查詢可以達到同樣的功能 selecttemp2.from select rownum num,temp1.from select fields we want from table order by fi...

Oracle常用的SQL語句

1 資料庫的操作 1 建立資料庫 語法 create database dbname 2 刪除資料庫 語法 drop database dbname 2 建立資料庫使用者 oracle內部有兩個建好的使用者 system和sys。使用者可直接登入到system使用者以建立其他使用者,system是系...