TOP-N查询(TOP-N分析):就是获取某一数据集合中的前N条记录,实际应用中经常用到。

  Oracle中不支持SELECT TOP语句(MySQL中也没用此语句),需要借助ROWNUM伪列来实现TOP-N查询。

  ROWNUM伪列:是Oracle数据库对查询结果自动添加的一个伪列,编号从1开始。ROWNUM在物理上(查询目标表中)并不存在,是每一次查询过程中动态生成的,所以称为“伪列”。因此,不允许以任何查询基表的名称做为前缀,连接查询中涉及多个物理表,但也只动态生成一个伪列。

1、非排序查询TOP-N分析

例题:返回员工信息表前5条记录

2、排序查询TOP-N分析

  SELECT语句的执行顺序:先WHERE,后ORDER BY

例题:按照工资降序排序,查询工资最高的前5名员工的信息。

错误答案:

正确答案:

  内层排序,外层设定范围(WHERE只能设定从1开始的范围)。如rownum<=5,不能设定这样的范围,如rownum<=13 and rownum>=18)

  子查询和主查询分别会产生各自的ROWNUM伪列,而此处用的是主查询自己的伪列。为了分析,请看下面的语句:

  “原始行号”rn是子查询结果排序之前的行号(子查询执行力WHERE子句,但没有执行ORDER BY子句时的行号),结果如下:

3、分页查询(应用极广)

  分页显示的目的是控制输出结果集大小,将结果尽快返回。

例题:按照工资逆序、分页显示员工信息,每页显示6行记录。假定当前要显示第3页(即13~18行),应如何获取该页数据?

错误答案:该代码不会返回任何查询结果。

  分析:ROWNUM自动编号从1开始。主查询执行时,取出子查询结果集中的第一条记录,并将其ROWNUM赋值为1,不符合WHERE限定的条件(13~18),于是这条记录被过滤掉。取出子查询结果集中的第二条记录,并将其ROWNUM赋值为1(因为前面没有找到过符合WHERE条件的记录),依次类推,永远也得不到符合条件的记录。(我们永远也无法绕过第一个,而直接去吃到第二个馒头)

正确答案:加一层嵌套查询,对子查询中的ROWNUM的值进行“固化”处理(使得rn是物理上存在的),在主查询中即可对其进行任意范围的取值判断。

  最内层排序(ORDER BY),中间层“固化”ROWNUM,最外层设定范围(WHERE中可以设定任意范围)。

  

select * from (select rownum r,t1.* from (select * from emp order by sal desc) t1) t2 where t2.r between 6 and 10;

优化后:

正确写法:select * from (select rownum r,t1.* from (select * from emp order by sal desc) t1 where rownum<=10) t2 where t2.r>=6; (减少了t1表返回的数据,有优化作用)

错误写法:select * from (select rownum r,t1.* from (select * from emp order by sal desc) t1 where t1.rownum<=10) t2 where t2.r>=6;(rownum是伪列,前面不能加表名修饰)

错误写法:select * from (select rownum r,t1.* from (select * from emp order by sal desc) t1 where r<=10) t2 where t2.r>=6;(r在where中,而where是最先执行的,之前并没有执行rownum r,所以导致where中的r不能被识别)

