详解SQLServer和Oracle的分页查询

 更新时间:2015年09月17日 15:48:21   投稿:lijiao  
分页功能是我们的基本功,必须要牢固掌握。通过对分页算法的整理,希望对实现分页功能更得心应手了,需要的朋友可以参考下

不管是DRP中的分页查询代码的实现还是面试题中看到的关于分页查询的考察,都给我一个提示:分页查询是重要的。当数据量大的时候是必须考虑的。之前一直没有花时间停下来好好总结这里。现在又将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 字段值拼接的实现示例

    sqlserver 字段值拼接的实现示例

    拼接字段可以通过多种方法实现,本文主要介绍了sqlserver字段值拼接的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • SQL Server使用row_number分页的实现方法

    SQL Server使用row_number分页的实现方法

    这篇文章主要为大家详细介绍了SQL Server使用row_number分页的实现方法,具有一定的参考价值,感兴趣的朋友可以参考一下
    2016-06-06
  • SQLServer中master数据库分析

    SQLServer中master数据库分析

    sql下master数据库分析,了解下master数据库主要是做什么用的
    2008-04-04
  • SQL Server 数据库优化

    SQL Server 数据库优化

    设计1个应用系统似乎并不难,但是要想使系统达到最优化的性能并不是一件容易的事。
    2009-07-07
  • SQL Server Table中XML列的操作代码

    SQL Server Table中XML列的操作代码

    SQL Server Table中XML列的操作代码,需要的朋友可以参考下。
    2011-10-10
  • SQL Server事务日志已满的三种解决方案

    SQL Server事务日志已满的三种解决方案

    我们安装数据库后,系统会默认把数据库文件和数据库日志文件最大设为500MB,当然你中途可以更改这个限制,当日志文件接近最大值时,继续使用数据库会提示:事务日志已满,本文给出了三种解决方案,需要的朋友可以参考下
    2023-11-11
  • sql server学习基础之内存初探

    sql server学习基础之内存初探

    这篇文章主要给大家介绍了关于sql server中内存的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家学习或者理解sql server具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Sql function 多行中的列合并为一行一列的方法

    Sql function 多行中的列合并为一行一列的方法

    Sql function 多行中的列合并为一行一列的方法,需要的朋友可以参考下。
    2010-11-11
  • MySQL 及 SQL 注入与防范方法

    MySQL 及 SQL 注入与防范方法

    本文将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符。解决SQL注入安全的问题解决,希望对大家有所帮助。
    2016-07-07
  • SQL Server安装完成后3个需要立即修改的配置选项

    SQL Server安装完成后3个需要立即修改的配置选项

    SQL Server里你总要去改变的3个配置选项,大家知道是哪三个吗?想要知道答案的朋友就仔细阅读下文
    2015-08-08

最新评论