SQL Server实现MySQL中的LIMIT分页功能

2024-06-25 09:50 阅读 906 次 评论 0 条

在使用 ORM 框架之前,我一直使用原生 SQL 进行分页查询。突然想起来,便随手记录一下在 SQL Server 中实现 MySQL 中的 LIMIT 分页功能的方法。

首先,在 MySQL 中有一种常见的分页方式:使用 LIMIT 关键字来设定每页的记录数,并使用 OFFSET 计算公式(`pageSize * (pageIndex - 1)`)来指定起始记录。

例如:

SELECT id, name, gender, score 
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 0;

但在 SQL Server 中,没有 LIMIT 关键字,相对应的是 TOP 关键字。因此,我们可以使用以下三种方法来实现分页查询:

方法一:

SELECT *
FROM (
    SELECT TOP 3
        userID
    FROM dbo.t_user
    WHERE userID NOT IN (
        SELECT TOP 6
            userID
        FROM dbo.t_user
    )
) AS innerQuery
ORDER BY userID ASC

这个查询首先获取 `t_user` 表中 `userID` 的前 6 条记录,然后从剩余的记录中获取接下来的 3 条记录,最后按 `userID` 升序排序。

方法二:

DECLARE @PageSize INT = 3;
DECLARE @PageIndex INT = 2;

SELECT *
FROM (
    SELECT TOP (@PageSize)
        *
    FROM (
        SELECT TOP (@PageIndex * @PageSize)
            *
        FROM dbo.t_user
        ORDER BY id ASC
    ) AS innerQuery
    ORDER BY id DESC
) AS outerQuery
ORDER BY id ASC

这个查询首先获取 `t_user` 表中前 `(@PageIndex * @PageSize)` 条记录,并按 `id` 升序排序。然后从这些记录中获取接下来的 `@PageSize` 条记录,并按 `id` 降序排序。最后,再次按 `id` 升序排序输出结果。

方法三:

DECLARE @PageSize INT = 3; 
DECLARE @PageIndex INT = 2;

SELECT *
FROM (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY userID ASC) AS rownumber,
        *
    FROM dbo.t_user
    WHERE 1 = 1
) AS t
WHERE t.rownumber > ((@PageIndex - 1) * @PageSize)
  AND t.rownumber <= (@PageIndex * @PageSize)

这个查询使用 `ROW_NUMBER()` 函数给每个记录添加一个序号,然后根据页码和页大小进行过滤输出。

总之,通过上述三种方法,我们可以在 SQL Server 中实现与 MySQL 中 LIMIT 分页功能类似的效果。在实际应用中,可以根据具体需求选择合适的方法。

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:SQL Server实现MySQL中的LIMIT分页功能 | 雨晨博客

发表评论


表情