SQL分页

/*@table varchar(2000), --表名
@col varchar(50), --按该列来进行分页
@orderby bit, --排序,0-顺序,1-倒序
@collist varchar(800),--要查询出的字段列表,*表示全部字段
@pagesize int, --每页记录数
@page int, --指定页
@condition varchar(800) --查询条件
*/

DECLARE @sql nvarchar(4000),@where1 varchar(800),@where2 varchar(800),
@total_Item int,@total_Page int ,@pagesize int,@page int,@condition varchar(800),@orderby bit,
@col varchar(50),@table varchar(2000),@collist varchar(800)

/*IF @condition is null or rtrim(@condition)=''
BEGIN--没有查询条件
SET @where1=' WHERE '
SET @where2=' '
END
ELSE
BEGIN--有查询条件
SET @where1=' WHERE ('+@condition+') AND '--本来有条件再加上此条件
SET @where2=' WHERE ('+@condition+') '--原本没有条件而加上此条件
END
*/

SET @sql='SELECT @total_Item=CEILING((COUNT(*)+0.0)'+') FROM PT_HOMEWORK'
SET @pagesize =6
SET @page =2
SET @orderby =0
EXEC sp_executesql @sql,N'@total_Item int OUTPUT',@total_Item OUTPUT
set @total_Page = Ceiling((@total_Item+0.0)/@pagesize) --计算页总数
print @total_Page

IF @orderby=0
 SET @sql='SELECT TOP
 '+CAST(@pagesize AS varchar)+' *
 FROM PT_HOMEWORK
 WHERE HOMEWORK_CD > (
    SELECT MAX(HOMEWORK_CD) 
    FROM (
     SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar)+'HOMEWORK_CD
     FROM PT_HOMEWORK
     ORDER BY HOMEWORK_CD
     ) t
  ) ORDER BY HOMEWORK_CD'
ELSE
 SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' * 
 FROM PT_HOMEWORK
 WHERE HOMEWORK_CD >(
   SELECT  MIN(HOMEWORK_CD)
   FROM (
     SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar)+'
     HOMEWORK_CD
     FROM PT_HOMEWORK
     ORDER BY HOMEWORK_CD DESC
    ) t
  ) ORDER BY HOMEWORK_CD DESC'
IF @page=1--第一页
 SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+' *
  FROM PT_HOMEWORK
  ORDER BY HOMEWORK_CD '+CASE @orderby WHEN 0 THEN '' ELSE ' DESC' END
 --print @sql
EXEC(@sql)

### SQL分页查询的实现方式 #### MySQL分页查询 在MySQL中,可以通过`LIMIT`关键字来实现分页查询。其语法结构如下: ```sql SELECT * FROM tablename WHERE 查询条件 ORDER BY 排序条件 LIMIT ((页码-1)*页大小), 页大小; ``` 此方法的优点在于写法简单,易于理解和维护[^2]。然而,在实际应用中,如果页码和页大小较大,则可能导致性能显著下降,因为数据库需要跳过大量数据才能获取目标范围内的记录。 #### Oracle分页查询 对于Oracle数据库,可以利用`ROWNUM`伪列或者`ROW_NUMBER()`函数来进行分页操作。需要注意的是,直接使用`ROWNUM`可能会导致无法正确过滤结果集,因此通常建议通过子查询的方式先计算行号再进行筛选。 以下是基于`ROW_NUMBER()`的一个例子: ```sql WITH PaginationCTE AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY SortingColumn ASC) AS RowNum FROM YourTableName ) SELECT * FROM PaginationCTE WHERE RowNum BETWEEN :StartRow AND :EndRow; ``` #### SQL Server分页查询 针对SQL Server版本的不同,其实现分页的方法也有所区别。如果是SQL Server 2005或更高版本,推荐采用Common Table Expressions(CTEs)联合`ROW_NUMBER()`功能完成这一需求[^3]: 示例代码展示如下: ```sql DECLARE @PageSize INT = 10; -- 每页显示条目数量 DECLARE @PageNumber INT = 2; -- 当前页面编号 ;WITH PaginationCTE AS ( SELECT Column1, Column2, ROW_NUMBER() OVER (ORDER BY SortingColumn ASC) AS RowNum FROM YourTableName ) SELECT Column1, Column2,... FROM PaginationCTE WHERE RowNum BETWEEN ((@PageNumber - 1) * @PageSize + 1) AND (@PageNumber * @PageSize); ``` #### Spring Boot中的分页支持 除了原生SQL外,现代开发框架如Spring Boot提供了更高级别的抽象层用于简化分页逻辑处理过程。开发者只需定义好实体类映射关系以及Repository接口继承JpaRepository后调用内置findPageByXXX系列方法即可轻松达成目的[^4]。 例如: ```java public interface UserRepository extends JpaRepository<User, Long> { } // Controller Layer Code Snippet Pageable pageableRequest = PageRequest.of(pageNo, pageSize, Sort.by("name").ascending()); userRepository.findAll(pageableRequest).getContent(); ``` 以上介绍了几种常见关系型数据库管理系统下的基本分页技术及其特点比较分析。具体选用哪种方案取决于项目所处环境和技术栈等因素综合考量决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值