各种数据库分页查询语句汇总

在显示记录条目时往往要用到分页,一种常用的办法是利用各种数据库自带的定位接口对原始查询语句进行改写,从而只取出特定范围的某些记录。不同的数据库,查询定位接口是不一样的,下面做一汇总:

数据库

分页查询语句

说明

MySql

"QUERY_SQL limit ?,?" 使用limit关键字,第一个"?"是起始行号,
第二个"?"是返回条目数
Oracle

SELECT * FROM
( SELECT A.*, ROWNUM RN FROM
(QUERY_SQL ) A WHERE ROWNUM
<= ?) WHERE RN >= ?

结合rownum关键字,利用嵌套三层select
语句实现。第一个"?"表示终止行号,
第二个"?"表示其实行号
Sql Server

尚无通用语句 可使用top n来返回前n条记录或使用存储过程
DB2

假设查询语句:select t1.* from t1 order
by t1.id; 分页语句可为:
"select * from ( select rownumber() over
(order by t1.id) as row_, t1.* from t1
order by t1.id) as temp_ where row_
between ?+1 and ?" 返回两个"?"之间的记录
InterBase

“QUERY_SQL row ? to ?” 返回两个"?"之间的记录
PostgreSQL “QUERY_SQL limit ? offset ?” 第一个"?"为起始行号,第二个"?"代表
返回记录数








Sql Server存储过程分页总结



分页方案一:(利用Not In和SELECT TOP分页)

语句形式:

SELECT TOP 10 *

FROM TestTable

WHERE (ID NOT IN

(SELECT TOP 20 id

FROM TestTable

ORDER BY id))

ORDER BY ID



SELECT TOP 页大小 *

FROM TestTable

WHERE (ID NOT IN

(SELECT TOP (页大小*页数) id

FROM 表

ORDER BY id))

ORDER BY ID

分页方案二:

语句形式:

Create PROCEDURE ListPage(

@tblName nvarchar(200), ----要显示的表或多个表的连接

@fldName nvarchar(200) = '*', ----要显示的字段列表

@pageSize int = 10, ----每页显示的记录个数

@page int = 1, ----要显示那一页的记录

@pageCount int = 1 output, ----查询结果分页后的总页数

@Counts int = 1 output, ----查询到的记录数

@fldSort nvarchar(100) = null, ----排序字段列表或条件

@Sort bit = 0, ----排序方法,0为升序,1为降序

@strCondition nvarchar(200) = null, ----查询条件,不需where

@ID nvarchar(50) ----主表的主键

)

AS

SET NOCOUNT ON

Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句

Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句

Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句

Declare @sqlSort nvarchar(200) ----存放临时生成的排序条件

Declare @intCounts int ----要移

动的记录数

Declare @BeginID int ----开始的ID

Declare @EndID int ----结束的ID



--------首先生成排序方法---------

if @Sort=0 --升序

begin

if not(@fldSort is null)

set @sqlSort = ' Order by ' + @fldSort

else

set @sqlSort = ' Order by ' + @ID

end

else --降序

begin

if not(@fldSort is null)

set @sqlSort = ' Order by ' + @fldSort + ' DESC'

else

set @sqlSort = ' Order by ' + @ID + ' DESC '

end

--------生成查询语句--------

--此处@strTmp为取得查询结果数量的语句

if @strCondition is null --没有设置显示条件

begin

set @sqlTmp = @fldName + ' From ' + @tblName

set @strTmp = 'select @Counts=Count(' + @ID + ') FROM '+@tblName

set @strID = ' From ' + @tblName

end

else

begin

set @sqlTmp = + @fldName + 'From ' + @tblName + ' where ' + @strCondition

set @strTmp = 'select @Counts=Count(' + @ID + ') FROM '+@tblName + ' where ' + @strCondition

set @strID = ' From ' + @tblName + ' where ' + @strCondition

end

----取得查询结果总数量-----

exec sp_executesql @strTmp,N'@Counts int out ',@Counts out

--取得分页总数

if @Counts <= @pageSize

set @pageCount = 1

else

set @pageCount = (@Counts / @pageSize) + 1

--计算要移动的记录数

if @page = 1

set @intCounts = @pageSize

else

begin

set @intCounts = (@page-1) * @pageSize + 1

end

-----取得分页后此页的第一条记录的ID

set @strID = 'select @BeginID=' + @ID + ' ' + @strID



set @intCounts = @intCounts - @pageSize + 1

set rowcount @intCounts

exec sp_executesql @strID,N'@BeginID int out ',@BeginID out

-----取得分页后此页的最后一条记录的ID

set @intCounts = @intCounts + @pageSize - 1

print @intCounts

set rowcount @intCounts

exec sp_executesql @strID,N'@BeginID int out ',@EndID out

------恢复系统设置-----

set rowcount 0

SET NOCOUNT OFF

------返回查询结果-----

if @strCondition is null

set @strTmp = 'select ' + @sqlTmp + ' where ' + @ID + ' between ' + str(@BeginID) + ' and ' + str(@EndID)

else

set @strTmp = 'select ' + @sqlTmp + ' where ' + @ID +' (between ' + str(@BeginID) + ' and ' + str(@EndID) + ') and ' + @strCondition

if not(@sqlSort is null)

set @strTmp = @strTmp + @sqlSort

exec sp_executesql @strTmp

GO

分页方案三:

语句形式:

create PROCEDURE sy_more_cs

(

@mode int=0,

@pagesize int=10,

@pageindex int=1

)

AS

SET NOCOUNT ON

if @mode=0

begin

select count(*) as 记录数 from dbo.house_info_cs;

end

else

begin

declare @indextable table(id int identity(1,1),nid int)

declare @PageLowerBound int

declare @PageUpperBound int

set @PageLowerBound=(@pageindex-1)*@pagesize

set @PageUpperBound=@PageLowerBound+@pagesize

insert into @indextable(nid) select [id] from dbo.house_info_cs order by

dt desc;

select ls.* from dbo.house_info_cs ls,@indextable t where ls.id=t.nid

and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id

相关文档
最新文档