文章内容

2021/9/4 14:48:00,作 者: 黄兵

带有 LIMIT 和 OFFSET 的 SQL 分页

MySQL 和 PostgreSQL 都支持一个非常酷的特性,称为 OFFSET 通常与 LIMIT 子句一起使用的特性。

LIMIT 子句用于限制 SQL  语句中返回的结果数。因此,如果表中有 1000 行,但只想返回前 10 行,则可以执行以下操作:

SQL 返回前 10 行:

SELECT column FROM table
LIMIT 10

这类似于 Microsoft SQL Server TOP 上的子句。然而,该 LIMIT 子句总是出现在 MySQL 和 PostgreSQL 查询的末尾。

现在假设您想显示结果 11-20。使用 OFFSET 关键字同样简单,以下查询将执行:

SQL 分页(返回第 11 到 20 行):

SELECT column FROM table
LIMIT 10 OFFSET 10

这使得使用 SQL 编写多页结果或分页变得容易。通常使用的方法是对 SELECT 所有记录进行过滤,然后在应用服务器层过滤它们,而不是直接在数据库上过滤。正如您所想象的那样,在数据库上执行此操作会产生更好的性能。

从页码计算偏移量

我在 SQL 中对分页进行编码有两种不同的方式,要么直接将限制和偏移量作为变量传递,要么将页码作为变量提供。页码方法可能更安全一些,因为有人无法通过操作输入变量来制作返回表中所有行的页面。

假设您想要 SQL 结果的第 3 页,在这种情况下您想要 LIMIT 10 OFFSET 20,这里是一些用于计算页面的伪代码:

limit = 10;
offset = (limit * pageNumber) - limit;

MySQL 和 PostgreSQL 的 SQL 分页

我知道 PostgreSQL 支持 OFFSET 关键字已经有一段时间了,但出于某种原因,我一直认为 MySQL 不支持它。好吧,事实证明它现在得到支持。能够在 MySQL 和 PostgreSQL 上对 SQL 分页使用相同的语法真是太好了。

我使用过许多不同的数据库平台,我认为 MySQLPostgreSQL 有最干净的方式来进行 SQL 分页 LIMITOFFSET


文章来源:SQL Pagination with LIMIT and OFFSET

分享到:

发表评论

评论列表