1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,*,*,Oracle,数据库查询与管理,第,6,章:子查询与集合操作,本章内容,编写单行子查询,编写多行子查询,EXISTS,运算符,使用集合操作符,本章目标,描述子查询的类型和子查询可解决的问题,编写单行、多行子查询,使用集合函数运算符将多个查询组成一个查询,编写单行子查询,知识点概述,#,知识点,重点,应用,说明,1,子查询概要,介绍子查询的语法、准则及类型,2,使用单行操作符,学习在查询中使用单行操作符,3,在,HAVING,子句中使用子查询,介绍如何使用,HAVING,子句对多行行组进行过滤,4,在,FROM,子句中使
2、用子查询,介绍如何在,FROM,子句中使用子查询,5,常见错误,介绍子查询可能会遇到的错误,6,7,8,9,问题:查询雇员中谁的薪资高于,Abel,的薪资?,查询,Abel,的薪资,salary_1,查询高于,salary_1,的雇员信息,基本语法(条件比较子查询),执行:,先执行子查询,再执行主查询,主查询使用子查询的结果,可使用的地方,WHERE,子句,HAVING,子句,FROM,子句,基本语法(条件比较子查询),比较条件有:,单行运算符:,、,=,、,=,、,、,大于,=,大于或等于,小于,=,小于或等于,不等于,示例:显示与雇员,141,号职务,ID,相同的雇员信息,示例:查询职务与
3、Taylor,相同,但薪资高于,Taylor,的雇员信息,内外查询中可以使用不同的表,示例:查询“,IT,”部门的员工信息,SELECT,*,FROM employees,WHERE department_id=,(select department_id,from departments,where department_name=IT),在子查询中使用组函数,示例:查询薪资等于最高(最低)工资的员工的姓名、工种和薪资,Having,子句中使用子查询,示例:查询最低薪资高于部门,50,的最低薪资的所有部门及其平均薪资,Oracle Server,会先执行子查询,再将结果返回给主查询的,HA
4、VING,子句,示例:查询平均薪资小于所有员工平均薪资的职务,ID,及平均薪资,常见错误,子查询返回了多个结果,子查询没有返回任何结果,编写多行子查询,知识点概述,#,知识点,重点,难点,应用,说明,1,多行子查询概要,介绍多行子查询的操作符,2,使用,IN,操作符,介绍,IN,操作符的作用及使用,4,使用,ANY,操作符,介绍,ANY,操作符的作用及使用,5,使用,ALL,操作符,介绍,ALL,操作符的作用及使用,6,7,8,9,多行子查询概要,返回多个行的子查询称为多行子查询,在多行子查询中使用的是多行运算符,运算符,含义,IN,等于列表中的任意一个,ANY,将值与子查询返回的任意一个值进
5、行比较。如果子查询结果没有返回行,则结果为,false,。,ALL,将值与子查询返回的每个值进行比较。如果子查询结果没有返回任何行,则结果为,true,使用,IN,操作符,IN,用来检查在一个值中是否包含指定的值,这个值列表可以是来自一个子查询返回的结果,示例:,查询每个部门薪资最低的雇员信息,使用,ANY,操作符,ANY,用来将一个值与一个列表中的任何值进行比较,在,ANY,操作符前,必须使用一个,=,、,、,、,=,操作符,示例:,查询不是,IT_PROG,且薪资低于任一,IT_PROG,的雇员信息。,上例等价于以下查询,说明,ANY,:高于最低值,=ANY,:等同于,IN,操作符,SEL
6、ECT employee_id,last_name,job_id,salary,FROM employees,WHERE salary(SELECT max(salary),FROM employees,WHERE job_id=IT_PROG),使用,ALL,操作符,ALL,操作符用来将一个值与一个列表中的所有值进行比较,在,ALL,操作符前,必须使用一个,=,、,、,、,=,操作符,示例,;,查询不是,IT_PROG,且薪资高于任一,IT_PROG,的雇员信息,ALL,:大于最高值,(SELECT AVG(list_price),FROM products),ORDER BY produc
7、t_id DESC,;,常见错误,-3,子查询中的空值,会导致整个查询没有结果,分析下例:,上例试图显示没有任何下属的雇员,逻辑上没有任何问题。,实际上,该语句并不会返回任何结果,因为子查询的结果中有一个为,null,注意:,NOT IN,等同于,ALL,IN,等同于,=ANY,如果子查询中可能存在空值,则不要使用,NOT IN,,但使用,IN,是可以的,在,FROM,子句中使用子查询,在外部查询的,FROM,子句中使用子查询,子查询为,FROM,子句提供内联数据,也称为内联视图,示例:,Oracle,中分页查询的实现,应用案例:分页查询,数据显示的页面,数据量大的时候,要限制每页显示的数量,
8、因此要分页显示,ORACLE,中的,rownum,列和,rowid,列,分页的实现思路,确定每页显示多少条记录,/,数据,确定总共要显示多少条记录,计算总共多少页,根据,当前页码,显示当前页的数据项,使用集合操作符,知识点概述,#,知识点,重点,难点,应用,说明,1,集合操作符概要,介绍,4,种集合操作符及准则,2,使用,UNOIN ALL,操作符,学习,UNOIN ALL,操作符的使用,3,使用,UNION,操作符,学习,UNION,操作符的使用,4,使用,INTERSECT,操作符,学习,INTERSECT,操作符的使用,5,使用,MINUS,操作符,学习,MINUS,操作符的使用,6,组
9、合使用集合操作符,学习组合使用集合操作符,7,8,9,数学上的集合运算,并 交 差,集合操作符,集合操作符可以将两个或多个查询结果合并成一个结果,集合操作符,操作符,说明,UNION ALL,返回各个检索出的所有行,包括重复行,UNION,返回各个检索出的所有行,不包括重复行,INTERSECT,返回两个查询检索出的公有行,MINUS,返回第二个查询检索出的行从第一个查询检索出的行中减去之后剩余的行,集合运算符的准则,SELECT,列表中的表达式在数量上必须匹配,第二个查询中每一列的数据类型必须与第一个查询中对应列的数据类型相匹配,可以使用括号更改执行顺序,ORDER BY,子句只能出现在语句
10、的末尾,Oracle Server,中,除非使用,UNION ALL,,否则会自动删除重复行,第一个查询中的列名将显示在结果中,除非使用,UNION ALL,,否则默认情况下输出按照第一列升序进行排列,示例表,使用,UNION,操作符,UNION,操作符符从两个查询中返回不包括重复的行,示例:查询所有雇员的当前职务和以前职务的信息,每个职务仅显示一次,注意重复行的定义,是所有列均相同才视为重复,使用,UNION ALL,操作符,UNION ALL,操作符从两个查询中返回行,包括重复行,所有规则与,UNION,相同,除了,不会删除重复行,不会对结果进行排序,使用,INTERSECT,操作符,IN
11、TERSECT,操作符将返回两个查询的共同行,不会忽略,NULL,值,示例:显示符合以下条件的雇员,ID,和职务,ID,,这些职员的当前职务和以前的职务相同,即:曾担任过别的职务,现在又重新担任了以前的职务。,使用,MINUS,操作符,MINUS,操作符将返回由第一个查询选定的但没有出现在第二个查询结果集的所有不同行,示例:查询从未更换过职务的雇员的,ID,集合运算中使用,ORDER BY,子句,ORDER BY,子句只能在复合查询的末尾出现一次,ORDER BY,子句仅识别第一个,SELECT,中的列,默认情况下,如果不使用,ORDER BY,,则使用第一个,SELECT,中的第一列按照升序进行排序,上机任务,第,7,章练习,第,8,章练习,






