91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle中的分頁查詢~~~ROWNUM(行號)

發布時間:2020-08-01 10:18:51 來源:網絡 閱讀:864 作者:MChopin 欄目:關系型數據庫

Oracle中的表,除了我們建表時設計的各個字段,其實還有兩個字段(此處只介紹2個),分別是ROWID(行標示符)和ROWNUM(行號)。即使我們使用DESCRIBE命令查看表的結構,也無法看到這兩個列的描述,因為它們其實是只在數據庫內部使用的,所以也通常稱它們為偽列(pseudo column)。
建一個只有兩個字段(id,col)的表。使用describe命令查看表結構,可以看到確實只有建表時的兩個字段。但我們可以查詢的時候,可以查找到偽列的值。

select rowid,rownum,id,col from table;

這個rowid我們一般用不到,Oracle數據庫內部使用它來存儲行的物理位置,是一個18位的數字,采用base-64編碼。而這個rownum,我們正是用它來進行分頁查詢的,它的值,就是表示的該行的行號。
對于分頁查詢,我們只要想辦法可以查詢到從某一起始行到終止行就可以的,分頁的邏輯可以放到程序里面。于是,我們理所當然會想到如下語句查詢第2頁的數據(每頁2條數據,頁碼從1開始,所以起始行的行號為 (頁碼-1)*每頁長度+1=3,終止行的行號為 頁碼*每頁長度=4):

select * from table where rownum>=3 rownum <= 4;

出人意料,沒有任何結果。原因很簡單,Oracle機制就是這樣的:因為第一條數據行號為1,不符合>=3的條件,所以第一行被去掉,之前的第二行變為新的第一行(即這個行號不是寫死的,可以理解為是動態的),如此下去,一直到最后一行,條件始終沒法滿足,所以就一條數據也查不出來。
對癥下藥,要想解決這個問題,我們只要將行號查詢出來生成一個結果集,然后再從這個結果集中,選擇行號大于我們設定的那個值就可以了,上面的分頁查找正確的寫法應該是這樣:

select id,col from(
select rownum rn,u.* from table u) ua
where ua.rn between 3 and 4;

上面的語句還可以優化:雖然不能用">=",但"<="卻可以用。為提高查詢效率,我們可以使用終止行篩選子查詢的結果,SQL如下:

select id,col from(
select rownum rn,u.* from table u where rownum<=4) ua
where ua.rn >= 3;

很多時候,我們并不是盲目的分頁查找的,而是按某一個或多個字段的升序或降序分頁,即包含 order by 語句的分頁查詢,我們先看一下 order by 的查詢結果中rownum是怎樣的:

select rownum,id,col from table order by col;

結果,這時候的行號并不是經過 order by 后結果的增序行號。
但有了上面的嵌套查詢的經驗,這里也可以好好應用一下,怎么做呢:先查找出排序好的結果集,然后應用上面的方法得到最終結果,sql如下:

select id,col from(
select rownum rn,uo.* from
(select * from table order by col) uo
where rownum<=4 ) ua
where ua.rn>=3;

分頁效果的實現,思路有三種:

其一:純JS實現分頁。一次性查詢記錄并加載到html的table中。然后通過選擇性地顯示某些行來達到分頁顯示的目的。這是一種偽分頁,障眼法而已。只能用于數據少的情況下。一旦數據多了,十幾萬條數據加載到html中會變得很慢。而且不實時,一次加載完后數據就寫死在頁面了,若數據庫中有變化,瀏覽器端顯示的仍是上次加載過來的數據。

其二:一次查詢,分批顯示。
就是說,我們可以執行一個數據庫查詢操作,得到結果集rs。然后,通過指針的移動來顯示當前頁面的記錄。這樣,就可以以 rs.absolute(當前頁面號*每頁記錄數)定位到當前頁的第一條記錄,然后通過while循環顯示n條記錄(n為每頁顯示記錄數)。在跳頁時,只需修改currentPage,即可在重定位到下一頁時把當前頁面號改掉,重新定位記錄指針,通過while遍歷顯示n條記錄。與JS選擇性顯示不同,這里是選擇性遍歷。與JS分頁不同的是,這里分頁每次跳頁修改的是遍歷的指針,每次跳頁都要進行一次全面查詢。同樣地,不適合大數據量查詢。這里比JS分頁優化的地方在于——實時性。每次跳頁都會查詢一次數據庫,保證數據的實時性。

其三:在服務端分頁。跳到第n頁才查詢、顯示第n頁內容。要點就是根據客戶端表格的“頁面”計算出數據庫要查詢的當前頁面的第一條記錄的位置。優點:實時性:跳頁才查詢。數據量小:只加載當前頁的記錄進行顯示。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邹平县| 武清区| 饶平县| 汾西县| 饶河县| 景洪市| 郁南县| 库伦旗| 大荔县| 常宁市| 任丘市| 阆中市| 新闻| 张家界市| 苗栗市| 赤壁市| 海晏县| 丰城市| 沐川县| 山丹县| 延庆县| 吉林省| 东明县| 贺州市| 元谋县| 遵义市| 九龙县| 井冈山市| 柘城县| 双峰县| 黄梅县| 安吉县| 清丰县| 泾阳县| 城步| 大理市| 民权县| 陵川县| 嵩明县| 凌源市| 麻江县|