[数据库]Oracle和mysql中的分页总结

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
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只能使用< <=; 不能使用> >= 如下使用>=就报错.

这个和行号的生成原理有关系,OracleMysql都是基于行的行式数据库,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; // 当前页需要数据
}
复制代码

 

 


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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
35 5
|
2天前
|
SQL 关系型数据库 MySQL
排序与分页——“MySQL数据库”
排序与分页——“MySQL数据库”
|
2天前
|
SQL 关系型数据库 MySQL
MySQL环境搭建——“MySQL数据库”
MySQL环境搭建——“MySQL数据库”
|
2天前
|
SQL NoSQL 关系型数据库
初识MySQL数据库——“MySQL数据库”
初识MySQL数据库——“MySQL数据库”
|
4天前
|
关系型数据库 MySQL 数据库
数据库基础(mysql)
数据库基础(mysql)
|
4天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
32 3
|
5天前
|
存储 关系型数据库 MySQL
【后端面经】【数据库与MySQL】为什么MySQL用B+树而不用B树?-02
【4月更文挑战第11天】数据库索引使用规则:`AND`用`OR`不用,正用反不用,范围中断。索引带来空间和内存代价,包括额外磁盘空间、内存占用和数据修改时的维护成本。面试中可能涉及B+树、聚簇索引、覆盖索引等知识点。MySQL采用B+树,因其利于范围查询和内存效率。数据库不使用索引可能因`!=`、`LIKE`、字段区分度低、特殊表达式或全表扫描更快。索引与NULL值处理在不同数据库中有差异,MySQL允许NULL在索引中的使用。
10 3
|
7天前
|
关系型数据库 MySQL 数据库连接
Django(四):Django项目部署数据库及服务器配置详解(MySQL)
Django(四):Django项目部署数据库及服务器配置详解(MySQL)
29 11
|
8天前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
32 7
|
16天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)

推荐镜像

更多