SQLServer和Oracle中怎么实现分页查询

66次阅读
没有评论

共计 2201 个字符,预计需要花费 6 分钟才能阅读完成。

本篇文章为大家展示了 SQLServer 和 Oracle 中怎么实现分页查询,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1. 分页算法  

最开始我在网上查找资料的时候,看到很多分页内容,感觉很多很乱。其实不是这样。网上那些资料大同小异。问题出在了我自己这里。我没搞明白进行分页的前提是什么?我们都知道只要有分页都会涉及这些变量:每页又多少条记录(pageSize)、当前页(pageNow)、总记录数(totalRecords)、总页数(totalPages)、开始页(beginRow)、结束页(endRow)。网上的那些资料分页算法有用到 pageSize 的,有用到 beginPage 还有用到 endPage. 其实这些变量需要分类:我将他们分为三类:A. 需要从数据库中查询出来的:totalRecords. select count(*) from tableName B. 最基本的需要用户提供的:pageSize 和 pageNow.(个人觉得这是分页算法的前提) C. 从其他变量计算得来的:totalPages、beginRow 和 endRow.(这里需要计算出 beginRow 和 endRow 是由于分页查询中需要用到,totalPages 是页面需要提供的信息)。具体的计算公式:

totalPages: if ((totalRecords% pageSize) == 0) { totalPages = totalRecords/ pageSize; } else { totalPages = totalRecords/ pageSize + 1; } beginRow: (pageNow-1) * PageSize +1 endRow: pageNow * PageSize

这样这些变量的值就都可以获得了。具体怎么使用请接着看 2 和 3 部分。

2.Oracle 中的常用分页方法  

其实不管是 Oracle 还是 SQLServer,实现分页查询的基础都是子查询。用我自己的话说就是:select 中套 select。Oracle 分页方式有三种。我这里只讲一种容易理解的。以员工表(emp)为例。假设有 10 条记录,现在分页要求每页 5 条记录,当前页为 2. 则查询出来的是记录为 6 -10。我们先用具体的数字做,然后再换成变量。 

Oracle 实现第一步:

select a.*,rownum rn from (select * from emp) a;其中 rownum 是 Oracle 内部分配行号。括号中的 select * from emp 是将 emp 表中的记录全部查询出来。然后我们再将查询出来的结果作为视图进一步查询。外面的 select 除了查询 emp 的全部以外再加一个 rownum,以便后面的查询使用。 

Oracle 实现第二步:

select a.*,rownum rn from (select * from emp) a where rownum =10;第二步加条件查询出行号小于等于 10 的记录。这里可能会有这样的疑问为什么不直接写 rownum =6 and rownum =10. 不就解决问题了。这里 Oracle 内部机制不支持这种写法。 

Oracle 实现第三步:

select * from (select a.*,rownum rn from (select * from emp) a where rownum =10) where rn =6;ok, 这样就可以完成查询 6 -10 条记录了。最后。我们转换为变量。可能是在 java 程序中也可能是在 pl/sql 中。 

需要转换的又三个:

“emp”的位置为具体表名、“6”的位置 为 (pageNow-1) * PageSize +1、“10 的位置 为 pageNow * PageSize。这种方式可以作为模板使用,修改起来很方便。所有改动只需要改动最里层就可以了。比如查询指定列的情况:修改最里层 select ename,sal from emp;根据薪水列排序:select ename,sal from emp order by sal;都只需要修改最里层。

3.SQLServer 中的常用分页方法  

我们还是采用员工表的例子讲 SQLServer 中分页的实现  

第一种 TOP 的使用:

SQLServer 实现第一步:select top 10 * from emp order by empid ; 按照员工 ID 升序排列,取出前 10 条记录。SQLServer 实现第二步:select top 5* from (select top 10 * from emp order by empid) a order by empid desc。将取出的 10 条记录按员工号降序排列再取出 5 条记录。这里的第一次用升序排序,第二次用降序排序是巧妙之处。没有想到 top 能起到这样的效果。这里的 10 的位置用变量 pageNow * PageSize 代替而 5 用 PageSize 代替。 

第二种 Top 和 In 的使用:

select top 5 * from emp where empid in (select top 10 empid from emp order by empid) order by empid desc; 这里的 10 的位置用变量 pageNow * PageSize 代替而 5 用 PageSize 代替。其他查询都是大同小异的,这里不再赘述。

上述内容就是 SQLServer 和 Oracle 中怎么实现分页查询,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计2201字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)