[数据库]Oracle和mysql中的分页总结
* 每次只查询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 行。

=======================================逻辑分页=======================================================
逻辑分页
* 一次性将数据库中所有记录都查询出来,存放到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中的分页总结的更多相关文章
- oracle数据库不支持mysql中limit功能
oracle数据库不支持mysql中limit功能,但可以通过rownum来限制返回的结果集的行数,rownum并不是用户添加的字段,而是oracle系统自动添加的. (1)使查询结果最多返回前10行 ...
- 如何将DB2的数据库转换到mySQL中?
经过几次尝试最终找到解决的办法,因为网上并没有详细说明,所以下面我将详细的步骤记录如下: 1. 大前提是你已经安装好DB2服务器和mySQL服务器,现在只是借用Navicat for MySQL这个软 ...
- 非空校验在oracle和mysql中的用法
oracle判断是否为null nvl(参数1,参数2) :如果参数1为null则返回参数2,否则返回参数1 mysql判断是否为null ifnull(参数1,参数2) :如果参数1为null则返回 ...
- MySQL中的分页操作结合python
mysql中的分页操作结合python --分页: --方式1: ;-- 读取十行 , --从第十行读取 往后再读十行 --方式2: offset ; --从第二十行开始读取10行 -- 结合pyth ...
- 各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包----转
在开发基于数据库的应用系统时,需要在项目中进行数据源的配置来为数据 库的操作取得数据库连接.配置不同数据库的数据源的方法大体上都是相同的,不同的只是不同数据库的JDBC驱动类和连接URL以及相应的数据 ...
- 数据库Oracle和MySQL 的不同
实例区别: MySQL是轻量型数据库,开源免费.Oracle收费,这个不是重点,,重点是它贵. MySQL一个实例可以操作多个库,而Oracle一个实例只能对应一个库. MySQL安装只有300多兆, ...
- 优化 MySQL 中的分页
英文:Robert Eisele 译者:Giraffe 链接:http://yemengying.com/2016/05/28/optimized-pagiantion-mysql/ 一道面试的问题, ...
- Oracle和Mysql中的字符串的拼接
SQL允许两个或者多个字段之间进行计算,字符串类型的字段也不例外.比如我们需要 以"工号+姓名"的方式在报表中显示一个员工的信息,那么就需要把工号和姓名两个字符 串类型的字段拼接计 ...
- 数据库----ORACLE和MYSQL数据库简介
一.什么是数据库? 数据库(Database---DB)按照组织.储存和管理数据的仓库.(理解以下三个概念) 数据(Data)用来描述事物的记录都可称数据,如文字音乐图像. 数据库系统(Dat ...
随机推荐
- C#打印100以内质数
bool b = false; ; i < ; i++) { ; j < i; j++) { ) { b = false; break; } else { b = true; } } if ...
- Java:基础
Hello World //HelloWorld.java文件 public class HelloWorld { public static void main(String[] args) { S ...
- flappy pig小游戏源码分析(4)——核心pig模块(未完待续)
热身之后,我们要动点真格的了,游戏叫flappy pig,我们的pig终于要出场了. 老规矩,看看目录结构,读者对着目录结构好好回想我们已经讲解的几个模块: 其中game.js是游戏主程序,optio ...
- 转载 SharePoint开发部署WSP解决方案包
转载原出处: http://642197992.blog.51cto.com/319331/1582731 注:本文所讲内容以SharePoint2013版本为例,开发工具以VS2013为基础.历史版 ...
- [html][转]常用返回顶部代码
转至:http://jingyan.baidu.com/article/7082dc1ca6b928e40a89bd1a.html 一.使用HTML的锚标记最简单了 但是唯一的缺点就是样式不怎么样,会 ...
- js难点之闭包理解
如何从外部读取局部变量? 闭包就是能够读取其他函数内部变量的函数. 由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”. 所以 ...
- cocos2d-x 纹理深入研究
转自:http://blog.csdn.net/qq51931373/article/details/9152227 1.纹理控制. 看此代码: CCSprite *pSprite = CCSprit ...
- 3、VS2010+ASP.NET MVC4+EF4+JqueryEasyUI+Oracle项目开发之——用户登录
近期因为项目赶着上线,一直没时间接着写博客,今天最终空出了时间.声名:我不是专业美工,所以界面问题,希望大家不要拍砖.登录界面例如以下: 在ASP.NET MVC中,要新增一个功能,我们首先要加入一个 ...
- BZOJ 2150: 部落战争 最大流
2150: 部落战争 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- 新闻客户端nices
https://github.com/android-cjj/nices