`
tangwenchao86
  • 浏览: 379495 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

SQL语言艺术示例一(rownum)

阅读更多
        这几天我在看《SQL语言艺术》的电子版。
        有这样一个简单的例子:不是经理的员工当中,哪五个人收入最高。“找出不是经理的员工”是其中的关系操作部分,由此获得一个有限的员工集合,然后排序。有些SQL方言通过在select语句中增加特殊子句来限制返回的记录数,很显然,排序和限制记录数都是非关系操作。其他SQL方言(这里主要是指Oracle)则采用另外的机制,即用一个名为rownum的虚拟字段(dummy column)为查询结果编号——这意味着编号工作发生在关系操作阶段。如果查询语句如下:

select empname,salary from employees 
where status != 'EXECUTIVE'
and rownum <= 5
order by salary desc


乍一看好像没问题,但输出结果却不符合要求,并没有返回不是经理的人中“收入最高的五位”,而是返回不是经理的人中“最先被查到的五位”,以收入递减序返回。他们可能恰好是“收入最低的五位”!(这是Oracle实践者都知道的陷阱,大家都中过招。)
现在分析一下上面的代码。查询的关系操作部分仅从employees表中,以完全不可知的顺序,
取出最先发现的五位非经理人员(只包含empname和salary字段)。别忘了关系理论指出,关系
(以及描述关系的表)是无序的,关系中的元组(即记录)可以被存储或检索。上面的查询执
行后,收入最高的非经理人员或许在查询结果中,或许不在,无从知道查询结果是否满足查询
条件。正确的操作是:找出所有的非经理人员,以收入递减排序,然后返回前五条记录。代码如下:

select * from (
select empname,salary from employees 
where status != 'EXECUTIVE'
order by salary desc )
where  rownum <= 5

看来,有些看似关系的概念其实并不属于关系操作的范畴,因为关系操作必须要有关系操作符
的参与。上面的子查询用了order by为结果集排序,而一旦用了排序操作,该数据集就已经不
是关系了(关系是无序的)。于是外层的select看似关系操作,但其实是对一个内嵌视图的结果集进行操作,其中的order by子句早已不是关系操作了。


分享到:
评论

相关推荐

    oracle_SQL中rowid与rownum的使用

    在Oracle SQL中,`ROWID`和`ROWNUM`是两个非常重要的概念,它们在数据库查询和数据操作中起着至关重要的作用。本文将详细探讨这两个特性,包括它们的定义、用途以及如何在实际场景中有效利用它们。 一、ROWID详解 `...

    DM8_SQL语言使用手册.pdf

    第 1 章 结构化查询语言 DM_SQL 简介 ....................................................................1 1.1 DM_SQL 语言的特点 ............................................................................

    rownum用法(不使用minus)

    `rownum` 是 Oracle 数据库中的一个特殊字段,主要用于给查询结果集中的每一行分配一个唯一的序号,该序号从 1 开始递增。`rownum` 的主要用途之一是用于实现分页查询,即控制查询结果的数量。 #### 二、rownum与...

    Oracle中如何用一条SQL快速生成10万条测试数据

    在示例SQL中,使用`to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss')`来生成一个递增的时间戳序列。这里,`sysdate`获取当前系统日期和时间,而`rownum/24/3600`则是将ROWNUM转换为小时数,再转换为天数...

    oracle中rownum的用法及解说

    在Oracle数据库中,`ROWNUM`是一个非常有用的伪列,它可以帮助用户在查询结果集中为每一行分配一个唯一的行号。`ROWNUM`的值从1开始,并随着行的增加而递增。下面将详细介绍`ROWNUM`的基本用法及其在不同场景下的...

    oracle SQL优化实例

    AND rownum (SELECT COUNT(itemid) FROM pt_sche_detail temp WHERE temp.docid = 2281)) AND b.roleid = 1022 AND b.roletype = 1 AND b.posttype = 1; ``` **解释:** 原始查询可能存在多个条件,其中某些条件...

    达梦数据库_SQL语言手册

    ### 达梦数据库(SQL语言手册)关键知识点概览 #### 1. 结构化查询语言DM_SQL简介 ##### 1.1 DM_SQL语言的特点 - **兼容性**: DM_SQL兼容SQL标准,支持ANSI SQL92 Entry Level以及部分扩展。 - **易用性**: 提供了...

    sql server和oracle的存储过程、游标示例

    通过这些示例,我们可以看出SQL Server和Oracle在存储过程和游标方面的基本用法。在实际应用中,根据业务需求,开发者可以灵活地组合和扩展这些基础结构,实现复杂的逻辑和操作。了解并熟练掌握这两大数据库的存储...

    ORACLE与SQLSERVER中的语法区别

    这篇文章将详细介绍 ORACLE 和 SQL Server 中的语法区别,并提供一些实用的示例代码。 SELECT 语句 在 ORACLE 中,SELECT 语句使用 `ROWNUM` 伪列来限制返回的记录数,而在 SQL Server 中,使用 `TOP` 语句。例如...

    Sql常见面试题(总结)

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

    SQL语句教程大全

    SQL(Structured Query Language),即结构化查询语言,是一种用于管理关系型数据库的标准语言。它不仅被用于数据的存储和检索,还广泛应用于数据的更新、删除以及数据库结构的创建与修改。本教程将深入解析SQL的...

    SQL常见面试问题集锦

    - ROWNUM 是 Oracle SQL 中的一个伪列,用于标识查询结果中的行号。 - 在查询语句中,可以直接使用 ROWNUM 进行过滤或排序。 - ROWNUM 的值从 1 开始,并按查询结果中的顺序递增。 2. **ROWNUM 与 ORDER BY 的...

    Linux下定时自动执行Oracle_SQL

    Oracle SQL是Oracle数据库的查询语言,它提供了一系列功能强大的命令和函数,用于数据检索、更新、删除等操作。在自动化场景中,编写SQL脚本来定期执行数据统计或更新,对于数据分析和业务决策具有重要意义。 #### ...

    伪列(pseudo column)ROWNUM介绍

    这段SQL语句首先创建了一个子查询,在子查询中,`ROWNUM`用于筛选出前49行数据,并为这些行添加了一个别名`r`。接着,外部查询根据`r`的值进一步筛选出第30行到第49行的数据。 #### 使用绑定变量提高效率 为了...

    v$sqlarea top sql 查询举例

    通过以上查询示例,我们可以有效地定位出消耗资源最多的 SQL 语句,并对其进行优化,从而提高数据库的整体性能。这些查询对于数据库管理员、应用开发者以及参与 Oracle 数据库性能调优的人员都非常有用。通过定期...

    分页的sql总结

    在IT行业的数据库管理与查询领域,SQL(Structured Query Language)作为数据操纵语言,其灵活性与功能强大性使得它成为处理关系型数据库的首选工具。在众多的SQL操作中,分页查询是数据库管理员和开发人员频繁使用...

    c#\book\实现分页的sql语句

    在.NET框架下,结合C#语言与SQL查询,实现数据分页是一项基础但重要的技能。本文将深入探讨如何在C#\book项目中,利用SQL语句来实现数据分页。 ### SQL分页基本原理 SQL分页主要通过限制查询结果的数量来实现。在...

    三种数据库SQL分页方法详解

    本文将详细介绍三种数据库(SQL Server、MySQL、Oracle)中的分页方法,并通过具体的SQL代码示例进行讲解。 #### SQL Server 分页方法 SQL Server 提供了多种分页方式,其中较为常见的有使用 `TOP` 与 `ROW_NUMBER...

    Oracle 开发DBA SQL编写规范

    ### Oracle开发DBA SQL编写规范 #### 1. 引言 本文档旨在为Oracle数据库开发者提供一套标准化的SQL及PL/SQL编写指南,通过规范化SQL及PL/SQL的编写方式,提高代码的可读性、可维护性和执行效率。本规范适用于所有...

Global site tag (gtag.js) - Google Analytics