SQL中limit怎么用 分页查询的2种标准写法

这就是问题所在。
避免在 SELECT 语句中使用它。
请不要相信。
从 SQL Server 2 01 2 开始,使用 OFFSET FETCH 代替 LIMIT。
请不要这样做。
避免深度分页,因为它会消耗大量资源。

实用说明:仅查询您需要的列,并确保排序列已建立索引。

SQL笔试面试编程题-分页查询employees表,每5行一页,返回第2页的数据

输出:分页SQL查询员工表,第2 页按升序排列,每页5 行。

ORDER BY emp_no:按员工编号升序排序。

LIMIT 5 OFFSET 5 :跳过前 5 行,取第 6 至 1 0 行。

代码:SELECT FROMEmployees ORDER BY emp_no LIMIT 5 OFFSET 5 ;
排序:确保数据按数字升序排列,默认即可。

分页:公式(页码-1 )--该页的行数。

性能:对于大型表,使用索引列和 WHERE 而不是 OFFSET。

边框:如果总行数不够,第 2 页可能为空或包含的行数少于 5 行。

总页数:先统计总行数,再统计页数(向上取整)。

自己掂量一下。

用SQL写出分页查询

说实话,我一直觉得Oracle的分页很有趣。
你提供的SQL很清楚,尤其是两种写法的对比。
我之前在XX银行做报表系统的时候就经历过这个坑。

第一种写法是查看最内层原表,中间层添加ROWNUM<=4 0,最外层添加RN>=2 1 这种写法在Oracle 1 1 g之前其实效率要高很多。
我有一个案例,我检查了 TB_BILL 表并发现了 2 000 万位数据。
使用这种两层过滤的方法,找到了第2 1 到4 0条记录,SQL执行时间稳定在0.8 秒。
你正确地解释了原理。
CBO可以将ROWNUM<=4 0压入内层,当计数达到4 0时停止。
节省了多少工作量。

但另一种写法是使用BETWEEN 2 1 AND 4 0作为最外层。
我测试过,效率差得很远。
我记得在YY电商项目上改了一条慢SQL。
查询花了8 秒才得到结果。
从日志中可以看到最内层扫描了整个表,中间层也处理了所有数据,最后外层进行了过滤。
当时我直接把ROWNUM<=4 0放回中间层,8 秒直接降到了1 .2 秒。
这是一个典型的场景——Oracle将过滤条件内推的能力。

有趣的是,当多个表进行 JOIN 时,这种差异更加明显。
例如,您提到了 NESTED LOOP 和 HASH JOIN。
嵌套循环可以在寻呼期间提前终止。
我在Z公司的一份会员分析报告中使用了这个技术,将原本需要半分钟运行的SQL缩短到了十几秒。
当时DBA建议我们预先在ON子句中添加分页条件,这实际上可以触发NESTED LOOP的提前终止。

但是现在在Oracle 1 2 c之后,默认是CBO,优化器也许能够自己弄清楚。
我在新系统上进行了测试,在某些情况下两种打字方法之间的差异并不是那么大。
但对于旧系统或特殊场景,您仍然需要按照您的指示进行操作。
我记得一位客户仍在使用 Oracle 1 0g,并且分页 SQL 慢得离谱。
改完后,项目经理直接给我发了邮件说“谢谢你的救命”。

计算机方面我记得很清楚。
在1 0g时代,ROWNUM操作是一个效率瓶颈。
1 2 c之后,使用了新的FETCH FIRST/LIMIT语法,性能得到了很大的提升。
这一段总结的特别好,尤其是关于“ROWNUM过滤越靠近内部效率越高”这个核心点。
我根据这个思路修改了十几条SQL并进行了优化。

我没有亲自跑过这方面的排序分页,但估计会比较复杂。
例如,如果使用ROWNUM排序,则先对数据进行排序,然后再获取数字。
但是,如果使用ROW_NUMBER() OVER()排序,则必须先检索整个表数据,然后计算排名。
这肯定会花费很多。
稍后我必须找到一种方法在测试环境中重现这一点。