详解SQLServer和Oracle的分页查询
不管是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 10 from emp order by empid ;按照员工ID升序排列,取出前10条记录。
SQLServer实现第二步select 5 from (select 10 from emp order by empid ) a order by empid desc 。将取出的10条记录按员工号降序排列再取出5条记录。这里的第一次用升序排序,第二次用降序排序是巧妙之处。没有想到能起到这样的效果。这里的10的位置用变量pageNow PageSize代替而5用PageSize 代替。
第二种Top和In的使用
select 5 from emp where empid in (select 10 empid from emp order by empid) order by empid desc; 这里的10的位置用变量pageNow PageSize代替而5用PageSize 代替。
其他查询都是大同小异的,这里不再赘述。
以上就是两种数据库实现分页功能的案例,希望对大家的学习有所帮助。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程