oracle與mysql與sqlserver的分頁
假設當前是第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的分頁