Mysql中的分页
物理分页
•在sql查询时,从数据库只检索分页需要的数据
•通常不同的数据库有着不同的物理分页语句
•mysql物理分页,采用limit关键字
•例如:检索11-20条 select * from user limit 10,10 ;

* 每次只查询10条记录.当点击下一页的时候,查询数据库,查询后10条.

* 优点:如果数据量非常大,不会导致内存溢出.

* 缺点:每次都与数据库进行交互.

* 分页一般采用数据库的sql语句完成分页查询.

* MYSQL分页:使用limit关键字.

* Oracle分页:使用rownum    SQLServer分页:使用top关键字.

* select * from customer limit a,b;

* 参数a:代表从那条记录开始,初始值是0.

* 参数b:查询长度.

* 分页关系:

page(当前页数)            limit(每页显示条数)           start(从哪开始的)

1                        10                          0

2                        10                          10

3                        10                          20

***** start = (page - 1) * limit;

 

向后台传递值:当前页数.

后台向页面显示数据:currPage(当前页数)、List<Customer>、totalPage(总页数.需要通过总记录数进行计算.)、totalCount(总记录数)、limit(每页显示的记录数).

将这些参数进行封装.封装到一个JavaBean中. 用request域存取JavaBean.

 ====================================华丽丽的分割线================================================

Oracle中的分页:

Oracle中分页用rownum;

rownum的特点现象:

 1 SQL> select rownum,ename from emp;
 2
 3 ROWNUM ENAME
 4 ---------- ----------
 5 1 SMITH
 6 2 ALLEN
 7 3 WARD
 8 4 JONES
 9 5 MARTIN
10 6 BLAKE
11 7 CLARK
12 8 SCOTT
13 9 KING
14 10 TURNER
15 11 ADAMS
16 12 JAMES
17 13 FORD
18 14 MILLER

如果在加上order by排序的条件限制

 1 SQL> select rownum ,ename,sal from emp order by sal desc;
 2
 3     ROWNUM ENAME             SAL
 4 ---------- ---------- ----------
 5          9 KING             5000
 6         13 FORD             3000
 7          8 SCOTT            3000
 8          4 JONES            2975
 9          6 BLAKE            2850
10          7 CLARK            2450
11          2 ALLEN            1600
12         10 TURNER           1500
13         14 MILLER           1300
14          3 WARD             1250
15          5 MARTIN           1250
16         11 ADAMS            1100
17         12 JAMES             950
18          1 SMITH             800

加上order by 之后rownum 依旧没有变化,说明rownum是基于原始表emp进行排序的 ,固定住了,所以如下使用rownum<=3 来取得Top3是错误的:

 1 SQL> select rownum,empno,ename,sal
 2  from emp
 3  where rownum<=3
 4  order by sal desc;
 5
 6     ROWNUM      EMPNO ENAME             SAL
 7 ---------- ---------- ---------- ----------
 8       7499 ALLEN            1600
 9       7521 WARD             1250
10       7369 SMITH             800

为什么Oracle中的rownum行号不变?

解释:

在Oracle中分为标准表,临时表,索引表...

1 SQL> --标准表,临时表,索引表
2 SQL> --create global temporary table *****
3 SQL> --临时表:基于会话 基于事务
4 SQL> --特点:当会话或者事务结束的时候,表中的数据自动删除

创建临时表用create global temporary table 临时表可以基于会话,也可以基于事务.

特点:当会话或者事务结束的时候,表中的数据自动删除.退出会话,或者退出事务表中的删除就删除了.

比如:公司财务会做很多报表.中间的结果可以保存到临时表中.最后也不需要手动删除.

临时表有两种方式创建,一个是手动,一个是Oracle自动创建临时表.

自动创建临时表最典型的是排序,order by....

order by...之后Oracle会自动创建一个临时表,保存的是排好序之后的数据.

我们最终看到的排好序的是临时表中的数据.

