1. 程式人生 > >31、分頁實現——資料庫的分頁

31、分頁實現——資料庫的分頁

學習目標:

1、掌握資料庫分頁演算法

2、掌握不同資料庫之間分頁演算法的不同點

學習過程:

今天的另外一個重要內容就是分頁顯示列表。現在我們在頁面上面看到的使用者列表都是全部資訊,資訊量少當然沒有問題,但是一般資料裡都會幾百或者上萬條,每次都全部顯示是不可能的,所以我們必須分頁顯示。

分頁一般有兩種實現方式,其一、先把所有的資訊查詢出來儲存在web伺服器中,然後在展示的時候再部分展示。其二、在資料庫就做好分頁查詢,然後展示就只會展示到查詢出來的結果。第一種方法對資料庫壓力比較少,不用每次分頁都查詢資料庫,但是不適合資料量很大的時候,因為一次查詢上萬資料儲存在web伺服器中不現實。所以一般我們會使用第二種方式。當然也有一些結合這兩種方式的分頁,先查詢幾頁的資料,如果需要查詢後面的資料時再查詢資料庫,這樣當然是最高效的方法。這裡我們學習的是第二種方式,就是先從資料庫開始分頁查詢資料。

麻煩的是不同的資料庫的分頁查詢是不同的,所以我們必須分開進行學習

一、mysql的分頁演算法

mysql的分頁演算法最簡單,就是使用limit關鍵字即可。

Mysql的分頁sql使用在sql語句末端 + limit (起始位置),查詢的數量,

如:select * from table where ... limit 起始位置,查詢的數量(pageSize);

比如我們查詢前10條的資料,如下面所示:

select * from tb_user limit 0,10

二、sql servlet的分頁演算法

sql server的分頁演算法也比較簡單,示例如下:

1、分頁方案一:(利用Not In和SELECT TOP分頁)

如: select top 頁大小[pagesize] * from  table where ( id not in(select top 頁大小*當前頁數 id from table order by  id)) order by id。

2、 分頁方案二:(利用ID大於多少和SELECT TOP分頁)

     select top 頁大小[pagesize] * from table where (id >(select max(id) from (select top 頁大小*當前頁數 id  from table order by id) as t)) order by id。 

三、oracle的分頁演算法

oracle分頁演算法最為複雜,實現方法也很多

1、按ROWNUM來分【三層】

select * from(select t.*,rownum rn from(select * from 【table】 order by 【id】 desc) t where  rownum<=10) where rn>0 

10是終止位,0起始位,rownum是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是2。

2、按分析函式來分【兩層】

select * from (select t.*,row_number() over(order by cid desc) rk from 【table】t) where rk<10000 and rk>9980;

3、根據ROWID來分【四層】

select * from 【table】where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid from 【table】order by cid desc) where rownum<10000) where rn>9980) order by cid desc;

rowid是一個偽列,是用來確保表中行的唯一性,它並不能指示出行的物理位置,但可以用來定位行。 利用rowid是訪問表中一行的最快方式。 

比如使用oracle實現對tb_user的分頁查詢

select * from(select t.*,rownum rn from(select * from tb_user ) t where  rownum<=10) where rn>0