- 1、本文档共14页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- DB2存储过程开发实践.doc
- DIP后焊检验标准.doc
- D-wave详细介绍.docx
- dili分界线.doc
- DJY62-2508-2010检修公司绩效管理办法.doc
- DME文献评价.doc
- AB对称流量计性能介绍.doc
- DN1000塔设备强度计算书.doc
- DSP开题报告语音存储压缩与回放.doc
- CA6140车床拨叉831007课程设计说明书(更正版).doc
- 浙江省温州市瑞安市集云实验学校2023-2024学年九年级第一学期期末测试科.pdf
- 江苏省江阴市文林中学2023-2024学年九年级上学期10月阶段性测试数学试卷.pdf
- (完整版)部编人教版九年级道德与法治下册期末试卷及答案【完美版】.pdf
- 2024交流输变电项目环境影响评价技术规范生态环境影响评价.pdf
- 2024输变电建设项目竣工环境保护验收调查规范声环境影响调查.docx
- 2024输变电建设项目竣工环境保护验收调查规范电磁环境影响调查.docx
- 2024输变电建设项目竣工环境保护验收调查规范水环境影响调查.docx
- 2024交流输变电项目环境影响评价技术规范声环境影响评价.pdf
- 2024输变电建设项目竣工环境保护验收调查规范生态、固体废物环境影响调查.docx
- (完整版)必威体育精装版2019年部编版统编教材4-6年级语文教材目录四年级上册下册.pdf
文档评论(0)