1.如果只是為了分頁,可以考慮這種分表,就是表的id是范圍性的,且id是連續的,比如第一張表id是1到10萬,第二張是10萬到20萬,這樣分頁應該沒什麼問題。
2.如果是其他的分表方式,建議用sphinx先建索引,然後查詢分頁,我們公司現在就是這樣乾的
② MySQL、SQLServer、和ORCALE資料庫的分頁查詢sql
ORACLE:
SELECT * FROM (SELECT A.*, ROWNUM RN FROM (
select * from table_name t
) A WHERE ROWNUM <= 200*1 )WHERE RN >0
SELECT * FROM (SELECT A.*, ROWNUM RN FROM (
select * from table_name t
) A WHERE ROWNUM <= 20*20--- bigRowNum
WHERE RN >20*10--- smallRowNum
SQSERVER:
select top 200 from table_name
select top 200 rownum as r from table_name where r>200
MYSQL:
select * from table_name limit 0,200;--startrow,pagesize
select * from table_name limit 200,200;--startrow,pagesize
③ 如何用sql語句 實現分頁查詢
適用於 SQL Server 2000/2005
SELECT TOP 頁大小 *
FROM table1
WHERE id NOT IN
SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id
④ 用SQL語句怎麼實現資料庫分頁
CREATE
PROC
sp_PageView
@tbname
sysname,
--要分頁顯示的表名
@FieldKey
nvarchar(1000),
--用於定位記錄的主鍵(惟一鍵)欄位,可以是逗號分隔的多個欄位
@PageCurrent
int=1,
--要顯示的頁碼
@PageSize
int=10,
--每頁的大小(記錄數)
@FieldShow
nvarchar(1000)='',
--以逗號分隔的要顯示的欄位列表,如果不指定,則顯示所有欄位
@FieldOrder
nvarchar(1000)='',
--以逗號分隔的排序欄位列表,可以指定在欄位後面指定DESC/ASC用於指定排序順序
@Where
nvarchar(1000)='',
--查詢條件
@PageCount
int
OUTPUT
--總頁數
AS
SET
NOCOUNT
ON
--檢查對象是否有效
IF
OBJECT_ID(@tbname)
IS
NULL
BEGIN
RAISERROR(N'對象"%s"不存在',1,16,@tbname)
RETURN
END
IF
OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
AND
OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
AND
OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
RAISERROR(N'"%s"不是表、視圖或者表值函數',1,16,@tbname)
RETURN
END
--分頁欄位檢查
IF
ISNULL(@FieldKey,N'')=''
BEGIN
RAISERROR(N'分頁處理需要主鍵(或者惟一鍵)',1,16)
RETURN
END
--其他參數檢查及規范
IF
ISNULL(@PageCurrent,0)<1
SET
@PageCurrent=1
IF
ISNULL(@PageSize,0)<1
SET
@PageSize=10
IF
ISNULL(@FieldShow,N'')=N''
SET
@FieldShow=N'*'
IF
ISNULL(@FieldOrder,N'')=N''
SET
@FieldOrder=N''
ELSE
SET
@FieldOrder=N'ORDER
BY
'+LTRIM(@FieldOrder)
IF
ISNULL(@Where,N'')=N''
SET
@Where=N''
ELSE
SET
@Where=N'WHERE
('+@Where+N')'
--如果@PageCount為NULL值,則計算總頁數(這樣設計可以只在第一次計算總頁數,以後調用時,把總頁數傳回給存儲過程,避免再次計算總頁數,對於不想計算總頁數的處理而言,可以給@PageCount賦值)
IF
@PageCount
IS
NULL
BEGIN
DECLARE
@sql
nvarchar(4000)
SET
@sql=N'SELECT
@PageCount=COUNT(*)'
+N'
FROM
'+@tbname
+N'
'+@Where
EXEC
sp_executesql
@sql,N'@PageCount
int
OUTPUT',@PageCount
OUTPUT
SET
@PageCount=(@PageCount+@PageSize-1)/@PageSize
END
--計算分頁顯示的TOPN值
DECLARE
@TopN
varchar(20),@TopN1
varchar(20)
SELECT
@TopN=@PageSize,
@TopN1=@PageCurrent*@PageSize
--第一頁直接顯示
IF
@PageCurrent=1
EXEC(N'SELECT
TOP
'+@TopN
+N'
'+@FieldShow
+N'
FROM
'+@tbname
+N'
'+@Where
+N'
'+@FieldOrder)
ELSE
BEGIN
--生成主鍵(惟一鍵)處理條件
DECLARE
@Where1
nvarchar(4000),@s
nvarchar(1000)
SELECT
@Where1=N'',@s=@FieldKey
WHILE
CHARINDEX(N',',@s)>0
SELECT
@s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
@Where1=@Where1
+N'
AND
a.'+LEFT(@s,CHARINDEX(N',',@s)-1)
+N'='+LEFT(@s,CHARINDEX(N',',@s)-1)
SELECT
@Where1=STUFF(@Where1+N'
AND
a.'+@s+N'='+@s,1,5,N''),
@TopN=@TopN1-@PageSize
--執行查詢
EXEC(N'SET
ROWCOUNT
'+@TopN1
+N'
SELECT
'+@FieldKey
+N'
INTO
#
FROM
'+@tbname
+N'
'+@Where
+N'
'+@FieldOrder
+N'
SET
ROWCOUNT
'+@TopN
+N'
DELETE
FROM
#'
+N'
SELECT
'+@FieldShow
+N'
FROM
'+@tbname
+N'
a
WHERE
EXISTS(SELECT
*
FROM
#
WHERE
'+@Where1
+N')
'+@FieldOrder)
END
⑤ 幾種流行的資料庫SQL分頁
sqlserver分頁
第一種分頁方法
需用到的參數:
pageSize每頁顯示多少條數據
pageNumber頁數從客戶端傳來
totalRecouds表中的總記錄數selectcount(*)from表名
totalPages總頁數
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
pages計算前pages條數據
pages=pageSize*(pageNumber-1)
SQL語句:
selecttoppageSize*from表名whereidnotin(selecttoppagesidfrom表名orderbyid)orderbyid
第二種分頁方法
pageSize每頁顯示多少條數據
pageNumber頁數從客戶端傳來
pages=pageSize*(pageNumber-1)+1
selecttoppageSize*from表名whereid>=(selectmax(id)from(selecttoppagesidfrom表名orderbyidasc)t)
mysql分頁
需用到的參數:
pageSize每頁顯示多少條數據
pageNumber頁數從客戶端傳來
totalRecouds表中的總記錄數selectcount(*)from表名
totalPages總頁數
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
pages起始位置
pages=pageSize*(pageNumber-1)
SQL語句:
select*from表名limitpages,pageSize;
mysql分頁依賴於關鍵字limit它需兩個參數:起始位置和pageSize
起始位置=頁大小*(頁數-1)
起始位置=pageSize*(pageNumber-1)
oracle分頁
pageSize每頁顯示多少條數據
pageNumber頁數從客戶端傳來
totalRecouds表中的總記錄數selectcount(*)from表名
totalPages總頁數
totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1
startPage起始位置
startPage=pageSize*(pageNumber-1)+1
endPage=startPage+pageSize
SQL語句
selecta.*from
(
selectrownumnum,t.*from表名twhere某列=某值orderbyidasc
)a
wherea.num>=startPageanda.num<endPage
db2分頁
intstartPage=1//起始頁
intendPage;//終止頁
intpageSize=5;//頁大小
intpageNumber=1//請求頁
startPage=(pageNumber-1)*pageSize+1
endPage=(startPage+pageSize);
SQL語句
select*from(select欄位1,欄位2,欄位3,欄位4,欄位5,rownumber()over(orderby排序欄位asc)asrowidfrom表名)asawherea.rowid>=startPageANDa.rowid<endPage
access分頁
pageSize每頁顯示多少條數據
pageNumber頁數從客戶端傳來
pages=pageSize*(pageNumber-1)+1
SQL語句
selecttoppageSize*from表名whereid>=(selectmax(id)from(selecttoppagesidfrom表名orderbyidasc)t)
⑥ 幾種常見SQL分頁方式
createtablepagetest
(
idintidentity(1,1)notnull,
col01intnull,
col02nvarchar(50)null,
col03datetimenull
)
--分頁1,notin/top
selecttop50*frompagetest
whereidnotin()
orderbyid
--分頁2,notexists
selecttop50*frompagetest
wherenotexists
(select1from()awherea.id=pagetest.id)
orderbyid
--寫法3,max/top
selecttop50*frompagetest
whereid>(selectmax(id)from()a)
orderbyid
--分頁4,row_number()
selecttop50*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
whererownumber>9900
select*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
whererownumber>9900andrownumber<9951
select*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
--分頁5,在csdn上一帖子看到的,row_number()變體,不基於已有欄位產生記錄序號,先按條件篩選以及排好序,再在結果集上給一常量列用於產生記錄序號
select*
from(
selectrow_number()over(orderbytempColumn)rownumber,*
from(selecttop9950tempColumn=0,*frompagetestwhere1=1orderbyid)a
)b
whererownumber>9900
結論:
1.max/top,ROW_NUMBER()都是比較不錯的分頁方法。相比ROW_NUMBER()只支持sql2005及以上版本,max/top有更好的可移植性,能同時適用於sql2000,access。
2.not exists感覺是要比not in效率高一點點。
3.ROW_NUMBER()的3種不同寫法效率看起來差不多。
4.ROW_NUMBER() 的變體基於這個測試效率實在不好。
⑦ 結合MySQL資料庫,如何實現分頁功能
第一步:我們可以利用$_GET方法獲取某一個參數的值,在用戶點擊上一頁、下一頁、首頁或者末頁時獲取不同的動態參數。第二步:根據MySQL的limit關鍵字,對動態參數進行SQL語句拼接。將定義每頁顯示的數據條數,在limit第一個參數的位置中,根據地址欄參數的動態變化從而實現指定從第幾條數據開始顯示數據。你可以跟著傳智播客老師教給我的步驟試一下,這是我在學習PHP的時候學到的,現在我都工作了,工資12K。
⑧ (JAVA)從資料庫查出所有數據再分頁的方法
給你一個非緩存分頁類的簡單例子吧(Page類可以視作javabean):
/**
* @author Administrator
*
*
* TODO 要更改此生成的類型注釋的模板,請轉至
* 窗口 - 首選項 - Java - 代碼樣式 - 代碼模板
*/
import java.util.*;
public class Pager {
private String PageUrl;
private boolean hasNext;
private boolean hasPrevious;
private String previousPage;
private String nextPage;
private int offset;
private int size;
private int length;
private int pagenumber;
public Pager(int offset,int length, int size, String url){
this.offset=offset;
this.length=length;
this.size=size;
int index=url.indexOf("&pager.offset");
if (index>-1){
this.PageUrl=url.substring(0,index);
}else{
this.PageUrl=url;
}
}
public void setoffset(int offset){
this.offset=offset;
}
public void setPagerUrl(String PagerUrl){
this.PageUrl=PagerUrl;
}
public void setsize(int size){
this.size=size;
}
public void setlength(int length){
this.length=length;
}
public int getoffset(){
return this.offset;
}
public String getPageUrl(){
return this.PageUrl;
}
public boolean gethasNext(){
if((offset+1)*length>=size){
hasNext=false;
}else{
hasNext=true;
}
return hasNext;
}
public boolean gethasPrevious(){
if(offset>=1){
this.hasPrevious=true;
}else{
this.hasPrevious=false;
}
return hasPrevious;
}
public String getpreviousPage(){
this.previousPage="";
if (this.gethasPrevious()){
this.previousPage=this.PageUrl+"&pager.offset="+(offset-1);
}
return previousPage;
}
public String getnextPage(){
this.nextPage="";
if(this.gethasNext()){
this.nextPage=this.PageUrl+"&pager.offset="+(offset+1);
}
return this.nextPage;
}
public int getpagenumber(){
float temppn=(float)size/(float)length;
pagenumber=new Float(temppn).intValue();
if (temppn>pagenumber){
this.pagenumber++;
}
return this.pagenumber;
}
public static ArrayList FindPageList(int offset,int length,List list){
ArrayList alist=new ArrayList();
for(int i=offset*length; i<(offset*length+length)&&i<list.size();i++){
alist.add(list.get(i));
}
return alist;
}
}
具體使用:
1、在servlet初始化這個page
List list=DataUtil.getSpecifiedList();//得到整個數據列表
int offset=0;//便宜量
int length=10;//每頁數據記錄數
String pageOffset=request.getParameter("pager.offset");
if(pageOffset==null||pageOffset.equals("")){
offset=0;
}else{
offset=Integer.parseInt(pageOffset);
}
String Url=request.getRequestURL().toString()+"?"+request.getQueryString();
Pager pager=new Pager(offset,length,list.size(),Url);
List RsList=Pager.FindPageList(offset,length,list);
request.setAttribute("Pager",pager);
request.setAttribute("List",RsList);
RequestDispatcher dispatcher= request.getRequestDispatcher("/UI/someMole/list_display.jsp");
dispatcher.forward(request,response);
2、具體jsp中得到分頁結果,並顯示,並附頁面跳轉部分:
頁面中得到分頁結果
<%
List RpList=(List)request.getAttribute("List");
Pager pager=(Pager)request.getAttribute("Pager");
%>
<%--用for循環把RpList顯示--%>
<!--頁面跳轉代碼,這只是個形式,簡化和改變方式的餘地很大-->
<form name="pageForm"><%if(pager.gethasPrevious()){%><a href="<%= pager.getpreviousPage()%>">prev</a>
<%}%>
<%if( pager.gethasNext()){%><a href="<%=pager.getnextPage()%>">next</a><%}%><%if(pager.getpagenumber()>1) {%>第<select name="pager" onchange="window.location='<%=pager.getPageUrl()%>&pager.offset='+document.pageForm.pager.selectedIndex;"><%for(int i=0;i<pager.getpagenumber();i++){%><option value=<%=i%> <%if(pager.getoffset()==i){ %>selected<%}%>><%=(i+1)%></option><%}%></select>頁<%}%> 共<%=pager.getpagenumber()%>頁</form>
ps:1、2兩部分可以都放在頁面類,不過你好像要MVC,所以給你這個代碼。
是否可以解決您的問題?
⑨ 如何使用sql語句進行分頁操作
利用SQL語句分頁要看你用的什麼資料庫。
Oracle資料庫可以使用ROWNUM或row_number(),例如:Select
*
from
(select
ROWNUM
rn,
t.*
from
table
t)
where
rn
between
11
and
20;
Select
*
from
(select
row_number()
over
(ORDER
BY
col1)
rn,
t.*
from
table
t)
where
rn
between
11
and
20;
SQLServer資料庫可以用Top或者row_number()函數,道理同上。
利用SQL分頁有局限性,就是針對不同的資料庫有不同的寫法,所以通常會在應用程序裡面做分頁通用性比較強。但是對於數據量非常龐大的應用來說,還是用SQL分頁比較適合。
⑩ SQL資料庫分頁原理
要想分頁,首先得做好准備工作。你要先聲明每頁顯示多少條數據,還得獲取當前選擇的是多少頁的頁碼。有了這兩個分頁就好辦了。
sql如下:select top 10 from tableName
where (id not in(select top 20 from tableName order by Id desc)) order by Id desc
每頁顯示的數量:自己定義。
總頁數:數據總條數/每頁顯示的條數
當前頁碼的計算方法:(頁碼-1)*每頁顯示的數量。比如我要瀏覽第3頁的數據,3從客戶端傳送過來後,在後台對頁碼進行處理:(3-1)*每頁顯示的數量(假如是10).算出來後的結果就是20.你在把20以參數注入的方式動態添加到上面那個20那裡就ok了。
sql中的10表示你每頁顯示的數據,這里跟10,就代表每頁顯示10條。(你可以定義一個常量作為每頁顯示的條數)
where中的20表示不包括前面的20條數據,也就是查詢出從第21條到30之間的數據。
不知道我這樣說你是否理解,其實只要理解了sql語句,分頁就很好做了。