MSSQL MySQL 数据库分页(存储过程)

先看看单条 SQL 语句的分页 SQL 吧。 方法1:
适用于 SQL Server 2000/2005
<div class="codetitle"><a style="CURSOR: pointer" data="91204" class="copybut" id="copybut91204" onclick="doCopy('code91204')"> 代码如下:

<div class="codebody" id="code91204">
SELECT TOP 页大小
FROM table1
WHERE id NOT IN
(
SELECT TOP 页大小
(页数-1) id FROM table1 ORDER BY id
)
ORDER BY id

方法2:
适用于 SQL Server 2000/2005
<div class="codetitle"><a style="CURSOR: pointer" data="82918" class="copybut" id="copybut82918" onclick="doCopy('code82918')"> 代码如下:
<div class="codebody" id="code82918">
SELECT TOP 页大小
FROM table1
WHERE id >
(
SELECT ISNULL(MAX(id),0)
FROM
(
SELECT TOP 页大小
(页数-1) id FROM table1 ORDER BY id
) A
)
ORDER BY id

方法3:
适用于 SQL Server 2005
<div class="codetitle"><a style="CURSOR: pointer" data="60892" class="copybut" id="copybut60892" onclick="doCopy('code60892')"> 代码如下:
<div class="codebody" id="code60892">
SELECT TOP 页大小
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,
FROM table1
) A
WHERE RowNumber > 页大小(页数-1)

方法4:
适用于 SQL Server 2005
<div class="codetitle"><a style="CURSOR: pointer" data="413" class="copybut" id="copybut413" onclick="doCopy('code413')"> 代码如下:
<div class="codebody" id="code413">
row_number() 必须制定 order by ,不指定可以如下实现,但不能保证分页结果正确性,因为排序不一定可靠。可能第一次查询记录A在第一页,第二次查询又跑到了第二页。
declare @PageNo int,@pageSize int;
set @PageNo = 2
set @pageSize=20
select
from (
select row_number() over(order by getdate()) rn, from sys.objects)
tb where rn >(@PageNo-1)
@pageSize and rn <=@PageNo@pageSize

还有一种方法就是将排序字段作为变量,通过动态SQL 实现,可以改成存储过程。
<div class="codetitle"><a style="CURSOR: pointer" data="81850" class="copybut" id="copybut81850" onclick="doCopy('code81850')"> 代码如下:<div class="codebody" id="code81850">
declare @PageNo int,@pageSize int;
declare @TableName varchar(128),@OrderColumns varchar(500),@SQL varchar(max);
set @PageNo = 2
set @pageSize=20
set @TableName = 'sys.objects'
set @OrderColumns = 'name ASC,object_id DESC'
set @SQL = 'select
from (
select row_number() over(order by '+@OrderColumns+' ) rn, from ' +@TableName+')tb where rn >'+convert(varchar(50),(@PageNo-1)@pageSize) +' and rn <= '+convert(varchar(50),@PageNo@pageSize)
print @SQL
exec(@SQL)

方法5:(利用SQL的游标存储过程分页)
适用于 SQL Server 2005
<div class="codetitle"><a style="CURSOR: pointer" data="64096" class="copybut" id="copybut64096" onclick="doCopy('code64096')"> 代码如下:<div class="codebody" id="code64096">
create procedure SqlPager
@sqlstr nvarchar(4000),--查询字符串
@currentpage int,--第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int,--P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0
@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off

