1. 程式人生 > >oracle與mysql與sqlserver的分頁

oracle與mysql與sqlserver的分頁

興趣 href 查詢 lac 博文 簡單的 數據庫 分頁查詢 agen

 假設當前是第PageNo頁,每頁有PageSize條記錄,現在分別用Mysql、Oracle和SQL Server分頁查詢student表。

1、Mysql的分頁查詢: 

1 SELECT
2     *
3 FROM
4     student
5 LIMIT (PageNo - 1) * PageSize,PageSize;

理解:(Limit n,m) =>從第n行開始取m條記錄,n從0開始算。

2、Oracel的分頁查詢:

技術分享
 1 SELECT
 2     *
 3 FROM
 4     (
 5         SELECT
 6             ROWNUM rn ,*
 7         FROM
 8             student
 9         WHERE
10             Rownum <= pageNo * pageSize
11     )
12 WHERE
13     rn > (pageNo - 1) * pageSize
技術分享

理解:假設pageNo = 1,pageSize = 10,先從student表取出行號小於等於10的記錄,然後再從這些記錄取出rn大於0的記錄,從而達到分頁目的。ROWNUM從1開始。

3、SQL Server分頁查詢:

技術分享
 1 SELECT
 2     TOP PageSize *
 3 FROM
 4     (
 5         SELECT
 6             ROW_NUMBER () OVER (ORDER BY id ASC) RowNumber ,*
 7         FROM
 8             student
 9     ) A
10 WHERE
11     A.RowNumber > (PageNo - 1) * PageSize
技術分享

理解:假設pageNo = 1,pageSize = 10,先按照student表的id升序排序,rownumber作為行號,然後再取出從第1行開始的10條記錄。

  分頁查詢有的數據庫可能有幾種方式,這裏寫的可能也不是效率最高的查詢方式,但這是我用的最順手的分頁查詢,如果有興趣也可以對其他的分頁查詢的方式研究一下。

另一篇博文:

1、MySQL用limit分頁

/*

* sql:可以是單表的查詢語句,也可以是多表的聯合查詢語句

* firstIndex:其實的索引

* pageSize:每頁顯示的記錄數

*/

select o.* from (sql) o limit firstIndex,pageSize

eg: select * from (select * from Student) limit 0,20; //取1-20條數據

select * from (select * from Student) limit 20,20; //取21-40條數據

第二種 寫法

select * from Student where limit (currentPage-1)*pageSize ,pageSize;

2、Oracle用ROWNUM分頁

/*

* firstIndex:起始索引

* pageSize:每頁顯示的數量

* sql:可以是簡單的單表查詢語句,也可以是復雜的多表聯合查詢語句

*/

select * from(select a.*,ROWNUM rn from(sql) a where ROWNUM<=(firstIndex+pageSize)) where rn>firstIndex

eg: select * from(select a.*,ROWNUM rn from(select * from Student order by id asc) a where ROWNUM<=20) where rn>0 // 取1-20條數據

select * from(select a.*,ROWNUM rn from(select * from Student order by id asc) a where ROWNUM<=(20+20)) where rn>20 // 取21-40條數據

第二種寫法

select * from ( select rownum rn,t.* from Student t where rownum <= currentPage*pageSize ) where rownum > (currentPage -1)*pageSize;

3、SqlServer用top分頁

/*

* firstIndex:起始索引

* pageSize:每頁顯示的數量

* orderColumn:排序的字段名

* sql:可以是簡單的單表查詢語句,也可以是復雜的多表聯合查詢語句

*/

select top pageSize o.* from (select row_number() over(order by orderColumn) as rownumber,* from(sql)) as o where rownumber>firstIndex;

eg: select top 20 o.* from (select row_number() over(order by id asc) as rownumber,* from(select * from Student)) as o where rownumber>0; // 取1-20條數據

第二種寫法

select top pageSize * from Student where id not in (select top (currentPage-1)*pageSize id from Student) ;

oracle與mysql與sqlserver的分頁