资源描述
单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,Oracle SQL&PL/SQL,第6,章 子查询,掌握子查询可以解决的问题的类型;,分清子查询的类型;,编写单行或多行的子查询;,编写一个多列子查询;,明确子查询返回空值对主查询所产生影响;,在,FROM,子句中编写子查询。,本章要点,用子查询来解决一个问题,“,谁的薪水比,Jones,还高呢?”,“,哪个雇员的薪水比,Jones,还高,?”,主查询,?,“,Jones,的薪水是多少,?”,?,子查询,子查询,子查询(内部查询)先于主查询执行,。,子查询的结果被主查询(外部查询)使用,Expr,operator,包括比较运算符。,单行运算符(、=、=、SELECT,ename,2 FROM,emp,3 WHERE,sal,4 (SELECT,sal,5 FROM,emp,6 WHERE,empno,=7566);,查询出比编号为7566雇员工资高的其他雇员,ENAME,-,KING,FORD,SCOTT,使用子查询,子查询使用指导,子查询要用扩号扩起来,将子查询放在比较运算符的右边,不要在子查询中使用,ORDER BY,子句,对于单行子查询要使用单行运算符,对于多行子查询要使用多行运算符,子查询的类型,单行子查询,主查询,子查询,返回值,CLERK,多行子查询,CLERK,MANAGER,主查询,子查询,返回值,多列子查询,CLERK 7900MANAGER 7698,主查询,子查询,返回值,单行子查询,子查询只返回一行,使用单行运算符,运算符,=,=,SELECT,ename,job 2 FROM,emp,3 WHERE job=,4(SELECT job 5 FROM,emp,6 WHERE,empno,=7369),7 AND,sal,8(SELECT,sal,9FROM,emp,10WHERE,empno,=7876);,显示和雇员7369从事相同工作并且工资大于雇员7876的雇员的姓名和工作。,子查询中使用组函数,800,ENAME JOB SAL,-,SMITH CLERK 800,SQL SELECT,ename,job,sal,2 FROM,emp,3 WHERE,sal,=,4(SELECTMIN(,sal,),5FROM,emp,);,显示工资最低的雇员的姓名、工作和工资。,HAVING,子句中的子查询,Oracle,服务器先执行子查询,Oracle,服务器将结果返回个主查询的,HAVING,子句,800,SQL SELECT,deptno,MIN(,sal,),2 FROM,emp,3 GROUP BY,deptno,4 HAVINGMIN(,sal,),5(SELECTMIN(,sal,),6FROM,emp,7WHERE,deptno,=20);,这个语句错在哪,(,SELECT MIN(,sal,),*,ERROR,位于第,4 行:,ORA-01427:,单行子查询返回多于一个行,SQL SELECT,empno,ename,2 FROM,emp,3 WHERE,sal,=,4(SELECT MIN(,sal,),5FROM,emp,6GROUP BY,deptno,);,单行运算符与多行子查询不匹配,这条语句会工作吗,?,no rows selected,子查询没有返回值,SQL SELECT,ename,job,2 FROM,emp,3 WHERE job=,4(SELECTjob,5FROM,emp,6WHERE,ename,=SMYTHE);,多行子查询,返回多于一行记录,使用多行比较运算符,运算符,IN,ANY,ALL,含义,等于列表中的任意一项,和内部查询返回的结果逐个比较,和内部查询返回的每个结果比较,多行子查询中使用,ANY,运算符,950,800,1100,1300,EMPNO ENAME JOB,-,7654 MARTIN SALESMAN,7521 WARD SALESMAN,SQL SELECT,empno,ename,job,2 FROM,emp,3 WHERE,sal,ANY,4(SELECT,sal,5 FROM,emp,6WHEREjob=CLERK),7 AND job CLERK;,多行子查询中使用,ANY,运算符,ANY,运算符将和子查询返回的结果逐个比较:,ANY。,比最小值大。,=,ANY。,等效于,IN。,多行子查询中使用,ALL,运算符,2916.6667,2175,1566.6667,EMPNO ENAME JOB,-,7839 KING PRESIDENT,7566 JONES MANAGER,7902 FORD ANALYST,7788 SCOTT ANALYST,SQL SELECT,empno,ename,job,2 FROM,emp,3 WHERE,sal,ALL,4(SELECT,avg,(,sal,),5 FROM,emp,6GROUP BY,deptno,);,多行子查询中使用,ALL,运算符,ALL,操作符和子查询返回的每一个结果都,进行比较:,ALL。,表示比最大的大,。,SELECT,ename,deptno,sal,comm,2 FROM,emp,3 WHERE (,sal,NVL(comm,-1)IN,4(SELECT,sal,NVL(comm,-1),5 FROM,emp,6 WHERE,deptno,=30),7 AND,empno,30;,不成对比较多列子查询,SQL SELECT,ename,deptno,sal,comm,2 FROM,emp,3 WHERE,sal,IN(SELECT,sal,4 FROM,emp,5 WHERE,deptno,=30),6 AND NVL(comm,-1)IN (SELECT NVL(comm,-1),7 FROM,emp,8 WHERE,deptno,=30),9 AND,deptno,30;,显示与,30,部门任何雇员薪水及佣金相匹配的雇员的姓名、部门编号、薪水及佣金,。,子查询中的空值,SQL SELECTemployee.,ename,2 FROM,emp,employee,3 WHERE employee.,empno,NOT IN,4(SELECT manager.mgr,5 FROM,emp,manager);,no rows selected.,NOT IN,运算符等效于,ALL,IN,运算符等效于=,ANY,在,FROM,子句中使用子查询,ENAME SAL DEPTNO SALAVG,-,KING 5000 10 2600,JONES 2975 20 2335,SCOTT 3000 20 2335,.,6 rows selected.,SQL SELECT a.,ename,a.,sal,a.,deptno,b.,salavg,2 FROM,emp,a,(SELECT,deptno,avg,(,sal,),salavg,3 FROM,emp,4 GROUP BY,deptno,)b,5 WHERE a.,deptno,=b.,deptno,6 AND a.,sal,b.,salavg,;,
展开阅读全文