随着数据获取量的不断增大,对数据库进行高效访问的需求也变得日益重要。无论是展示查询结果,还是满足用户交互界面的需求,如何恰当地给结果集分页是我们必须解决的问题之一。
在 Oracle 数据库中,实现结果集分页并非易事,特别是考虑到不同版本的Oracle提供了不同的方式来解决这个问题。然而,正确、有效地使用它们仍需要理解和掌握一些关键技术和原则。
本文将为你详细介绍如何在 Oracle 数据库中实现结果集分页,帮助你理解并掌握在各种应用场景下使用正确方法进行数据分页的技巧,以便你能更好地管理和利用数据库资源。你将会发现,即使在处理最复杂、最大规模的数据集时,也可通过利用 Oracle 的强大功能来达到优异的性能表现。
在Oracle中,可以使用ROWNUM
或者 FETCH FIRST/NEXT
和OFFSET
子句(仅适用于 Oracle 12c 及以上版本)或row_number()
来进行结果分页。
--测试数据
with table_test as (
select '张一' as name ,1000 as sal from dual
union all
select '张二' as name ,1100 as sal from dual
union all
select '张三' as name ,1200 as sal from dual
union all
select '张四' as name ,3500 as sal from dual
union all
select '张五' as name ,1400 as sal from dual
union all
select '张六' as name ,400 as sal from dual
union all
select '张七' as name ,1600 as sal from dual
union all
select '张八' as name ,330 as sal from dual
union all
select '张九' as name ,1800 as sal from dual
union all
select '张十' as name ,1800 as sal from dual
union all
select '张十一' as name ,2000 as sal from dual
)
-
使用 ROWNUM
Oracle为每一个在查询结果中的记录都会分配一个唯一的
ROWNUM
。首先注意的是,在对结果集排序后,才使用ROWNUM
进行过滤通常不会得到期望的结果,因为排序实际上是在ROWNUM
已经赋值之后才发生。因此,正确的做法是,首先利用子查询创造一个结果集,然后再对这个结果集使用ROWNUM
进行分页。以下是一个例子:
SELECT * FROM
(SELECT column, rownum AS rn FROM
(SELECT column FROM table ORDER BY some_column)
WHERE rownum <= MAX)
WHERE rn >= MIN;
在这个查询中,MIN
表示想要获取的第一条记录的位置,MAX
表示你想要获取的最后一条记录的位置。也可以理解为MIN
为(页码-1)条数+1,MAX
为页码条数
select el_seq,rn,name,sal from (
select el_seq,rownum as rn ,name ,sal from (
select rownum as el_seq,name,sal from table_test order by sal desc
) x
where rownum <=10 --页码*条数
)
where rn >=6 ---(页码-1)*条数 +1
疑问点1:为什么不直接rownum >= 6 and rownum <=10?
因为rownum是伪列,需要取出数据后ronum
才会有值,在执行rownum >= 6
时,因为始终没有取到前10条数据
出来, 所以这个条件始终查询不到数据,需要现在子查询中查询到数据,在嵌套一层where rn >=6
来过滤。
-
使用 FETCH FIRST/NEXT 和 OFFSET
从Oracle 12c开始,你可以使用SQL标准的
FETCH FIRST/NEXT
和OFFSET
子句来对结果进行分页。
SELECT column FROM table
ORDER BY some_column
OFFSET N ROWS FETCH NEXT M ROWS ONLY;
- `N` 是你想跳过的行数。
- `M` 是你想从剩余的记录(在跳过 `N` 行后)中选取出来的行数。
例如:
SELECT column FROM table
ORDER BY some_column
OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;
在这个查询中,OFFSET 10 ROWS
会跳过前5行,而 FETCH NEXT 5 ROWS ONLY
则会获取接下来的5行。所以该查询结果将提供从第6行到第10行的记录(排序是按照some_column
列进行的)。
使用FETCH FIRST/NEXT
和OFFSET
子句可以更方便地进行分页操作。然而需要注意的是,这种做法只能在Oracle 12c及以后版本的数据库中进行。
-
使用row_number()
select rn,name,sal from (
select row_number()over(order by sal desc) as rn ,name ,sal from table_test
) x
where rn between 6 and 10
习惯上我们会使用三种方式,但是分页语句的特殊性,受分析函数的影响,有些索引可能会失效。所以还是建议使用第一种方式或者第二种方法去解决分页问题。
在我们深入探索并理解了 Oracle 数据库如何进行结果集分页后,可以看出这是对数据库性能优化和用户体验提升非常关键的一环。我们了解到,不同版本的 Oracle 提供了不同的策略去实现分页功能,比如使用 ROWNUM,在 Oracle 12c及以后版本中使用 FETCH FIRST/NEXT 和 OFFSET 子句等。
通过本文,我们希望你已经明确了如何在各种场景下选择合适的分页策略,并且知晓了即使在大型数据集上,也能通过合适的使用和管理来达成高效的分页处理。
然而,学习就像行走在无尽的道路上,总有新的地方等待着我们去发掘。今天的介绍,让我们更完全地理解 Oracle 数据库及其分页机制的威力。这个领域仍然有很多深入的话题等待我们去探索– 从更复杂的分页策略,到如何根据特定的应用需求进行数据库优化等等。
随着技术的不断发展和更新,我们需要持续学习,时刻关心和了解新的变化和进步。希望你能持续关注和研究 Oracle 数据库的最佳实践,以便从中获得更好的性能,并持续改进你的应用。
请记住,无论数据多大或复杂,有效地管理和使用它们总是可能的。每一个开发人员和数据库管理员都有权力和能力通过正确的工具和策略让数据为自己服务。利用你从这篇文章中学到的知识,上路吧,令每一次查询更加高效,让每一份结果集更适合你的需求,开启你的数据库驾驭之路!
祝你在未来的数据库探索道路上一切顺利。请继续保持好奇、保持学习!
原文始发于微信公众号(运维小九九):SQL技巧:结果集分页查询
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/218560.html