ORACLE中的TOP-N查询(TOP-N分析)、分页查询的更多相关文章

  1. oracle 的分页查询与mysql 的分页查询

    oracle 的分页查询: select * from (select o.*,rownum rn  from Persons o) where rn >40 and rn <=60 : ...

  2. Oracle分页查询和SQL server分页查询总结

    分页查询是项目中必不可少的一部分,难倒是不难,就是这些东西,长时间不用,就忘的一干二净了.今天特此总结一下这两款数据库分页查询的实现过程(只记录效率比较高的) 一.Oracle中的分页查询 1.通用分 ...

  3. Hibernate第十篇【Hibernate查询详解、分页查询】

    前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式-.到目前为止,我们都是使用一些简单的主键查询阿-使用HQL查询所有的数据-.本博文主要讲解Hibernate的查询操 ...

  4. elasticsearch查询之大数据集分页查询

    一. 要解决的问题 search命中的记录特别多,使用from+size分页,直接触发了elasticsearch的max_result_window的最大值: { "error" ...

  5. Mybatis-plus多表关联查询,多表分页查询

    学习plus真的觉得写代码真的越来越舒服了.昨天开始接触吧,只要学会了多表关联查询.plus就能随意搭配使用了. 关于怎么搭建的就自行了去研究了哦.这里直接进入主题. 我用的是springboot+m ...

  6. Oracle中根据当前时间和活动类型去数据库查询活动id

    活动类型默认是1,代表邀请好友 select * from t_invite_activityinfo twhere sysdate >= t.begintime and sysdate< ...

  7. MySQL、SqlServer、Oracle三大主流数据库分页查询

    在这里主要讲解一下MySQL.SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法.可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用 ...

  8. JDBC在Java Web中的应用——分页查询

    分页查询 通过JDBC实现分页查询的方法有很多种,而且不同的数据库机制也提供了不同的分页方式,在这里介绍两种非常典型的分页方法. 通过ResultSet的光标实现分页 通过ResultSet的光标实现 ...

  9. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  10. oracle中row_number和rownum的区别和联系(翻译)

    http://www.tuicool.com/articles/bI3IBv 附问题:有以下一个SQL语句: SELECT * FROM ( SELECT t.*, row_number() OVER ...

随机推荐

  1. java:Maven(Maven_ssm)

    1.maven_ssm: DOS命令向maven仓库导入jar包: mvn install:install-file -Dfile=F:\jars\json-lib-2.4-jdk15.jar -Dg ...

  2. Sqlserver实现故障转移 — 域控(1)

    一  .实现目的:实现两台sqlserver数据库服务器的实时备份及故障转移:即:其中一台数据库服务器宕机后,应用程序可自动连接到另一台数据库服务器继续运行. 二.域控:域控制器是指在“域”模式下,至 ...

  3. 人工智能AI------有限状态机、分层状态机、行为树

    https://www.cnblogs.com/zhanlang96/p/4793511.html 人工智能遵循着:感知->思考->行动决策方法:有限状态机(Finite-State Ma ...

  4. 2D轮播图

    目录结构 index.html <!DOCTYPE html><html lang="en"><head> <meta charset=& ...

  5. python基础语法之集合set

    1 概念 集合是一个无需的,不重复的数组组合,它的主要作用如下: 去重,将一个列表装换成集合,会将其去重 关系测试,测试两组数据的交集,差集,并集等关系. 集合对象是一组无需排列的可哈希的值,集合成员 ...

  6. python 生成器、三元表达式、列表推倒式、字典生成式、生成器表达式(总结)

    1.生成器 def func(): yield g = func() next(g) x = yield 2.三元表达式 res = x if 条件 else y 3.列表推导式,字典生成式,生成器表 ...

  7. 第六周课程总结&试验报告(四)

    一.实验目的 (1)掌握类的继承方法 (2)变量的继承和覆盖,方法的继承,重载和覆盖实现 二.实验内容 三.实验过程 1. 实验源码 package test; import java.util.Sc ...

  8. 【Linux 网络编程】字节序和地址装换

    (3)字节序    <1>大端字节序        最高的有效位存储于最低内存地址处,最低有效位存储于最高内存地址处.    <2>小端字节序        最高的有效位存储于 ...

  9. Websocket --(2)实现

    首先声明,本篇博文参考文章 https://blog.csdn.net/jack_eusong/article/details/79064081 主要在于理解和自己动手搭建环境,自己搭建的过程中会发生 ...

  10. 【挣扎失败】2019CSP-S 游记

    妈耶…… 今年是作为高中生参赛的第一年……然而…… 心痛 洛谷评分,一橙一蓝两紫两黑 我个菜鸡瑟瑟发抖 在考完后三天的信息课码的,刚写没几个字就要下课了 抽空把这个写完