方法5:(利用MySQL的limit)
适用于 MySQL
mysql中limit的用法详解[数据分页常用]
在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。
<div class="codetitle"><a style="CURSOR: pointer" data="90799" class="copybut" id="copybut90799" onclick="doCopy('code90799')"> 代码如下:<div class="codebody" id="code90799">
select
from table limit [offset,] rows | rows offset offset
limit 子句可以被用于强制 select 语句返回指定的记录数。limit 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初 始记录行的偏移量是 0(而不是 1): 为了与 postgresql 兼容,mysql 也支持句法: limit # offset #。
mysql> select from table limit 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> select
from table limit 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> select from table limit 5; //检索前 5 个记录行
//换句话说,limit n 等价于 limit 0,n。
1. select
from tablename <条件语句> limit 100,15
从100条记录后开始取15条 (实际取取的是第101-115条数据)
2. select from tablename <条件语句> limit 100,-1
从第100条后开始-最后一条的记录
3. select
from tablename <条件语句> limit 15
相当于limit 0,15 .查询结果取前15条数据
说明,页大小:每页的行数;页数:第几页。使用时,请把"页大小"和"页大小*(页数-1)"替换成数字。

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。 通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

数据库分页

相关推荐


本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlalche...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中,相信很多人在sqlmap之osshell怎么使用问题上存在疑惑,小编查阅了各式资料,整理出
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册表读取等system。是mssql的最高权限db权限:文件管理,数据库操作等 users-administratorspublic权限:数据库操作 guest-users2、sql server注入执行命令查
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看实际数据库中发生了什么事情,有必要定期进行查询优化和索引否则会影响我们后期的SQL的查询速度。那么针对这样的问题我们必须要知道SQL执行的计划,在本文中winwin7小编给大家分享下SQL执
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点应用非常广泛。不过在使用中,我们会遇到非常多的错误,面对这么庞大的数据库环境,当然会有精确的错误代码的对照季,下面小编分享的
SQL Server本地账户无法登陆出现错误提示:error:40-Could not open a connenction to SQL Server的问题很常见,对于初学者来说可能不知道如何解决,一起来看看下面的解决方案。解决步骤如下:1、这种情况需要开启 SQL Server service
微软推出的SQL2008是一款非常好用的数据库软件,它稳定、功能强大,为众多企业提供了最佳的数据库解决方案,那么我们如何在Windows中安装它呢,一些朋友对SQL Server 2008的安装过程还不是很熟悉,下面就一起来看看SQL Server 2008详细安装图解...
本页概要如果您使用的是 SQL Server 2005备份和还原Sp_detach_db 和 Sp_attach_db 存储过程关于排序规则的说明导入和导出数据(在 SQL Server 数据库之间复
DBCC CHECKIDENT 检查指定表的当前标识值,如有必要,还对标识值进行更正。 语法 DBCC CHECKIDENT ( &#39;table_name&#39; [ , { NORESEED
这里对 SQL Server 字符串函数进行分门别类地列出,便于查阅和记忆,相信大家都在其它方面有高深的编程基础,从字面上来说大家都知道这些函数的意义,就不对这些函数作过多的解释了,主要谈些经验,具体
查询及删除重复记录的方法 1、查找表(people)中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select*frompeoplewherepeopleIdin(selectpe
微软发SQL Server 2008第二个CTP预览版from: http://news.csdn.net/n/20070807/107158.html8月7日消息,微软公司本周发布了SQL Serv
症状当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题。SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤。本文介绍了如何解决孤立用户问题。更多信息虽然术
当登录SQL Server 2005时可能碰到错误: &#39;No Process is on the Other End of the Pipe&#39;。解决方法:(1)Open up SQL
概要本文描述如何映射标准登录和集成登录来解决在运行 SQL Server 的服务器之间移动数据库时的权限问题。更多信息当您将数据库从一个运行 SQL Server 的服务器移到另一个运行 SQL Se
----------------------------------------问题:该用户与可信的SQL SERVER 连接无关联使用sa用户或自建用户使用“SQL SERVER 身份认证”连接数据
更新日期: 2007 年 5 月 20 日 使用下表可以确定各种版本的 Microsoft SQL Server 2005 支持哪些功能。有关 SQL Server 2005 Enterprise E
当从Excel导入数据到Sql Sever中,可能会出现以下问题:&#xD;&#xA;对于指定的缓冲区大小而言,源列的数据太大