SQL中TOP和LIMIT的分页用法 不同数据库中分页查询的语法差异

哎呀,说到分页查询,这是数据库操作中很常见的需求。
不同数据库的分页语法确实略有不同,所以需要详细讨论。

我们先来谈谈SQL Server。
它在这里使用 TOP 与 ROW_NUMBER() 组合。
我的印象是2 008 年左右开始流行,当时这个方法还蛮流行的。
它必须首先为每一行分配一个序列号,然后使用 WHERE 子句过滤所需的页码范围。
那时我还在一家外企做数据库管理。
当我们使用SQL Server时,页码和每页的项目数是使用变量传递的,这有点不方便。

MySQL分页语法比较简单,直接使用LIMIT即可。
我第一次听说这个语法是在2 01 0年左右,当时MySQL 5 .0刚刚问世。
你直接告诉数据库你想要哪条数据,简单直接。

PostgreSQL分页语法与MySQL非常相似,同样使用LIMIT和OFFSET。
不过这个东西出来的比较早,大概是2 000年左右。
语法简单明了,用的人也很多。

说到优化,这是一个大问题。
首先,必须优化索引。
例如ORDER BY中使用的字段必须有索引,这样排序和过滤会更快。
还有一个封闭索引,也就是说该索引包含了查询中用到的所有字段,所以不需要查询表本身。

我们来谈谈延迟关联和游标分页,这在处理深度分页时非常有用。
延迟连接是先获取ID,然后关联其他列,这样数据量就小。
页游标就是记录上一页最后一条记录的ID,然后用这个ID来获取下一页的数据。
这样可以避免使用OFFSET带来的性能问题。

为了兼容处理,现在使用ORM框架,比如Hibernate、MyBatis,可以自动改变分页语法。
或者您可以编写数据库自定义层并根据数据库类型选择语法。

要排序,您必须选择一个稳定的字段。
不要使用该功能。
您还必须合并索引以确保稳定的排序。

哎,说了这么多,分页查询的核心还是一样的,那就是语法一定要灵活,优化一定要有。
我们要根据实际情况进行调整。

高效处理大数据MySQL的亿条数据排序技巧mysql一亿条数据排序

小心避坑:MySQL分页时使用 limit+order by 会出现数据重复问题

如何实现Top-N排行榜和分页查询

需要说明的是,实现Top-N排名和页面查询其实很简单,主要是基于结果集的排序和限制。
我们先来说说最重要的事情。
排序是关键。
例如,如果我们想找到月薪最高的员工,我们需要按薪资 DESC 排序 ORDER BY 薪资 DESC。
我们去年做的一个项目大约有3 000级数据。
我们使用 ORDER BY 工资 DESC 来确保数据按工资从最高到最低排序。
还有一点,FETCH FIRST 和 LIMIT 语法在这里非常有用。
例如,如果我们要查看前 5 名员工的工资,我们使用 FETCH FIRST 5 ROWS ONLY 或 LIMIT 5 事实上,许多初级 SQL 用户都使用这些技术。
另一个重要的细节是,在运行页面查询时,OFFSET 用于跳过以前的记录。
例如OFFSET 1 0 ROWS表示跳过前1 0行数据。

实际上,令人困惑的是不同数据库的语法存在细微的差异。
例如,Oracle ROWNUM 函数在 1 1 G 之前的版本中非常常见,但许多较新的版本不再支持它。
等等,还有一件事,Oracle 的 FETCH FIRST 支持以百分比形式返回数据。
该功能在某些情况下特别有用。

所以我的观点是,无论您是进行 Top-N 排名还是分页查询,您都应该熟悉所使用的数据库语法,以避免陷入陷阱。
例如,如果要查找月薪第三高的所有员工,可以使用 LIMIT 和 OFFSET。