Oracle和MySQL在分页查询上有一些区别,主要体现在语法和功能上的差异:
1.语法差异:
2.Oracle:在 Oracle 中,使用 ROWNUM 函数结合子查询实现分页查询。例如:
SELECT * FROM ( SELECT emp.*, ROWNUM AS rn FROM employees emp WHERE ROWNUM <= 10 ) WHERE rn > 5;
3.MySQL:在 MySQL 中,可以使用 LIMIT 和 OFFSET 关键字实现分页查询。例如:
SELECT * FROM employees LIMIT 5 OFFSET 5;
4.行号差异:
5.Oracle:在 Oracle 中,ROWNUM 是一个伪列,它表示返回结果集中的行号。需要注意的是,ROWNUM 是在查询结果返回之后再进行分配的行号,所以在子查询中使用时,需要先进行排序,然后再在外层查询中限制行数。
6.MySQL:在 MySQL 中,没有直接类似于 ROWNUM 的概念。MySQL 使用 LIMIT 和 OFFSET 设置返回的起始位置和行数。LIMIT 指定返回的最大行数,OFFSET 表示从哪一行开始返回结果。
7.性能差异:
8.Oracle:在 Oracle 中,使用 ROWNUM 进行分页查询可能导致一些性能问题,特别是当需要跳过大量行时(例如跳过前几万行),因为 ROWNUM 是在结果集返回之后再分配的行号。
9.MySQL:在 MySQL 中,使用 LIMIT 和 OFFSET 进行分页查询性能较好,因为 MySQL 在内部优化了这些操作。
延伸下深分页问题
深分页问题主要是跳过了大量的数据来获取所需的数据,DB是要计算出跳过的行数
可以依靠有序键值(索引肯定是要建立的)
SELECT * FROM
table_name
WHERE sort_key > last_seen_value
ORDER BY sort_key FETCH NEXT 100 ROWS ONLY;
注意 OFFSET-FETCH 是从 12C 版本后才有