1. 程式人生 > >mysql、sql server 和oracle分頁的實現方法

mysql、sql server 和oracle分頁的實現方法

1分頁
要實現分頁,必須知道 某一頁的 資料 從哪裡開始 到哪裡結束

頁面大小:每頁顯示的資料量

假設每頁顯示10條資料

mysql分頁:
mysql:從0開始計數
0 0 9
1 10 19
2 20 29
n n*10 (n+1)*10-1

結論:
分頁:
第n頁的資料: 第(n-1)10+1條 – 第n10條

MYSQL實現分頁的sql:
limit 開始,多少條
第0頁
select * from student limit 0,10 ;
第1頁
select * from student limit 10,10 ;
第2頁
select * from student limit 20,10 ;
第n頁
select * from student limit n*10,10

mysql的分頁語句:

select * from student limit 頁數*頁面大小,頁面大小

b.oracle分頁:

sqlserver/oracle:從1開始計數
第n頁 開始 結束
1 1 10
2 11 20
3 21 30
n (n-1)10+1 n10

select *from student where sno >=(n-1)10+1 and sno <=n10 ; --此種寫法的前提:必須是Id連續 ,否則 無法滿足每頁顯示10條資料

select rownum,t.*from student t where rownum >=(n-1)10+1 and rownum <=n

10 order by sno;
–1.如果根據sno排序則rownum會混亂(解決方案:分開使用->先只排序,再只查詢rownum) 2.rownum不能查詢>的資料

select s.* from student s order by sno asc;

select rownum, t.* from
(select s.* from student s order by sno asc) t
where rownum >=(n-1)10+1 and rownum <=n10 ; ;

//ORACLE\sqlserver都是從1開始計數: (n-1)10+1 — n10
oracle的分頁查詢語句:
select from
(
select rownum r, t.

from
(select s.* from student s order by sno asc) t 10000
)
where r>=(n-1)10+1 and <=n10 ; 10

優化:

select from
(
select rownum r, t.
from
(select s.* from student s order by sno asc) t
where rownum<=n*10
)
where r>=(n-1)*10+1 ;

select from
(
select rownum r, t.
from
(select s.* from student s order by sno asc) t
where rownum<=頁數*頁面大小
)
where r>=(頁數-1)*頁面大小+1 ;

SQLServer分頁: 3種分頁sql
row_number() over(欄位) ;

sqlserver2003:top --此種分頁SQL存在弊端(如果id值不連續,則不能保證每頁資料量相等)
select top 頁面大小 * from student where id not in
( select top (頁數-1)*頁面大小 id from student order by sno asc )

sqlserver2005之後支援:
select from
(
select row_number() over (sno order by sno asc) as r,
from student

 where r<=n*10 

)
where r>=(n-1)*10+1 and ;

SQLServer此種分頁sql與oralce分頁sql的區別: 1.rownum ,row_number() 2.oracle需要排序(為了排序,單獨寫了一個子查詢),但是在sqlserver 中可以省略該排序的子查詢 因為sqlserver中可以通過over直接排序

sqlserver2012之後支援:
offset fetch next only

select * from student oreder by sno
offset (頁數-1)*頁面大小+1 rows fetch next 頁面大小 rows only ;

(n-1)10+1 — n10

mysql從0開始計數,Oracle/sqlserver 從1開始計數

1
2
3
4
6
8
9
10

11
12

20

21
22

31

分頁實現:
5個變數(屬性)
1.資料總數 100 103 (查資料庫,select count(*)…)
2.頁面大小(每頁顯示的資料條數)20 (使用者自定義)
3.總頁數 (程式自動計算)
總頁數 = 100/20 =資料總數/頁面大小
總頁數 = 103/20 = 資料總數/頁面大小+1
—>
總頁數 = 資料總數%頁面大小==0? 資料總數/頁面大小:資料總數/頁面大小+1 ;

4.當前頁(頁碼) (使用者自定義)
5.當前頁的物件集合(實體類集合):每頁所顯示的所有資料 (10個人資訊)