但是行号永远来按照原来的表来生成,只要原来的表来生成,只要原来的表内容没有变,行号就不变....这就解释了为什么行号不变...

1 SQL> /*
2 SQL> 注意的问题
3 SQL> 1. rownum永远按照默认的顺序生成
4 SQL> 2. rownum只能使用< <=; 不能使用> >=
5 SQL> */

rownum只能使用< <=; 不能使用> >= 如下使用>=就报错.

这个和行号的生成原理有关系,Oracle和Mysql都是基于行的行式数据库,nosql数据库都是基于列的.

Oracle这样的行式数据库中rownum永远从1开始,取了第1行才能去第2行...取了第2行才能取第三行....

rownum>=5 所以这个条件永远为假,前面的4个都没有取.  rownum<=8 这个条件可以.

如果在sql中使用'rownum >'

SQL> --分页
SQL> select rownum,empno,ename,sal2  from emp3  where rownum>=5 and rownum<=8;未选定行SQL> select rownum,empno,ename,sal2  from emp3  where rownum>=5;未选定行

解决方法是:

--oracle分页
SQL>  select *2   from      (select rownum r,e1.*3      from (select * from emp order by sal) e14      where rownum <=85     )6   where r >=5;R      EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------5       7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         306       7934 MILLER     CLERK           7782 23-1月 -82           1300                    107       7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         308       7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30

详细的分析过程因为博客园 编辑器不够强大,我用word解释了,这里附截图和部分SQL文:

这个是从第二个select开始的sql语句:
SQL> select rownum r,e1.*2      from (select * from emp order by sal) e13      where rownum <=84  ;R      EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------1       7369 SMITH      CLERK           7902 17-12月-80            800                    202       7900 JAMES      CLERK           7698 03-12月-81            950                    303       7876 ADAMS      CLERK           7788 23-5月 -87           1100                    204       7521 WARD       SALESMAN        7698 22-2月 -81           1250        500         305       7654 MARTIN     SALESMAN        7698 28-9月 -81           1250       1400         306       7934 MILLER     CLERK           7782 23-1月 -82           1300                    107       7844 TURNER     SALESMAN        7698 08-9月 -81           1500          0         308       7499 ALLEN      SALESMAN        7698 20-2月 -81           1600        300         30已选择 8 行。

=======================================逻辑分页=======================================================

逻辑分页

•在sql查询时,先从数据库检索出所有数据的结果集
•在程序内,通过逻辑语句获得分页需要的的数据
•例如: 检索11-20条 userList.subList(10,20);

* 一次性将数据库中所有记录都查询出来,存放到List集合中,每次查询的时候,List集合subList.截取List集合的长度,完成分页.

* 优点:只访问一次数据库.

* 缺点:如果数据量非常大,容易导致内存溢出.

在java中传递封装分页相关信息的时候的JavaBean的设计

/*** 分页查询 数据类 存放分页相关所有数据*/
public class PageBean {private int pageNum; // 当前页码private int numPerPage; // 每页记录条数private int totalCount; // 总记录条数private int totalPageNum; // 总页数private List<Customer> customers; // 当前页需要数据
}

本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/4025112.html,如需转载请自行联系原作者

