当前位置:首页 » 编程语言 » sql分页算法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql分页算法

发布时间: 2022-01-17 21:16:48

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

‘叁’ sql分页的几种写法

几种典型的分页sql,下面例子是每页50条,198*50=9900,取第199页数据。
--写法1,not in/top
select top 50 * from pagetest
where id not in (select top 9900 id from pagetest order by id)
order by id

--写法2,not exists
select top 50 * from pagetest
where not exists
(select 1 from (select top 9900 id from pagetest order by id)a where a.id=pagetest.id)
order by id

--写法3,max/top
select top 50 * from pagetest
where id>(select max(id) from (select top 9900 id from pagetest order by id)a)
order by id

--写法4,row_number()
select top 50 * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900

select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900 and rownumber<9951

select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber between 9901 and 9950

--写法5,在csdn上一帖子看到的,row_number() 变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号
select * from (
select row_number()over(order by tempColumn)rownumber,*
from (select top 9950 tempColumn=0,* from pagetest where 1=1 order by id)a
)b
where rownumber>9900

‘肆’ sql语句分页详解

这就是一个简单的查询语句,一个语句分为select 与 from 之间的部分,from 与 where之间的部分 和where 后边条件部分。
from 后跟的是表,
你说的a,b就是表名。只不过 是把(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)查询的结果作为表a了。

‘伍’ 用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 表中的总记录数 select count (*) from 表名 totalPages 总页数 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 pages 计算前pages 条数据 pages= pageSize*(pageNumber-1) SQL语句: select top pageSize * from 表名 where id not in (select top pages id from 表名 order by id) order by id 第二种分页方法 pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 pages=pageSize*(pageNumber-1)+1 select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) t ) mysql分页 需用到的参数: pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 totalRecouds 表中的总记录数 select count (*) from 表名 totalPages 总页数 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 pages 起始位置 pages= pageSize*(pageNumber-1) SQL语句: select * from 表名 limit pages, pageSize; mysql 分页依赖于关键字 limit 它需两个参数:起始位置和pageSize 起始位置=页大小*(页数-1) 起始位置=pageSize*(pageNumber -1) oracle分页 pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 totalRecouds 表中的总记录数 select count (*) from 表名 totalPages 总页数 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 startPage 起始位置 startPage= pageSize*(pageNumber-1)+1 endPage=startPage+pageSize SQL语句 select a.* from ( select rownum num ,t.* from 表名 t where 某列=某值 order by id asc )a where a.num>=startPage and a.num<endPage db2分页 int startPage=1 //起始页 int endPage; //终止页 int pageSize=5; //页大小 int pageNumber=1 //请求页 startPage=(pageNumber-1)*pageSize+1 endPage=(startPage+pageSize); SQL语句 select * from (select 字段1,字段2,字段3,字段4,字段5,rownumber() over(order by 排序字段 asc ) as rowid from 表名 )as a where a.rowid >= startPage AND a.rowid <endPage access分页 pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 pages=pageSize*(pageNumber-1)+1 SQL语句 select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) t )

‘柒’ 一条sql语句实现分页查询,且能返回记录总数

select *,(select count(*) from t1) from(
select top 2 * from(
select top 4 * from(
select * from t1
)as ttb0 order by id
)as ttb1 order by id desc
)as ttb2 order by id
在select后加个子查询就OK了,

‘捌’ 如何用sql语句 实现分页查询

分页:一般会把当前页通过get方式传递,PHP通过$_GET['page']接收。

查询:可以从当前乘以每页显示数通过limit来实现分页效果。

//每页显示条数
$pageSize=10;
//当前页
$_GET['page']?$page=1:$page=$_GET['page'];
//开始查询位置
$seat=$page*$pageSize;
//sql语句
$sql="select*fromtablelimit$seat,$pageSize";
//输出数据到view即可

‘玖’ 如何用sql语句 实现分页查询

适用于 SQL Server 2000/2005

SELECT TOP 页大小 *

FROM table1

WHERE id NOT IN

SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id