LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

SQL技巧:结果集分页查询

admin
2024年2月7日 18:53 本文热度 500

随着数据获取量的不断增大,对数据库进行高效访问的需求也变得日益重要。无论是展示查询结果,还是满足用户交互界面的需求,如何恰当地给结果集分页是我们必须解决的问题之一。

在 Oracle 数据库中,实现结果集分页并非易事,特别是考虑到不同版本的Oracle提供了不同的方式来解决这个问题。然而,正确、有效地使用它们仍需要理解和掌握一些关键技术和原则。

本文将为你详细介绍如何在 Oracle 数据库中实现结果集分页,帮助你理解并掌握在各种应用场景下使用正确方法进行数据分页的技巧,以便你能更好地管理和利用数据库资源。你将会发现,即使在处理最复杂、最大规模的数据集时,也可通过利用 Oracle 的强大功能来达到优异的性能表现。

在Oracle中,可以使用ROWNUM 或者 FETCH FIRST/NEXTOFFSET子句(仅适用于 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
)
  1. 使用 ROWNUM

    Oracle为每一个在查询结果中的记录都会分配一个唯一的ROWNUM。首先注意的是,在对结果集排序后,才使用ROWNUM进行过滤通常不会得到期望的结果,因为排序实际上是在ROWNUM已经赋值之后才发生。因此,正确的做法是,首先利用子查询创造一个结果集,然后再对这个结果集使用ROWNUM进行分页。

    以下是一个例子:

    SELECT * FROM 
    (SELECT columnrownum 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来过滤。

  1. 使用 FETCH FIRST/NEXT 和 OFFSET

    从Oracle 12c开始,你可以使用SQL标准的FETCH FIRST/NEXTOFFSET子句来对结果进行分页。

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/NEXTOFFSET子句可以更方便地进行分页操作。然而需要注意的是,这种做法只能在Oracle 12c及以后版本的数据库中进行。

  1. 使用row_number()
select rn,name,sal from (
select row_number()over(order by sal descas rn ,name ,sal from table_test
) x
where rn between 6 and 10

习惯上我们会使用三种方式,但是分页语句的特殊性,受分析函数的影响,有些索引可能会失效。所以还是建议使用第一种方式或者第二种方法去解决分页问题。

在我们深入探索并理解了 Oracle 数据库如何进行结果集分页后,可以看出这是对数据库性能优化和用户体验提升非常关键的一环。我们了解到,不同版本的 Oracle 提供了不同的策略去实现分页功能,比如使用 ROWNUM,在 Oracle 12c及以后版本中使用 FETCH FIRST/NEXT 和 OFFSET 子句等。

通过本文,我们希望你已经明确了如何在各种场景下选择合适的分页策略,并且知晓了即使在大型数据集上,也能通过合适的使用和管理来达成高效的分页处理。

然而,学习就像行走在无尽的道路上,总有新的地方等待着我们去发掘。今天的介绍,让我们更完全地理解 Oracle 数据库及其分页机制的威力。这个领域仍然有很多深入的话题等待我们去探索-- 从更复杂的分页策略,到如何根据特定的应用需求进行数据库优化等等。

随着技术的不断发展和更新,我们需要持续学习,时刻关心和了解新的变化和进步。希望你能持续关注和研究 Oracle 数据库的最佳实践,以便从中获得更好的性能,并持续改进你的应用。

请记住,无论数据多大或复杂,有效地管理和使用它们总是可能的。每一个开发人员和数据库管理员都有权力和能力通过正确的工具和策略让数据为自己服务。利用你从这篇文章中学到的知识,上路吧,令每一次查询更加高效,让每一份结果集更适合你的需求,开启你的数据库驾驭之路!


该文章在 2024/2/7 18:53:21 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved