`

面试常见题目之一:常见数据库的分页

阅读更多

>>1)

 

转:
http://www.mianwww.com/html/2009/10/4997.html

 

说一下mysql, oracle等常见数据库的分页实现方案?
数据库面试题专栏

1.Oracle:
select * from ( select row_.*, rownum rownum_ from ( query_SQL ) row_ where rownum =< max) where rownum_ >= min
2.SQL Server:
select top @pagesize * from tablename where id not in (select top @pagesize*(@page-1) id from tablename order by id) order by id

3.MySQL
select * from tablename limit position, counter

4.DB2
select * from (select *,rownumber() as ROW_NEXT from tablename) where ROW_NEXT between min and max

——————————————————————————————–
1.分页方案一:(利用Not In和SELECT TOP分页)效率次之
语句形式:
SELECT TOP 10 * FROM TestTable
WHERE(ID NOT IN (SELECT TOP 20  id FROM  TestTable  ORDERBY  id))   ORDERBYID
SELECT  TOP 页大小 * FROM TestTable
WHERE( ID NOT IN (SELECT  TOP  每页大小-1*待查询页数-1  id  FROM  表 ORDERBY  id)) ORDERBYID
思路:先查询出待查询页之前的全部条数的id,查询ID不在这些ID中的指定数量条数

2.分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高
语句形式:
SELECT  TOP  10 *   FROM  TestTable
WHERE(ID>(SELECT MAX(id) FROM(SELECT TOP20 id  FROM  TestTable ORDERBYid)AS T))ORDERBY ID
SELECT  TOP  页大小* FROM  TestTable
WHERE(ID>(SELECT MAX(id) FROM(SELECT TOP 每页大小*待查询页数-1  id FROM 表  ORDERBY id)AS T)) ORDERBY ID
思路:先获得待查询页的之前全部条数id,获得它们当中最大的ID号,以此最大ID号为标志,查找比这个ID号大的指定条数

3.分页方案三:
SELECT TOP PageSize * FROM(SELECT TOP nPage*PageSize * from YOURTABLE order by id)as a order by id desc
SELECT TOP 每页条数 * FROM (SELECT TOP 待查询页*每页条数) * from YOURTABLE order by id)as a order by id desc
思路:先正排序查询出待查询页之前(包括当前页)的全部条数,然后将其倒排序,取指定条数

>>2)

转:http://blog.csdn.net/guyong1018/archive/2008/03/14/2183057.aspx

数据库分页查询
在这里主要讲解一下MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法。可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用总结归纳一下,以方便大家查询使用。
下面就分别给大家介绍、讲解一下三种数据库实现分页查询的方法。
一、       MySQL 数据库分页查询
MySQL数据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到sql语句后面就行了。
LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数。例如:
select * from table WHERE … LIMIT 10; #返回前10行
select * from table WHERE … LIMIT 0,10; #返回前10行
select * from table WHERE … LIMIT 10,20; #返回第10-20行数据
 
二、       SQLServer数据库分页查询
SQLServer数据库又分为SQLServer2000和SQLServer2005。一般比较简单的方法是通过TOP函数来实现。如下:
SELECT TOP 10 * FROM sql WHERE (
code NOT IN  (SELECT TOP 20 code  FROM TestTable  ORDER BY id))
 ORDER BY ID
这条语句,从理论上讲,整条语句的执行时间应该比子句的执行时间长,但事实相反。因为,子句执行后返回的是20条记录,而整条语句仅返回10条语句,所以影响数据库响应时间最大的因素是物理I/O操作。而限制物理I/O操作此处的最有效方法之一就是使用TOP关键词了。TOP关键词是SQL SERVER中经过系统优化过的一个用来提取前几条或前几个百分比数据的词。
以上语句的有一个致命的缺点,就是它含有NOT IN字样,要换成用not exists来代替not in,二者的执行效率实际上是没有区别的。
在以上分页算法中,影响我们查询速度的关键因素有两点:TOP和NOT IN。TOP可以提高我们的查询速度,而NOT IN会减慢我们的查询速度,所以要提高我们整个分页算法的速度,就要彻底改造NOT IN,同其他方法来替代它。
我们知道,几乎任何字段,我们都可以通过max(字段)或min(字段)来提取某个字段中的最大或最小值,所以如果这个字段不重复,那么就可以利用这些不重复的字段的max或min作为分水岭,使其成为分页算法中分开每页的参照物。在这里,我们可以用操作符“>”或“<”号来完成这个使命。如:

Select top 10 * from table1 where id>200

  于是就有了如下分页方案:

select top 页大小 *

from table1

where id>

      (select max (id) from

      (select top ((页码-1)*页大小) id from table1 order by id) as T

       )   

  order by id
 
这种方法执行多少始终没有大的降势,后劲仍然很足。尤其对于数据量大的时候,该方法执行速度一点也不会降低。
使用TOP要求主键必须唯一,不能是联合主键。如果是联合主键,则查询出的结果会乱序的。
目前SQLServer2005提供了一个row_number()函数。ROW_NUMBER() 就是生成一个顺序的行号,而他生成顺序的标准,就是后面紧跟的OVER(ORDER BY ReportID),其中ReportID可以是联合主键。下面,我们看看怎么具体应用这个RowNo进行分页.
SELECT TOP 10 *  FROM
(
       SELECT top 10 ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo
       FROM TABLE
      ) AS A
      WHERE RowNo > " + pageIndex*10
pageIndex就是我们需要数据的页数.
 
但对于SQLServer2000的话,如果是联合主键,我还没有解决办法,如果大家有可跟我联系。谢谢大家了。
 
三、       ORCALE数据库分页查询
ORCALE数据库实现分页查询可以使用row_number()函数或者使用rownum 虚列两种方法。
第一种:利用分析函数row_number() 方法
select * from(
select t.*,row_number() over (order by t1.id) rowno from TABLE1
)
where rowno between 21 and 40;
 
第二种:直接使用rownum 虚列
select * from
(select t.*,rownum as rowno from TABLE1 )
where rowno between 10 and 20
这两种方法比较,显然第二种方法比较好。因为不用order by语句,会提高检索数据的速度的,尤其数据量越大时,第二种方法快速检索数据越明显。
最后提醒大家:oracle中慎用带有order by的分页。尤其是在oracle10g中,会出现会引起混乱,即相同记录会出现在不同页中。
 
结束语:
希望这篇文章不仅能够给大家的工作带来一定的帮助,也希望能让大家能够体会到分析问题的方法;最重要的是,希望这篇文章能够抛砖引玉,掀起大家的学习和讨论的兴趣,以共同促进。还有其中红色的字如果谁知道解决办法请告诉我,我会尽快补上的。

 

分享到:
评论

相关推荐

    sqlserver数据库著名上级面试题目

    以下是一些常见面试题目的详细解答,涵盖了数据检索、表复制、数据转换以及临时表的使用等知识点。 1. **查询特定范围的记录** - 当需要查询第30到第40条记录时,可以使用`ROW_NUMBER()`函数配合子查询。方案一和...

    Sql常见面试题(总结)

    ### SQL常见面试题总结 #### 一、ROWNUM 使用技巧 **题目背景:** ROWNUM 是一个伪列,用于返回表中行的编号。它常用于限制查询结果的行数,例如在分页查询中。 **示例代码:** ```sql -- 示例1:查询最高薪水的...

    数据库试题 经典 数据库试题 经典

    这种结构的优点之一是存储密度大,因为不需要额外的空间来维护数据之间的关系。因此,正确答案是D: 存储密度大。 **18. 以下哪个描述不符合二叉树的特点?** - A: 每个节点最多有两个子节点 - B: 节点的左子树和右...

    常见的笔试和面试题目,涵盖了数据结构、算法、操作系统、网络、数据库.pdf

    ### 常见的笔试和面试题目解析 #### 数据结构与算法 1. **数组与字符串** - **反转一个字符串**: - 字符串是不可变对象,在大多数编程语言中,通常需要借助额外的数据结构(如数组或列表)来实现字符串的反转。...

    sqlserver 面试时的考题

    - **解析**: 查询优化是SQL Server面试中的常见问题之一,可以采取以下措施: - 对查询语句进行分析,找出其中的瓶颈所在,例如是否涉及到大量表的连接操作。 - 使用索引来加速查询,特别是对经常作为查询条件的列...

    笔试题目集锦(各大公司笔试面试题目)

    在IT行业中,笔试题目是求职者进入心仪公司的第一道关卡,它涵盖了各种技术领域,如编程语言、数据结构、算法、操作系统、网络、数据库等。这份“笔试题目集锦”无疑是为准备应聘IT岗位的朋友提供了宝贵的参考资料。...

    数据库面试题大集合

    ### 数据库面试题详解 #### 一、Oracle与SQL Server 的基本对比 - **SQL Server 2005**:这是微软公司推出的一款关系型...以上内容涵盖了常见的数据库面试题目及其解答,可以帮助求职者更好地准备面试,提高竞争力。

    持续更新, 整理mysql、oracle数据库相关 笔试面试题,主要为了应对面试过程中遇到的sql题目

    在IT行业中,数据库是至关重要的组成部分,特别是在存储和管理数据方面。MySQL和Oracle是两种广泛使用的数据库管理系统(DBMS),...不断地学习和练习SQL题目,不仅可以加深对数据库的理解,也有助于在面试中脱颖而出。

    php课程(共100多节)

    77:Zend framework数据库操作之编辑和视图函数 78:PHP+Flash多文件异步上传 swfupload 79:PHP上传RAR压缩包并解压目录 80:ADODB PHP 数据库万能引擎类(上) 81:ADODB PHP 数据库万能引擎类(下) 82:PHP开发...

    android面试题目几套

    以下是对"android面试题目几套"中可能涉及的一些核心知识点的详细解释: 1. **Android基础知识** - **四大组件**:Activity(活动)、Service(服务)、BroadcastReceiver(广播接收器)和ContentProvider(内容...

    经典sql面试题目(另一个)---无私奉献了!

    以下是一些基于"经典sql面试题目(另一个)---无私奉献了!"这一主题的关键知识点,这些知识点可能会出现在面试中,同时也是数据库和编程领域的重要基础。 1. **SQL语言基础**:SQL(Structured Query Language)是...

    c#面试经典题目

    在准备C#面试时,了解这些经典题目可以帮助你更好地掌握核心概念和技术。以下是一些关键知识点的详细说明: 1. **jQuery框架**:jQuery简化了JavaScript的DOM操作、事件处理和动画。Easy-UI和ExtJS是基于jQuery的UI...

    数据库面试题.docx

    【数据库面试题】 在数据库领域,面试中常常会涉及到各种...以上是面试中常见的数据库相关知识点,涵盖了 MySQL 和 Oracle 的核心特性以及 SQL 基础知识。理解和掌握这些内容对于数据库管理员和开发者来说至关重要。

    数据库面试必备.docx

    以下是对一些常见面试题目的详细解答和相关知识点的阐述: 1. **根据部门号从高到低,工资从低到高列出每个员工的信息**: - 使用`ORDER BY`子句进行排序,先按部门号降序(`DEPARTMENT_ID DESC`),再按工资升序(`...

    计算机专业类面试题目

    以下是对这些面试题目的详细解析: 1. **程序局部性**:程序在执行时表现出的局部性原理,分为时间局部性和空间局部性。时间局部性是指程序近期访问过的指令或数据在未来一段时间内可能还会被访问;空间局部性则是...

    ASP.NET面试题目

    ### ASP.NET面试题目解析 #### 1. TreeView控制思路 - **知识点说明**:在ASP.NET Web Forms中,`TreeView` 控件常用于显示层次结构的数据,如站点地图、目录结构等。 - **详细解释**:`TreeView` 控件通过绑定数据...

    比较笼统)华为面试题目总结

    华为作为全球领先的电信解决方案供应商,其面试题目往往涵盖广泛,不仅包含技术性问题,还可能涉及项目管理、团队协作、解决问题的能力等方面。以下是对华为面试可能涉及的一些核心知识点的详细阐述: 1. **计算机...

    java面试题

    - **延迟加载**是指当从数据库中查询某个实体时,与之关联的其他实体并不是立即加载的,而是在真正需要的时候才加载。 - 当Session关闭后,如果尝试访问延迟加载的对象,Hibernate会抛出异常。解决方法是确保在...

    ASP.NET面试题目,有答案的

    以下是一些常见的ASP.NET面试题目及其解答: 1. **什么是ASP.NET?** ASP.NET是一种用于构建动态网站、Web应用和Web服务的技术,它简化了Web开发过程,提供了丰富的控件、自动状态管理以及事件驱动模型。 2. **...

    Mybatis面试题合集及答案常见题目经典精选汇总大全.docx

    Mybatis 是一款流行的持久层框架,它简化了 Java 开发中的数据库操作,通过 XML 或注解的方式配置 SQL 映射,实现了 SQL 语句与 Java 代码的分离,提高了代码的可读性和可维护性。以下是一些关于 Mybatis 面试常问...

Global site tag (gtag.js) - Google Analytics