要實現分頁,必須知道 某一頁的 數據 從哪裏開始 到哪裏結束
頁面大小:每頁顯示的數據量
MYSQL實現分頁的sql:
假設每頁顯示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條 -- 第n*10條
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 頁數*頁面大小,頁面大小
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條數據
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 --- n*10
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個人信息)
List<Student> (查數據庫,分頁sql)