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的特点现象:

 SQL> select rownum,ename from emp;

 ROWNUM ENAME
---------- ----------
1 SMITH
2 ALLEN
3 WARD
4 JONES
5 MARTIN
6 BLAKE
7 CLARK
8 SCOTT
9 KING
10 TURNER
11 ADAMS
12 JAMES
13 FORD
14 MILLER

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

 SQL> select rownum ,ename,sal from emp order by sal desc;

     ROWNUM ENAME             SAL
---------- ---------- ----------
9 KING 5000
13 FORD 3000
8 SCOTT 3000
4 JONES 2975
6 BLAKE 2850
7 CLARK 2450
2 ALLEN 1600
10 TURNER 1500
14 MILLER 1300
3 WARD 1250
5 MARTIN 1250
11 ADAMS 1100
12 JAMES 950
1 SMITH 800

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

 SQL> select rownum,empno,ename,sal
from emp
where rownum<=3
order by sal desc; ROWNUM EMPNO ENAME SAL
---------- ---------- ---------- ----------
7499 ALLEN 1600
7521 WARD 1250
7369 SMITH 800

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

解释:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如果在sql中使用'rownum >'

SQL> --分页
SQL> select rownum,empno,ename,sal
2 from emp
3 where rownum>=5 and rownum<=8; 未选定行 SQL> select rownum,empno,ename,sal
2 from emp
3 where rownum>=5; 未选定行

解决方法是:

--oracle分页
SQL>  select *
2 from (select rownum r,e1.*
3 from (select * from emp order by sal) e1
4 where rownum <=8
5 )
6 where r >=5; R EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
5 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
6 7934 MILLER CLERK 7782 23-1月 -82 1300 10
7 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
8 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) e1
3 where rownum <=8
4 ; R EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
1 7369 SMITH CLERK 7902 17-12月-80 800 20
2 7900 JAMES CLERK 7698 03-12月-81 950 30
3 7876 ADAMS CLERK 7788 23-5月 -87 1100 20
4 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
5 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
6 7934 MILLER CLERK 7782 23-1月 -82 1300 10
7 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
8 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; // 当前页需要数据
}

[数据库]Oracle和mysql中的分页总结的更多相关文章

  1. oracle数据库不支持mysql中limit功能

    oracle数据库不支持mysql中limit功能,但可以通过rownum来限制返回的结果集的行数,rownum并不是用户添加的字段,而是oracle系统自动添加的. (1)使查询结果最多返回前10行 ...

  2. 如何将DB2的数据库转换到mySQL中?

    经过几次尝试最终找到解决的办法,因为网上并没有详细说明,所以下面我将详细的步骤记录如下: 1. 大前提是你已经安装好DB2服务器和mySQL服务器,现在只是借用Navicat for MySQL这个软 ...

  3. 非空校验在oracle和mysql中的用法

    oracle判断是否为null nvl(参数1,参数2) :如果参数1为null则返回参数2,否则返回参数1 mysql判断是否为null ifnull(参数1,参数2) :如果参数1为null则返回 ...

  4. MySQL中的分页操作结合python

    mysql中的分页操作结合python --分页: --方式1: ;-- 读取十行 , --从第十行读取 往后再读十行 --方式2: offset ; --从第二十行开始读取10行 -- 结合pyth ...

  5. 各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包----转

    在开发基于数据库的应用系统时,需要在项目中进行数据源的配置来为数据 库的操作取得数据库连接.配置不同数据库的数据源的方法大体上都是相同的,不同的只是不同数据库的JDBC驱动类和连接URL以及相应的数据 ...

  6. 数据库Oracle和MySQL 的不同

    实例区别: MySQL是轻量型数据库,开源免费.Oracle收费,这个不是重点,,重点是它贵. MySQL一个实例可以操作多个库,而Oracle一个实例只能对应一个库. MySQL安装只有300多兆, ...

  7. 优化 MySQL 中的分页

    英文:Robert Eisele 译者:Giraffe 链接:http://yemengying.com/2016/05/28/optimized-pagiantion-mysql/ 一道面试的问题, ...

  8. Oracle和Mysql中的字符串的拼接

    SQL允许两个或者多个字段之间进行计算,字符串类型的字段也不例外.比如我们需要 以"工号+姓名"的方式在报表中显示一个员工的信息,那么就需要把工号和姓名两个字符 串类型的字段拼接计 ...

  9. 数据库----ORACLE和MYSQL数据库简介

    一.什么是数据库? 数据库(Database---DB)按照组织.储存和管理数据的仓库.(理解以下三个概念)   数据(Data)用来描述事物的记录都可称数据,如文字音乐图像.   数据库系统(Dat ...

随机推荐

  1. C#打印100以内质数

    bool b = false; ; i < ; i++) { ; j < i; j++) { ) { b = false; break; } else { b = true; } } if ...

  2. Java:基础

    Hello World //HelloWorld.java文件 public class HelloWorld { public static void main(String[] args) { S ...

  3. flappy pig小游戏源码分析(4)——核心pig模块(未完待续)

    热身之后,我们要动点真格的了,游戏叫flappy pig,我们的pig终于要出场了. 老规矩,看看目录结构,读者对着目录结构好好回想我们已经讲解的几个模块: 其中game.js是游戏主程序,optio ...

  4. 转载 SharePoint开发部署WSP解决方案包

    转载原出处: http://642197992.blog.51cto.com/319331/1582731 注:本文所讲内容以SharePoint2013版本为例,开发工具以VS2013为基础.历史版 ...

  5. [html][转]常用返回顶部代码

    转至:http://jingyan.baidu.com/article/7082dc1ca6b928e40a89bd1a.html 一.使用HTML的锚标记最简单了 但是唯一的缺点就是样式不怎么样,会 ...

  6. js难点之闭包理解

    如何从外部读取局部变量? 闭包就是能够读取其他函数内部变量的函数. 由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”. 所以 ...

  7. cocos2d-x 纹理深入研究

    转自:http://blog.csdn.net/qq51931373/article/details/9152227 1.纹理控制. 看此代码: CCSprite *pSprite = CCSprit ...

  8. 3、VS2010+ASP.NET MVC4+EF4+JqueryEasyUI+Oracle项目开发之——用户登录

    近期因为项目赶着上线,一直没时间接着写博客,今天最终空出了时间.声名:我不是专业美工,所以界面问题,希望大家不要拍砖.登录界面例如以下: 在ASP.NET MVC中,要新增一个功能,我们首先要加入一个 ...

  9. BZOJ 2150: 部落战争 最大流

    2150: 部落战争 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...

  10. 新闻客户端nices

    https://github.com/android-cjj/nices