详解SQLServer和Oracle的分页查询_MsSql

不管是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分页查询
Oracle分页查询
mssqlserver 分页、oracle分页查询详解、mssql分页查询、mssql 分页、mybatis mssql 分页,以便于您获取更多的相关知识。

时间: 2024-09-22 05:41:07

详解SQLServer和Oracle的分页查询_MsSql的相关文章

详解SQLServer和Oracle的分页查询

不管是DRP中的分页查询代码的实现还是面试题中看到的关于分页查询的考察,都给我一个提示:分页查询是重要的.当数据量大的时候是必须考虑的.之前一直没有花时间停下来好好总结这里.现在又将Oracle视频中关于分页查询的内容看了一遍,发现很容易就懂了. 1.分页算法     最开始我在网上查找资料的时候,看到很多分页内容,感觉很多很乱.其实不是这样.网上那些资料大同小异.问题出在了我自己这里.我没搞明白进行分页的前提是什么?我们都知道只要有分页都会涉及这些变量:每页又多少条记录(pageSize).当

oracle 分页查询-Oracle数据库分页查询

问题描述 Oracle数据库分页查询 分页查询语句.之前用java获取分页信息是分两步走的,首先获取想要得到的字段信息,第二部获取总记录数count(*).现在因为种种原因,就是想请教高手一下,能不能在一个sql中,查询出这些信息包括总记录数.比如 表 test 字段有id,name. select * from (select A.*,ROWNUM RN from(select * from test) A where ROWNUM<=11) where RN>=1; 这是分开写时,查询的语

oracle数据库分页查询实例小结

Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用.   分页查询格式:  代码如下 复制代码 SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21   其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句.ROWNUM <= 40和RN >= 21控制分页查询的每页的

详解PHP+AJAX无刷新分页实现方法_php技巧

PHP+AJAX无刷新分页实现代码详解,最近在看ajax 教程,就想写个简单入门的PHP+AJAX无刷新分页,我们依据ajax开发框架,代码如下: var http_request=false; function send_request(url){//初始化,指定处理函数,发送请求的函数 http_request=false; //开始初始化XMLHttpRequest对象 if(window.XMLHttpRequest){//Mozilla浏览器 http_request=new XMLH

详解WordPress中给链接添加查询字符串的方法_php技巧

查询字符串指的是链接中后边的问号后的查询语句,格式为 key=value,多个查询语句用 & 符号分开.add_query_arg() 函数就是 WordPress 提供的一个方便的函数,可以帮你给一个链接添加一个或者多个查询语句. 有人会问,添加查询字符串直接在链接后边手动追加不就可以了吗?这样有时候可行,但链接如果本身就有查询字符串就会造成格式错误的问题,而且也不利于 PHP 编写管理,而 add_query_arg() 函数帮你把一切都想好了,你只需要给出要添加查询字符串的链接和一个或多个

详解MVC如何使用开源分页插件(shenniu.pager.js)_javascript技巧

最近比较忙,前期忙公司手机端接口项目,各种开发+调试+发布现在几乎上线无问题了:虽然公司项目忙不过在期间抽空做了两件个人觉得有意义的事情,一者使用aspnetcore开发了个人线上项目(要说线上其实只能ip访问,没有域名哈哈),其架构组成由:aspnetcore1.0.0+redis+ postgressql+TaskMainForm服务,这个项目在后期会开源出来供大家分享学习,站点地址点这里心声网:一者是目前正在做的后台管理框架一叶子,现目前刚好吧js分页插件shenniu.pager.js写

举例详解用Java实现web分页功能的方法_java

分页问题是一个非常普遍的问题,开发者几乎都会遇到,这里不讨论具体如何分页,说明一下Web方式下分页的原理.首先是查询获得一个结果集(表现为查询数据库获得的结果),如果结果比较多我们一般都不会一下显示所有的数据,那么就会用分页的方式来显示某些数据(比如20条).因为Http的无状态性,每一次提交都是当作一个新的请求来处理,即使是换页,上一次的结果对下一次是没有影响的. 这里总结三种实现分页的方式,不知道还有没有别的! 1.每次取查询结果的所有数据,然后根据页码显示指定的纪录. 2.根据页面只取一页

详解sqlserver查询表索引_MsSql

SELECT   索引名称=a.name  ,表名=c.name  ,索引字段名=d.name  ,索引字段位置=d.colid  FROM sysindexes a JOIN sysindexkeys b ON a.id=b.id AND a.indid=b.indid JOIN sysobjects c ON b.id=c.id JOIN syscolumns d ON b.id=d.id AND b.colid=d.colid WHERE a.indid NOT IN(0,255) --

详解sqlserver查询表索引

SELECT   索引名称=a.name ,表名=c.name ,索引字段名=d.name ,索引字段位置=d.colid FROM sysindexes a JOIN sysindexkeys b ON a.id=b.id AND a.indid=b.indid JOIN sysobjects c ON b.id=c.id JOIN syscolumns d ON b.id=d.id AND b.colid=d.colid WHERE a.indid NOT IN(0,255) -- and