在使用 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, 数据库笔记
标签:limit, SQL Server