`
agileai
  • 浏览: 60406 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

主流数据库分页查询介绍

阅读更多

1 背景概述

     由于在项目中需要在页面上显示数量非常多的数据, 在进行数据库查询时首先会把所有的数据都查询出来,然后在进行显示,这时候分页查询的操作就必不可少了,本文介绍Mysql、Oracle、sql Server 三种数据库进行分页查询的用法。

2 预期读者

  1. 数通畅联内部员工

  2. 广大计算机爱好者

3 名词解释

  • 分页查询

    就是将将过多的结果在有限的界面上分多页来显示,一般将分页查询分为两类:逻辑分页、物理分页。
    逻辑分页是在用户第一次访问时,将数据库的所有记录全部查询出来,添加到一个大集合中,然后存放在session对象,再通过页码计算出当前页需要显示的数据内容,存储到一个小的list的集合中,并将其存储到request对象中,跳转到JSP页面,进行遍历显示。 当用户第二次访问时,只要不关闭浏览器,还会从session中获取数据,来进行显示。因为此种方法是在内存的session对象中进行计算分页显示的,而不是真正的将我们数据库进行分页的,所以叫做逻辑分页。
    缺点:如果需要查询的数据量过大,session将耗费大量的内存;因为是在session中获取数据,如果第二次或者更多此的不关闭浏览器访问,会直接访问session,从而不能保证数据是最新的。
    优点:统一代码处理方式,较容易跨数据库做迁移。
    物理分页,使用数据库自身所带的分页机制,例如,Oracle数据库的rownum,或者Mysql数据库中的limit等机制来完成分页操作。因为是对数据库的数据进行分页条件查询,所以叫物理分页。每一次物理分页都会去连接数据库。
优点:数据能够保证最新,由于根据分页条件会查询出少量的数据,所以不会占用太多的内存。

  • CTE(Common Table Expression,公用表表达式)

    该表达式源自简单查询,可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。与派生表的不同之处在于,CTE 可自引用,还可在同一查询中引用多次。

4 实现思路

    通过物理分页的方法进行数据库查询。

5 实现步骤

    首先通过开发平台新建一个工程,使用新工程中的系统日志模块作为样例,进行mysql和oracle的分页查询功能

5.1 Mysql

  • 在数据库中进行操作:

    mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通用形式:


select o.* from (sql) o limit firstIndex,pageSize

    其中的sql可以是单表查询的结果也可以是多表查询的结果
    firstIndex为显示结果的起始位置(mysql是从0作为起始位置的)
    pageSize为显示记录数
    直接对表进行查询如下,我们可以看到查询时间是0.005s

wKiom1ZWxEzyLKXTAAFgdhCyTRA028.png
    采用分页查询,一页显示15条数据,查询时间是0.001s

wKiom1ZWxGfi1Z6XAAEhlBl71_o675.png

  • 在工程中体现:

    首先在工程中找到SystemLogQueryImpl.java这个类

wKioL1ZWxNvDmBY7AAExoJghKhM210.png
    其中有一点需要注意,方法的返回值需要是PageList而不是List

wKioL1ZWxOuyt7ofAABEQ7x8kFU895.png
    在开发平台中这个类是日志功能的服务实现类,

wKiom1ZWxKDyDyjzAADV6sAMsEI607.png
    其中,ec_p为页数,ec_rd为显示记录数
    staratNum为起始索引,endNum为结束索引
    由于MySQL的起始索引是从0开始的,需要对得到的起始索引减一,显示记录数的计算方法为: 结束索引-起始索引+1
    在sqlMap中的体现如图:

wKioL1ZWxTyxmGmsAABu1e4h08g720.png
    在页面上的显示:

wKiom1ZWxL3jxZN1AAJsyRTenA4851.png
    可以在页面选择显示的页码和记录数


wKioL1ZWxV_yyYUqAAITrx3PwK4963.png

5.2 Oracle

    Oracle的查询方法有两种:ROWNUM、row_number()

5.2.1 ROWNUM

  • 在数据库中进行操作:

    查询语句通用形式:

select * from(select o.*,ROWNUM num from(sql) o where ROWNUM<=(endIndex)) where num>=firstIndex

    直接对表进行查询,耗时16msecs

wKiom1ZWxRrgAFFFAAGBuwyMzgg868.png
    采用分页算法进行查询是,耗时7msecs

wKiom1ZWxTuCsMErAAFzkHwvvDE101.png

  • 在工程中体现:

    找到对应的服务实现类:

wKioL1ZWxbDQ9xqGAADfO5TPyhA052.png
    服务实现类的内容:

wKioL1ZWxcKiwi8qAADWA1mhjNE951.png
    startNum为起始索引,endNum为结束索引
    因为ROWNUM方法中使用的两个参数一个是起始索引,一个是结束索引,所以可以直接使用。
    在sql中的体现:

wKiom1ZWxZCR8D2fAACAZuXDq5E822.png
    在页面上的效果:


wKiom1ZWxaLTxlNXAAJTaKV23Es068.png

5.2.2 row_number()

    查询语句通用形式:

select * from(select * from(select t.*,row_number() over(order by orderColumn) as rownumber from(sql) t) p where p.rownumber>firstIndex) where rownum<=pageSize

    直接对表进行查询,耗时22msecs

wKioL1ZWxhiyv9DbAAGOT9Hy9VU701.png
    使用分页查询语句进行查询,耗时12msece

wKioL1ZWxifCf9ARAAF8AFn5kak829.png

  • 在工程中体现:

    服务实现类的内容和ROWNUM一样,区别在sql中

wKiom1ZWxdiy5qlEAACCfjKR4aI046.png
    由于在sql中添加了order by排序函数,查询速率会变慢,所以在开发平台中不采用这种方法。
    对于oracle的分页查询,他们的主要区别是:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而函数row_number()在包含排序从句后是先排序再计算行号码。

5.3 Sqlserver

    由于sqlserver版本比较多,分页查询的方式也有不同之处

5.3.1 Sqlserver 2005/2008中使用row_number()

    查询通用形式:

SELECT * FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY orderColumn) AS RowNumber FROM tableName) EmployeePage WHERE RowNumber > =startIndex AND RowNumber <= endIndex ORDER BY orderColumn
GO

    直接查询表,如图
 
wKiom1ZWxemDqCrvAADyKIPc_dg843.png
    使用分页查询,如图


wKioL1ZWxleTcvrtAAFHeeg7BBk002.png

5.3.2 SQL 2005/2008用CTE的方式实现

     查询通用形式:

WITH EmployeePage AS (SELECT *,ROW_NUMBER() OVER (ORDER BY orderColumn) AS RowNumber FROM tableName)
SELECT *FROM EmployeePage WHERE RowNumber > =firstIndex AND RowNumber <= endIndex ORDER BY orderColumn
GO

     使用分页查询,如图:

wKiom1ZWxgugzuvTAAF-BfdWcHw429.png

5.3.3 SQL SERVER 2012支持了OFFSET

    查询通用形式,如下:

SELECT * FROM tableName
ORDER BY orderColumn
OFFSET (page-1) ROWS FETCH NEXT size ROWS ONLY

    Page指需要显示的页数
    Size指需要显示的记录数
     由于本人现在没有sqlserver 2012的数据库,暂时无法做性能的测试

6 附件及说明

    附件中有两个样例工程pagingquery4mysql和pagingquery4oracle,使用最新版的aeai dp开发平台导入后查看使用。

主流数据库分页查询介绍文档及附件       下载

分享到:
评论

相关推荐

    数据库分页SQL语句实现

    本文将详细介绍三种主流数据库(SQL Server、MySQL和Oracle)中的分页SQL语句实现方法。 #### SQL Server 的分页SQL语句实现 SQL Server 支持通过`TOP`关键字来实现分页查询。具体实现方式如下: 1. **查询第M页...

    用于oracle,mysql,sqlserver,数据库分页联合查询

    这通常是一个Java类,用于处理数据库分页查询的逻辑。它可能包含方法如`getPageData(int pageNum, int pageSize)`,用于接收当前页码和每页大小,然后构建对应的SQL语句并执行,返回分页后的数据。这个类还可能有...

    SSH实现分页实例

    3. 使用Hibernate的HQL或Criteria查询实现数据库的分页操作。 4. 将分页结果传递给视图层,展示数据并生成分页导航。 5. 如有MyBatis参与,需编写分页SQL并在Mapper中执行。 掌握这些步骤和相关技术,你就能在SSH...

    三大数据库分页总结

    本文将深入探讨Oracle、MySQL和SQL Server这三大主流数据库系统中如何进行分页查询。 首先,我们来看Oracle数据库的分页方法。Oracle使用`ROWNUM`伪列来实现分页,但是需要注意的是,`ROWNUM`在查询时会先生成所有...

    3种数据库分页技术.pdf

    数据库分页技术是数据库管理系统中用于处理大量数据查询时,以分批次的方式返回结果集的一种策略,这有助于提高用户体验并减少服务器的负载。本文将详细探讨三种常见的分页技术,适用于MySQL、SQL Server 2000/2005 ...

    资料种数据库分页技术.pdf

    本篇资料主要介绍了在MySQL、SQLServer2000/2005和Oracle这三种主流数据库中实现分页查询的不同方法。 在SQLServer中,分页查询可以通过`TOP`关键字实现。例如,要获取第10到20条记录,可以使用以下查询: ```sql ...

    三大数据库的分页语句

    本篇文章将深入探讨Oracle、MySQL和SQL Server这三大主流数据库系统的分页查询语句。 1. **Oracle数据库** Oracle数据库提供`ROWNUM`关键字进行分页。`ROWNUM`为每行分配一个唯一的数字,从1开始。例如,要获取第1...

    Sqltoy ORM框架之:分页查询(没错包含你所有所有能用到的关系型数据库分页)

    SqlToy提供了全面的分页查询支持,适用于MySQL、Oracle、SQL Server、PostgreSQL等主流数据库系统。其核心思想是通过动态SQL生成和优化查询语句,避免硬编码分页参数,从而提高代码的可维护性和复用性。 首先,...

    数据库分页大全,oracle,sqlserver,mysql

    ### 数据库分页技术详解:Oracle、SQL Server、MySQL #### 一、引言 在进行数据查询时,为了提高用户体验以及系统性能,通常需要对数据进行分页处理。不同的数据库管理系统(Database Management System,DBMS)...

    sqlserver,mysql,oracle三种数据库的分页查询

    本文将深入探讨SQL Server、MySQL和Oracle这三种主流数据库系统中的分页查询实现方式。 首先,我们来看SQL Server。SQL Server提供了一种称为"TOP"的关键字来实现分页。例如,如果我们想获取第1页(假设每页有10条...

    几种数据库的数据分页

    本文将详细介绍MySQL、SQL Server、Oracle以及DB2四种主流数据库中的分页实现方法。 #### MySQL 分页 在MySQL中,`LIMIT`关键字是实现数据分页的主要手段。其基本语法格式如下: ```sql SELECT * FROM 表名 LIMIT...

    PageHelper分页插件Java

    PageHelper是Java开发中一款非常流行的分页插件,它主要应用于MyBatis框架,能够极大地简化数据库查询的分页操作。在Web应用中,尤其是数据量较大的情况下,分页功能是必不可少的,PageHelper提供了高效且灵活的解决...

    java分页(三种数据库)

    本篇将详细介绍如何在SQL Server、MySQL和Oracle这三种主流数据库中实现Java分页。 一、SQL Server的Java分页 在SQL Server中,可以使用`OFFSET`和`FETCH`关键字实现分页。假设我们有一个名为`users`的表,想要...

    Oracle、MySQL和SqlServe三种数据库分页查询语句的区别介绍

    Oracle、MySQL和SQL Server是三大主流的关系型数据库管理系统,它们各自提供了不同的分页查询语句来实现这一功能。接下来,我们将详细探讨这三种数据库在分页查询上的差异。 一、SQL Server的分页查询 在SQL ...

    数据库分页

    本文将详细介绍三种主流数据库(Oracle、MySQL 和 SQL Server)中的分页实现方式。 #### 一、SQL Server 分页 SQL Server 提供了多种分页的方法,包括使用 `TOP` 关键字、存储过程以及 SQL Server 2005 新增的功能...

    easyui datagrid 分页查询样例

    通常会使用Spring Data JPA或MyBatis等持久层框架,配合SQL语句实现数据库的分页查询。例如,可以使用LIMIT和OFFSET子句在MySQL中获取指定范围的数据。 Maven作为项目构建工具,管理项目的依赖和构建流程。在这个...

    oracle mysql sql server 等数据库的分页要点解析

    分页技术在Oracle、MySQL和SQL Server等主流数据库系统中都有其独特的实现方式。 **为什么需要分页** 1. **方便用户查看**:在网页或应用程序中,如果一次性加载所有数据,用户可能会被海量信息淹没,分页则可以将...

    数据库中的分页

    在Oracle和SQL Server这两个主流的关系型数据库系统中,都有多种方法来实现分页查询。本文将深入探讨这两种数据库的分页实现方式,并结合小程序的实践案例进行说明。 首先,我们来看Oracle数据库中的分页。Oracle...

Global site tag (gtag.js) - Google Analytics