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语句,分页就很好做了。