一、排序
在使用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是系...