首页 资讯

sql分页_sql分页的几种方式:全球焦点

发布时间:2023-04-11 17:32:57来源:互联网

SQL分页的几种方法

方法一 使用offset fetch next(2012版本及以上版本才可以使用)

方法二 使用row_number()函数利用row_number() over(order by id desc)函数计算出行数,选定相应的行数返回即可(2005版本以上才可以使用)


(资料图片)

使用存储过程封装

几种常见SQL分页方式

createtablepagetest(idintidentity(1,1)notnull,col01intnull,col02nvarchar(50)null,col03datetimenull)
--分页1,notin/topselecttop50*frompagetestwhereidnotin(selecttop9900idfrompagetestorderbyid)orderbyid--分页2,notexistsselecttop50*frompagetestwherenotexists(select1from(selecttop9900idfrompagetestorderbyid)awherea.id=pagetest.id)orderbyid--写法3,max/topselecttop50*frompagetestwhereid>(selectmax(id)from(selecttop9900idfrompagetestorderbyid)a)orderbyid--分页4,row_number()selecttop50*from(selectrow_number()over(orderbyid)rownumber,*frompagetest)awhererownumber>9900select*from(selectrow_number()over(orderbyid)rownumber,*frompagetest)awhererownumber>9900andrownumber<9951select*from(selectrow_number()over(orderbyid)rownumber,*frompagetest)awhererownumberbetween9901and9950--分页5,在csdn上一帖子看到的,row_number()变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号select*from(selectrow_number()over(orderbytempColumn)rownumber,*from(selecttop9950tempColumn=0,*frompagetestwhere1=1orderbyid)a)bwhererownumber>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() 的变体基于这个测试效率实在不好。

如何使用sql语句进行分页操作?

利用SQL语句分页要看你用的什么数据库。Oracle数据库可以使用ROWNUM或row_number(),例如:Select*from(selectROWNUMrn,t.*fromtablet)wherernbetween11and20;Select*from(selectrow_number()over(ORDERBYcol1)rn,t.*fromtablet)wherernbetween11and20;SQLServer数据库可以用Top或者row_number()函数,道理同上。利用SQL分页有局限性,就是针对不同的数据库有不同的写法,所以通常会在应用程序里面做分页通用性比较强。但是对于数据量非常庞大的应用来说,还是用SQL分页比较适合。

MySQL分页的sql语言怎么写?

1、首先我们建立一个表表的数据,这个表里有25条数据,id从1到25。(下图是部分截图)

2、要分页数据,首先我们假设一页有10条数据,我们可以用mysql的limit关键字来限定返回多少条数据。并且用orderby来排序数据,这里用id来排序。所以第一页的sql可以如图这样写。

3、执行后得到的数据如图,就是id从1到10的前10条数据,因为我们是按id升序来排序的。

4、上面第一页的sql是简化的写法,完整的写法如图,得到的结果和上图的一模一样。代码里limit0,10的意思是从第一条数据开始,取10条数据。(注意的是第一条数据是从0开始的)

5、那么第二页的数据,关键是要知道是从哪一条数据开始,可以用这个公式得到:(页码-1)*每页显示多少条,即(2-1)*10=10,所以sql语句如图,limit10,10。

6、执行后,结果正确,得到id从11到20的10条数据。

7、同理第三页数据的sql如图,
就是limit20,10。

8、查询的结果如图,因为这页只剩下5条数据了,所以只显示5条数据。如果你有更多页的数据,后面的数据只需要按上面的公式,得到从哪行开始,就可以写对应的sql语句了。

用SQL语句怎么实现数据库分页?

CREATEPROCsp_PageView@tbnamesysname,--要分页显示的表名@FieldKeynvarchar(1000),--用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段@PageCurrentint=1,--要显示的页码@PageSizeint=10,--每页的大小(记录数)@FieldShownvarchar(1000)="",--以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段@FieldOrdernvarchar(1000)="",--以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC用于指定排序顺序@Wherenvarchar(1000)="",--查询条件@PageCountintOUTPUT--总页数ASSETNOCOUNTON--检查对象是否有效IFOBJECT_ID(@tbname)ISNULLBEGINRAISERROR(N"对象"%s"不存在",1,16,@tbname)RETURNENDIFOBJECTPROPERTY(OBJECT_ID(@tbname),N"IsTable")=0ANDOBJECTPROPERTY(OBJECT_ID(@tbname),N"IsView")=0ANDOBJECTPROPERTY(OBJECT_ID(@tbname),N"IsTableFunction")=0BEGINRAISERROR(N""%s"不是表、视图或者表值函数",1,16,@tbname)RETURNEND--分页字段检查IFISNULL(@FieldKey,N"")=""BEGINRAISERROR(N"分页处理需要主键(或者惟一键)",1,16)RETURNEND--其他参数检查及规范IFISNULL(@PageCurrent,0)<1SET@PageCurrent=1IFISNULL(@PageSize,0)<1SET@PageSize=10IFISNULL(@FieldShow,N"")=N""SET@FieldShow=N"*"IFISNULL(@FieldOrder,N"")=N""SET@FieldOrder=N""ELSESET@FieldOrder=N"ORDERBY"+LTRIM(@FieldOrder)IFISNULL(@Where,N"")=N""SET@Where=N""ELSESET@Where=N"WHERE("+@Where+N")"--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)IF@PageCountISNULLBEGINDECLARE@sqlnvarchar(4000)SET@sql=N"SELECT@PageCount=COUNT(*)"+N"FROM"+@tbname+N""+@WhereEXECsp_executesql@sql,N"@PageCountintOUTPUT",@PageCountOUTPUTSET@PageCount=(@PageCount+@PageSize-1)/@PageSizeEND--计算分页显示的TOPN值DECLARE@TopNvarchar(20),@TopN1varchar(20)SELECT@TopN=@PageSize,@TopN1=@PageCurrent*@PageSize--第一页直接显示IF@PageCurrent=1EXEC(N"SELECTTOP"+@TopN+N""+@FieldShow+N"FROM"+@tbname+N""+@Where+N""+@FieldOrder)ELSEBEGIN--生成主键(惟一键)处理条件DECLARE@Where1nvarchar(4000),@snvarchar(1000)SELECT@Where1=N"",@s=@FieldKeyWHILECHARINDEX(N",",@s)>0SELECT@s=STUFF(@s,1,CHARINDEX(N",",@s),N""),@Where1=@Where1+N"ANDa."+LEFT(@s,CHARINDEX(N",",@s)-1)+N"="+LEFT(@s,CHARINDEX(N",",@s)-1)SELECT@Where1=STUFF(@Where1+N"ANDa."+@s+N"="+@s,1,5,N""),@TopN=@TopN1-@PageSize--执行查询EXEC(N"SETROWCOUNT"+@TopN1+N"SELECT"+@FieldKey+N"INTO#FROM"+@tbname+N""+@Where+N""+@FieldOrder+N"SETROWCOUNT"+@TopN+N"DELETEFROM#"+N"SELECT"+@FieldShow+N"FROM"+@tbname+N"aWHEREEXISTS(SELECT*FROM#WHERE"+@Where1+N")"+@FieldOrder)END

使用sql语句实现分页查询

使用sql语句在语句末尾添加 limit page,count //意思是 获取从page+1开始的count条记录 例如:select * from checkmoney where phonenumber="18209183861" order by check_start_time desc limit 1,5; 这条语句获取了 checkmoney的第 2条至第6条 记录。
上一篇 下一篇
推荐阅读 more