[数据库]Oracle和mysql中的分页总结相关推荐

  1. oracle repeatable read,Oracle和Mysql中的数据库事务有关问题:Mysql Read-Repeatable有有关问题...

    Oracle和Mysql中的数据库事务问题:Mysql Read-Repeatable有问题 今天不知不觉想到数据库的乐观锁和悲观锁,遂想写个程序测测,却发现了另一个问题,Mysql InnoDB的R ...

  2. MySQL中的分页查询

    MySQL中的分页查询 一.MySQL分页查询原则 在MySQL数据库中使用limit子句进行分页查询: MySQL分页中开始位置为0: 分页子句在查询语句的最后侧: 二.Limit子句(较为常 ...

  3. oracle里有limit怎么用,[ORACLE]ORACLE 实现mysql中的limit 功能

    [ORACLE]ORACLE 实现mysql中的limit 功能 项目从mysql迁移到ORACLE中遇到移植问题,mysql中支持limit 而ORACLE say no . 解决方法 利用ORAC ...

  4. mysql可串行化读音,Oracle与MySQL中“可串行化”的对比测试

    Oracle与MySQL中"可串行化"的对比测试 Oracle与MySQL中"可串行化"的对比测试 Thomas Kyte 在"Oracle 9i&a ...

  5. mysql导入复杂excel表格,较复杂的excel表格导入数据库oracle或mysql《》

    在JAVA web开发中怎么把Excel中的数据导入到oracle数据库中 1.准备数:在excel中出需要的数据 2.将excel中的数据另存为文件(有制表符分隔的) 3.将新保存到文本文件中的数据 ...

  6. oracle的mvcc解析,PostgreSQL原理:Oracle 和 MySQL 中MVCC机制详解

    MVCC,Multi-version Concurrency Control ,顾名思义指的是多版本并发控制.在介绍MVCC之前我们先来简单了解下事务的隔离级别: read uncommitted:脏 ...

  7. mysql自定义序号_MySQL数据库之在mysql中给查询的结果添加序号列

    本文主要向大家介绍了MySQL数据库之在mysql中给查询的结果添加序号列 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 一:第一种: select   (@i:=@i+1)  ...

  8. mysql怎么给数据加序号_MySQL数据库之在mysql中给查询的结果添加序号列

    本文主要向大家介绍了MySQL数据库之在mysql中给查询的结果添加序号列 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 一:第一种: select   (@i:=@i+1)  ...

  9. limit实现原理 mysql_解读数据库:深入分析MySQL中事务以及MVCC的实现原理

    什么是事务 事务(Transaction)是由一系列对数据库中的数据进行访问与更新的操作所组成的一个程序执行单元. 在同一个事务中所进行的操作,要么都成功,要么就什么都不做.理想中的事务必须满足四大特 ...

最新文章

  1. java越权发送邮件_水平越权的常见解决方法
  2. (转)rlwrap真是一个好东西
  3. H3 BPM MVC表单SheetOffice控件使用分享
  4. 黑苹果关机重启后蓝牙连接不上_手机要关机吗,要贴膜吗,要套壳吗?看完这条,都有答案了_政务_澎湃新闻...
  5. 当猪飞起来:也谈创业初期商业模式问题
  6. 手机做服务器性能咋样,服务器性能不足 怎样才能逼出最强状态
  7. GDB 调试 .NET 程序实录 - .NET 调用 .so 出现问题怎么解决
  8. log4j日志 linux配置,Log4j 日志详细用法
  9. servlet的由来
  10. 如何启动netcat_Netcat用法
  11. Python演示SQLite数据库系统表sqlite_sequence的作用与操作
  12. c语言课程案例设计报告,C语言课程设计报告—范例解读.doc
  13. 输出毫秒_毫秒级网络监控(网络示波器)
  14. LaTeX数学公式-详细教程
  15. 微信公众号文章排版php,微信内容排版工具总结
  16. 内核编程初学者给“楚狂人”的一封信
  17. linux识别硬盘时显示gpt,Ubuntu不识别GPT硬盘已有系统的解决方案
  18. python web py入门(2)-URL处理
  19. tarjan算法讲解
  20. 阿里云大数据——搭建企业级数据分析平台

热门文章

  1. VC对话框全屏显示及相应控件位置改变(转)
  2. 爬取jd商城手机类商品图片
  3. 设计模式10——flyweight模式
  4. 团队科学计算器-模块开发过程
  5. UITableView属性 自己定义UITableViewCell
  6. 概念的理解 —— 奇点(singularity point)、第一性原理(first principle)
  7. Codeforces Round #303 (Div. 2) E. Paths and Trees 最短路+贪心
  8. NES模拟器开发-CPU笔记
  9. python学习笔记:easygui的简单示例
  10. nginx反向代理nexus私服