第8章Oracle资料学习_第1页
第8章Oracle资料学习_第2页
第8章Oracle资料学习_第3页
第8章Oracle资料学习_第4页
第8章Oracle资料学习_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1第8章子查询与高级查询本章要点:掌握在WHERE子句中运用子查询。掌握在HAVING子句中运用子查询。熟练掌握运用IN、ANY和ALL操作符实现子查询。熟练掌握关联子查询。熟练掌握嵌套子查询。掌握简单衔接。熟练掌握多个表之间的内衔接。熟练掌握多个表之间的外衔接。了解多个表之间的交叉衔接。掌握运用集合操作符实现集合查询。28.1子查询在外部的SELECT、UPDATE或DELETE语句内部运用SELECT语句,这个内部SELECT语句称为子查询(Subquery)。运用子查询,主要是将子查询的结果作为外部主查询的查找条件。38.1.1子查询的类型在子查询中可以运用两种比较操作符——单行操作符和多行操作符。单行操作符:例如=、>、>=、<、<=、<>、!=。多行操作符:例如ALL、ANY、IN、EXISTS。可以把子查询分为两种类型:单行子查询和多行子查询。另外,子查询还有下面3种子类型,这3种子类型可以前往一行或多行查询结果。多列子查询:向外部的SQL语句前往多列。关联子查询:援用外部的SQL语句中的一列或多列。在关联子查询中,可以运用EXISTS和NOTEXISTS操作符。嵌套子查询:在子查询中包含有子查询。指定子查询时,需求留意以下几点:子查询需求运用括号()括起来。子查询要放在比较操作符的右边。当子查询的前往值是一个集合而不是一个值时,不能运用单行操作符,而必需根据需求运用ANY、IN、ALL或EXISTS等操作符。48.1.2在WHERE子句中运用子查询1.运用子查询在WHERE子句中运用子查询的普通用法方式如下:SELECTcolumn_listFROMtable_nameWHEREexpressionoperator( SELECTcolumn_nameFROMtable_nameWHEREcondition GROUPBYexpHAVINGhaving);其中,在外部SELECT语句的WHERE子句中,expression用来指定一个表达式,也可以是表中的一列;operator可以是单行和多行操作符;()中的内容表示子查询内容。58.1.2在WHERE子句中运用子查询2.不能运用ORDERBY子句在子查询的SELECT语句中,可以运用FROM子句、WHERE子句、GROUPBY子句和HAVING子句等,但是有些情况下不能运用ORDERBY子句,例如在WHERE子句中运用子查询时,子查询语句中就不能运用ORDERBY子句。68.1.3在HAVING子句中运用子查询在SELECT语句中运用HAVING子句,可以实现对数据进展分组过滤。在HAVING子句中,假设运用子查询,那么就可以实现对子查询前往的结果根据分组进展过滤。【例8.3】对scott用户的emp表进展检索,在HAVING子句中运用子查询。获取哪些部门的员工平均工资小于全体员工的平均工资。详细如下:SQL>SELECTdeptno,AVG(sal)FROMscott.empGROUPBYdeptno2HAVINGAVG(sal)<(3 SELECTAVG(sal)FROMscott.emp);DEPTNO AVG(SAL)---------- -------------30 1566.6666778.1.4运用IN操作符实现指定匹配查询1.运用IN操作符IN操作符用来检查在一个值列表中能否包含指定的值。这个值列表可以是子查询的前往结果。2.运用NOTIN操作符NOTIN操作符用来检查在一个值列表中能否不包含指定的值,NOTIN执行的操作正好与IN在逻辑上相反。3.常见的操作错误多行子查询可以前往多行记录,假设接纳子查询结果的操作符是单行操作符,那么在执行语句时,能够会出现错误提示。88.1.5运用ANY操作符实现恣意匹配查询在进展多行子查询时,运用ANY操作符,用来将一个值与一个列表中的一切值进展比较,这个值只需求匹配列表中的一个值即可,然后将满足条件的数据前往。其中,值列表可以是子查询的前往结果。在运用ANY操作符之前,必需运用一个单行操作符,例如=、>、<、<=等。【例8.7】对scott用户的emp表进展操作,获得工资大于恣意一个部门的平均工资的员工信息,如下:参见教材P17698.1.6运用ALL操作符实现全部匹配查询在进展子查询时,运用ALL操作符,用来将一个值与一个列表中的一切值进展比较,这个值需求匹配列表中的一切值,然后将满足条件的数据前往。其中,值列表可以是子查询的前往结果。在运用ALL操作符之前,必需运用一个单行操作符,例如=、>、<、<=等。【例8.8】对scott用户的emp表进展操作,获得工资大于一切部门的平均工资的员工信息,如下:参见教材P176108.1.7实现多列子查询多列子查询那么是指前往多列数据的子查询语句。当多列子查询前往单行数据时,在WHERE子句中可以运用单行操作符;前往多行数据时,在WHERE子句中必需运用多行操作符。运用子查询比较多个列的数据时,可以运用下面两种方式。成对比较:要求多个列的数据必需同时匹配。非成对比较:经过指定衔接关键字,例如AND或OR等,指定多个列的数据能否必需同时匹配。假设运用AND关键字,表示同时匹配,这样就可以实现与成对比较同样的结果;假设运用OR关键字,表示不用同时匹配。118.1.7实现多列子查询【例8.9】对scott用户的emp表进展操作,运用成对比较的方式,获得每个部门中工资最低的员工信息,如下:参见教材P177【例8.10】运用非成对比较的方式,并且指定AND关键字,获得每个部门中工资最低的员工信息,如下:参见教材P177128.1.8实现关联子查询关联子查询会援用外部查询中的一列或多列,这种子查询之所以被称为关联子查询,是由于它确实与外部语句相关。【例8.11】查询各个部门中,哪些员工的工资低于其所在部门的平均工资,如下:参见教材P178138.1.8实现关联子查询1.运用EXISTS操作符在关联子查询中可以运用EXISTS或NOTEXISTS操作符。其中,EXISTS操作符用于检查子查询所前往的行能否存在,它可以在非关联子查询中运用,但是更常用于关联子查询。2.运用NOTEXISTS操作符在执行的操作逻辑上,NOTEXISTS操作符的作用与EXISTS操作符相反。在需求检查数据行中能否不存在子查询前往的结果时,就可以运用NOTEXISTS。 148.1.8实现关联子查询3.EXISTS与IN的比较在运用NOTEXISTS和NOTIN时,假设一个值列表中包含有空值,NOTEXISTS前往TRUE;而NOTIN那么前往FALSE。【例8.14】运用NOTEXISTS操作符,检索最高指点人员的有关信息,也就是该员工没有上级指点,对应的mgr列的值为NULL。详细如下:参见教材P179【例8.15】运用NOTIN操作符,重写上述语句,如下:参见教材P180158.1.9实现嵌套子查询所谓嵌套子查询,是指在子查询内部运用其他子查询。嵌套子查询的嵌套层次最多为255层。大多数情况下,嵌套子查询都在外层子查询的WHERE子句中。【例8.16】知任务地点在NEWYORK和CHICAGO的两个部门,要求根据这两个部门的平均工资中的最大值,获取工资大于这个最大值的员工信息,如下:SQL>SELECTempno,ename,sal,deptnoFROMscott.emp2WHEREsal>(3 SELECTMAX(AVG(sal))FROMscott.empWHEREdeptnoIN(4 SELECTdeptnoFROMscott.dept5 WHERElocIN('NEWYORK','CHICAGO'))6 GROUPBYdeptno);EMPNO ENAME SAL DEPTNO---------- ---------- ---------- ----------7566 JONES 2975 207788 SCOTT 3000 207839 KING 5000 107902 FORD 3000 20168.1.10在UPDATE和DELETE语句中运用子查询1.在UPDATE语句中运用子查询在UPDATE语句中运用子查询,可以将子查询前往的结果赋值给需求更新的列。【例8.17】将员工编号为7839的员工的工资设置为平均工资,如下:SQL>UPDATEscott.empSETsal=(2 SELECTAVG(sal)FROMscott.emp)3WHEREempno=7839;已更新1行。 2.在DELETE语句中运用子查询在DELETE语句中运用子查询,可以根据子查询前往的结果删除指定的行。【例8.18】删除任务地点在NEWYORK的一切员工信息,如下:SQL>DELETEFROMscott.empWHEREdeptnoIN(2 SELECTdeptnoFROMscott.deptWHEREloc='NEWYORK');已删除3行。178.2实验指点——获取借阅次数最多的前5本图书实验指点8-1:获取借阅次数最多的前5本图书由于需求显示图书信息,所以从图书表book中进展检索;然后结合借书表lend,获得每本书的借阅情况;最后按照每本书的借阅次数降序陈列,获得前5本图书信息即可。详细如下:参见教材P182上述语句中,在最外层SELECT语句的WHERE子句中运用了子查询,并且运用IN操作符指定匹配查询;第3行的SELECT语句中,在FROM子句中运用子查询,经过子查询获得分组和排序之后的bookid;最后在WHERE子句中指定rownum列小于等于5,指定排序之后的前5行记录。188.3高级查询检索数据时,经过各个表之间共同列的关联性,可以查询存放在多个表中的不同实体的信息。假设在查询时需求对多个表进展操作,并且指定多个表的衔接关系,那么该查询就称为高级查询,也可以称为衔接查询。198.3.1运用等号(=)实现多个表的简单衔接在衔接查询中,假设仅仅经过SELECT子句和FROM子句衔接多个表,那么查询的结果将是一个经过笛卡儿积所生成的表。【例8.19】运用SELECT子句和FROM子句,从scott用户的emp表和dept表中检索数据,假设不指定检索条件,将得到56行记录。详细如下:参见教材P183由于scott.emp表中有14行记录,scott.dept表中有4行记录,所以笛卡儿积所生成的表一共有56(14*4=56)行记录。208.3.2运用表的别名设置表的别名,只需求在FROM子句中援用该表时,将表别名跟在表的实践称号后面即可。表别名和表的实践称号之间运用空格进展分隔。【例8.21】运用表别名的方式,重写例8.20中所示的语句。为scott.emp表设置表别名为e,为scott.dept表设置表别名为d。语句如下:SQL>SELECTempno,ename,sal,e.deptno,d.deptno,dname2FROMscott.empe,scott.deptd3WHEREe.deptno=d.deptno;218.3.3运用INNERJOIN实现多个表的内衔接在FROM子句中,运用JOIN衔接的语法方式如下:FROMjoin_table1join_typejoin_table2[ON(join_condition)] [join_type...ONjoin_condition,...]语法阐明如下。join_table1、join_table2:参与衔接操作的表名。join_type:衔接类型,衔接类型有INNERJOIN(内衔接)、OUTERJOIN(外衔接)和CROSSJOIN(交叉衔接)。join_condition:衔接条件,由被衔接表中的列和比较运算符、逻辑运算符等构成。可以运用多组join_type…ONjoin_condition…子句,实现多个表的衔接。228.3.3运用INNERJOIN实现多个表的内衔接1.等值衔接所谓等值衔接,是指在衔接条件中运用等于(=)运算符比较被衔接的值,也就是经过相等的列值衔接起来的查询。2.不等衔接所谓不等衔接,就是在衔接条件中运用除等号(=)外的其他比较运算符,构成非等值衔接查询。可以运用的比较运算符包括:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、<>(不等于)、!=(不等于)、LIKE、IN和BETWEEN等。238.3.3运用INNERJOIN实现多个表的内衔接3.自然衔接自然衔接(NATURALJOIN)是在两个表中寻觅列名和数据类型都一样的字段,经过一样的字段将两个表衔接在一同,并前往一切符合条件的结果。4.运用USING关键字简化衔接SQL/92规范可以运用USING关键字来简化衔接查询,但是只需在查询满足下面两个条件时,才干运用USING关键字进展简化:查询必需是等值衔接。等值衔接中的列必需具有一样的称号和数据类型。248.3.3运用INNERJOIN实现多个表的内衔接【例8.25】运用USING关键字,重写例8.22中的语句,如下:参见教材P187运用USING关键字简化衔接时,需求留意以下几点。(1) 运用emp表和dept表中的deptno列进展衔接时,在USING子句和SELECT子句中,都不能为deptno列指定表名或表别名。(2) 假设在衔接查询时运用了两个表中一样的多个列,那么就可以在USING子句中指定多个列名,方式如下:参见教材P187(3) 假设对多个表进展检索,那么就必需多次运用USING关键字进展指定,方式如下:参见教材P187258.3.4运用OUTERJOIN实现多个表的外衔接对于外衔接,Oracle中可以运用加号(+)来表示,也可以运用LEFT、RIGHT和FULLOUTERJOIN关键字。外衔接可以分为下面这3类:左外衔接(LEFTOUTERJOIN或LEFTJOIN)右外衔接(RIGHTOUTERJOIN或RIGHTJOIN)全外衔接(FULLOUTERJOIN或FULLJOIN)268.3.4运用OUTERJOIN实现多个表的外衔接1.左外衔接左外衔接是在检索结果中除了显示满足衔接条件的行外,还显示JOIN关键字左侧表中一切满足检索条件的行。2.右外衔接右外衔接是在结果中除了显示满足衔接条件的行外,还显示JOIN右侧表中一切满足检索条件的行。3.全外衔接全外衔接是在结果中除了显示满足衔接条件的行外,还显示JOIN两侧表中一切满足检索条件的行。278.3.5运用CROSSJOIN实现交叉衔接运用CROSSJOIN关键字,可以实现两个表的交叉衔接,所得到的结果将是这两个表中各行数据的一切组合,即这两个表一切数据行的笛卡儿积。交叉衔接与简单衔接操作非常类似,不同的是,运用交叉衔接时,在FROM子句中多个表名之间不是用逗号,而是运用CROSSJOIN关键字隔开。另外,在交叉衔接中不需求运用关键字ON限定衔接条件,但是可以添加WHERE子句设置衔接条件。【例8.29】运用交叉衔接,查询emp表和dept表中,部门编号为10的员工信息和部门信息,如下:参见教材P190288.3.6运用UNION操作符获取两个结果集的并集运用UNION操作符的语法如下:select_statementUNION[ALL]select_statement [UNION[ALL]select_statement][...]其中,select_statement是查询的SELECT语句;ALL选项表示将一切行合并到结果集中,不指定该项,那么只保管反复行中的一行。UNION操作符含义如图8-1所示。298.3.6运用UNION操作符获取两个结果集的并集【例8.30】运用UNIONALL操作符,对scott用户的emp表进展操作,获得员工编号大于7800或者所在部门编号为10的员工信息。运用ORDERBY语句将结果集按照deptno列升序陈列输出。详细如下:参见教材P191【例8.31】运用UNION操作符,但是不指定ALL关键字,获得员工编号大于7800或者所在部门编号为10的员工信息。详细如下:参见教材P191308.3.7运用INTERSECT操作符获取两个结果集的交集运用INTERSECT操作符,获取结果集的公共行,也称为获取结果集的交集。INTERSECT操作符的运用语法同UNION,只是操作符不再是UNION[ALL],而是INTERSECT。INTERSECT操作符的含义如图8-2所示。318.3.8运用MINUS操作符获取两个结果集的差集SQL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论