Oracle-otd-学习.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Oracle-otd-学习

第9讲 伪列 伪列概念 从字面意思进行理解,伪列就是假的,不存在的列。这些列在表中并不存在,但是可以通过查询语句查询出来。Oracle常用的伪列有ROWID和ROWNUM 我们可以通过DESC指令展示employees表的结构,发现并没有叫做ROWID或者 ROWNUM的列 但是当我们执行 查询时,这两个列又可以被查询出来,如下所示 : Select employee_id , first_name ,rowid, rownum from employees 这两个列就是我们所说的伪列。接下来我们来介绍一下这两个列的作用。 ROWID伪列 Rowid伪列能够在数据库中唯一标示一条记录。他的运算方法很复杂,是根据数据在硬 盘上的存储位置( 扇区,磁道)运算得出的。由于条数据在硬盘中的存储位置都是独一无二的,所以通过rowid能够在整个数据库范围内唯一标识一条数据。又因为rowid中包含数据在磁盘上的存储地址。所以通过rowid查询对应的数据效率是最高的。但是由于rowid没有任何含义,所以以rowid作为条件的查询并不常用。 ROWNUM伪列 通过前面关于rownum的查询可以看出, rownum的功能实际上是给给查询结果一个编号,第一个满足查询条件的数据,对应的rownum 是1 ,第二个满足查询条件的数据rownum是2 ,如果有更多满足查询条件的数据,rownum依次递增。 这条数据满足where条件的先后顺序 利用rownum,我们可以实现很多实用的查询. 比如,我们想查询公司的全前5名员工,就可以通过rownum=5来进行判断。 Select * from employees where rownum = 5 ; 接下来,我们再讨论一下能否使用rownum查询到第5个员工之后的员工,即: select * from employees where rownum 5 通过实验我们发现这条查询实际得不到任何结果。原因在于rownum代表的是查询结果的编号,第一个满足查询的数据的rownum是1 , 第二个满足查询条件的数据rownum为2,也就是说rownum必须从1开始产生,而我们的查询条件rownum 5,是永远不会被满足的。大家可以通过参考下面的图进一步理解这个问题。 拿到第一条记录,rownum赋值为1,跟5进行比较,条件不符; 取下一条记录,同样rownum赋值为1,跟5进行比较,条件不符… 由此我们可以总结这样一个规律: rownum用作条件比较时,只能用于 , =, =1, =1条件 ROWNUM与ORDER BY联合使用 我们来看这样一个问题 查询工资最高的前5名员工. 很多同学会立刻想到用这样的sql来解决 :select * from employees where rownum = 5 order by salary desc ,我们来看一下查询结果 : 但是细心的同学会发现这个查询结果并不正确,大家可以参考下面的实际数据进行对比 Select * from employees order by salary desc 我们会发现被查询出来的并不是工资最高的钱五个人。这是什么原因造成的呢?这是因为order by 子句是在查询完成之后执行的。Rownum是在查询进行的过程中就产生的,上面的SQL实际上做的事请是,查出前五个员工,然后对这五个员工的工资进行排序,而不是查询全公司工资最高的前五人。 如何解决此问题呢?这就需要使用到下一讲的内容:子查询 第10讲 子查询 首先我们通过一个例子来了解什么是子查询。我们要将公司中工资最高的人的姓名,工资和电话查询出来。我们首先想到的方式是 : Select first_name , last_name , phone_number , salary From employees Where salary = max( salary ); 但是这条SQL在编译时会出现语法错误,原因也很简单,我们在上一讲中强调过,where语句是在分组之前执行的,在没有分组之前,max(salary) 是无法获得的。所以在where语句中无法直接使用组函数( count,max,min,sum,avg)作为查询条件。 所以我们只能把上述查询要求分成两个查询操作来完成: 1,查出公司的最高工资是多少。 2,以最高工资为条件,查询员工姓名等信息。 select max(salary) from employees select first_name , phone_number , salary from employees where sal

文档评论(0)

gangshou + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档