龙空技术网

其实Oracle并不难——这十天,跟着我一起学习数据库(第五天)

春春爱太阳 675

前言:

当前你们对“oracle统计嵌套查询”大体比较看重,咱们都想要分析一些“oracle统计嵌套查询”的相关内容。那么小编也在网上搜集了一些关于“oracle统计嵌套查询””的相关知识,希望你们能喜欢,小伙伴们一起来了解一下吧!

/*

1.子查询:就是嵌套查询,也叫作内部查询。

就是将一个查询的结果(子查询)为另一个查询条件(主查询)。

子查询可以写在:显示列表?from子句、where子句、having子句等;

2.子查询的使用方式:

子查询要用括号括起来;

将子查询放在比较运算符的右边;

对于单行子查询要用单行运算符;

对于多行子查询要用多行运算符;

3.子查询的分类:

根据子查询返回的行数和列数:

A:单行子查询:查询结果集至多只有一行记录(一般常用分组函数或等值);

B:多行子查询:查询结果集有多行记录(与之搭配使用的操作符有(not) in,any,all)

C:单列子查询:查询结果集有一列是单列子查询;

D:多列子查询:查询结果集有多列是多列子查询;

单行单列子查询:至多有一条记录一列

与之搭配使用的操作符有 > >= < <= <> =

多行单列子查询:有多行记录显示一列;

与之搭配使用的操作符有not in any all

多行多列子查询;要求匹配条件字段列表和子查询结果集的字段列表具有一一对应关系(类似于Java函数调用时的实参和形参的关系)

要求;匹配条件字段和子查询结果集字段类型兼容、顺序一致;

匹配条件字段之间是整行匹配的关系

多行子查询

ANY:表示和子查询的任意一行结果进行比较,有一个满足条件即可。

ALL:表示和子查询的所有行结果进行比较,每一行必须都满足条件。

IN 和ANY 进行搭配使用:

> ANY---大于子查询中的任意一个值即可

等价于 > MIN()

< ANY---小于子查询中的任意一个值即可

等价于 < MAX()

= ANY---等于子查询中的任意一个值即可

等价于 IN()

IN 和ALL 进行搭配使用:

> ALL---大于子查询结果集中的所有的值即可

等价于 > MAX()

< ALL---小于子查询结果集中的所有的值即可

等价于 < MIN()

= ALL---等于子查询结果集中的所有的值即可,没有实际意义

注意:如果业务描述中出现“任意”“任一”等字样,考虑使用ANY关键字的子查询;

如果业务描述中出现“所有”“全部”等字样,考虑使用ALL关键字的子查询;

4.子查询中的空值null

子查询返回的结果中含有空值--->对于含有空值的子查询不能使用not in操作符。

因为子查询中的结果中有一条空值,这条空值导致主查询没有记录返回。

这是因为所有的条件和空值比较结果都是空值。

因此,无论什么时候只要空值有可能成为子查询结果集合中的一部分,就不能使用not in运算符。

5.在from子句中使用子查询

from子句中使用子查询作为一个查询表对象;该表不是实际存在的表,而是一个缓存;

from子句中子查询的角色就是一张表的作用;

6.ROWNUM虚拟列

ROWNUM是一个伪列,伪列是使用上类似于表中的列,而实际并没有存储在表中的特殊列;

ROWNUM的功能是在每次查询时,返回结果集的顺序号,这个顺序号是在记录输出时才一步

一步产生的,第一行为1,第二行为2,以此类推。

注意有查询结果才有ROWNUM,ROWNUM是伴随查询结果产生而产生的;而且每次都是从1开始编排;

使用ROWNUM以及子查询完成分页查询

*/

--------------子查询--------------------------

---**********单行单列子查询************--

--查询工资比Jones工资高的员工信息

--子查询--Jones的工资

SELECT E.SAL FROM EMP E WHERE UPPER(E.ENAME)=UPPER('Jones');

--主查询

SELECT * FROM EMP E WHERE E.SAL>2975;

--嵌套主查询

SELECT * FROM EMP E WHERE E.SAL>(SELECT E.SAL FROM EMP E WHERE UPPER(E.ENAME)=UPPER('Jones'));

--显示和雇员7369从事相同工作并且工资大于7876的雇员的姓名和工作

--子查询--雇员7369的工作

SELECT E.JOB FROM EMP E WHERE E.EMPNO=7369;

--子查询--雇员7876的工资

SELECT E.SAL FROM EMP E WHERE E.EMPNO=7876

--主查询

SELECT E.ENAME,E.JOB FROM EMP E WHERE E.JOB='CLERK' AND E.SAL>1100.00;

--嵌套主查询

SELECT E.ENAME,E.JOB FROM EMP E WHERE

UPPER(E.JOB)=(SELECT UPPER(E.JOB) FROM EMP E WHERE E.EMPNO=7369)

AND E.SAL>(SELECT E.SAL FROM EMP E WHERE E.EMPNO=7876);

--------------ppt7练习1-----------------

--1.查询入职日期最早的员工姓名,入职日期

SELECT E.ENAME,E.HIREDATE FROM EMP E WHERE E.HIREDATE=(SELECT MIN(HIREDATE) FROM EMP);

--2.查询工资比SMITH工资高并且工作地点在CHICAGO的员工姓名,工资,部门名称

SELECT E.SAL FROM EMP E WHERE UPPER(E.ENAME)=UPPER('SMITH');---子查询

SELECT E.ENAME,E.SAL,D.DNAME FROM EMP E JOIN DEPT D ON E.DEPTNO=D.DEPTNO

WHERE E.SAL>(SELECT E.SAL FROM EMP E WHERE UPPER(E.ENAME)=UPPER('SMITH'))

AND D.LOC='CHICAGO';

--3.查询入职日期比20部门入职日期最早的员工还要早的员工姓名,入职日期

--方法2:子查询

SELECT MIN(HIREDATE) FROM EMP WHERE DEPTNO=20;---子查询

SELECT E.ENAME,E.HIREDATE FROM EMP E

WHERE E.HIREDATE<(

SELECT MIN(HIREDATE) FROM EMP WHERE DEPTNO=20);

--方法2:分组查询

SELECT E.ENAME,E.HIREDATE FROM EMP E

WHERE E.HIREDATE<(

SELECT MIN(HIREDATE) FROM EMP GROUP BY DEPTNO HAVING DEPTNO=20);

--4.查询部门人数大于所有部门平均人数的的部门编号,部门名称,部门人数

SELECT D.DEPTNO,D.DNAME,COUNT(*) DEPTEMPCOUNT FROM EMP E,DEPT D

WHERE E.DEPTNO=D.DEPTNO

GROUP BY D.DEPTNO,D.DNAME

HAVING COUNT(*)>(

SELECT (SELECT COUNT(*) FROM EMP E)/(SELECT COUNT(DISTINCT D.DEPTNO) FROM DEPT D)FROM DUAL

);

---关联(全外连接)

SELECT D.DEPTNO,D.DNAME,COUNT(*) DEPTEMPCOUNT FROM EMP E,DEPT D

WHERE E.DEPTNO=D.DEPTNO

GROUP BY D.DEPTNO,D.DNAME

HAVING COUNT(*)>(

SELECT COUNT(DISTINCT E.EMPNO)/COUNT(DISTINCT D.DEPTNO) FROM EMP E FULL JOIN DEPT D ON E.DEPTNO=D.DEPTNO

);

SELECT * FROM DEPT D;

SELECT * FROM EMP E;

---**********多行子查询************--

--查询是经理的姓名,工资

SELECT DISTINCT E.MGR FROM EMP E WHERE E.MGR IS NOT NULL;--查询经理的员工编号

SELECT E.ENAME,E.SAL FROM EMP E WHERE E.EMPNO IN(

SELECT DISTINCT E.MGR FROM EMP E WHERE E.MGR IS NOT NULL);

--=any 等价于 in

SELECT E.ENAME,E.SAL FROM EMP E WHERE E.EMPNO=ANY(

SELECT DISTINCT E.MGR FROM EMP E WHERE E.MGR IS NOT NULL);

--查询部门编号不为10,且工资比10部门任意一名员工工资高的员工编号,姓名,职位,工资。

SELECT E.EMPNO,E.ENAME,E.JOB,E.SAL FROM EMP E

WHERE E.DEPTNO<>10 AND E.SAL>ANY(

SELECT DISTINCT E.SAL FROM EMP E WHERE E.DEPTNO=10);

--> ANY 等价于 >min()

SELECT E.EMPNO,E.ENAME,E.JOB,E.SAL FROM EMP E

WHERE E.DEPTNO<>10 AND E.SAL>(

SELECT MIN(E.SAL) FROM EMP E WHERE E.DEPTNO=10);

--查询部门编号不为10,且工资比10部门所有员工工资高的员工编号,姓名,职位,工资。

SELECT E.EMPNO,E.ENAME,E.JOB,E.SAL FROM EMP E

WHERE E.DEPTNO<>10 AND E.SAL>ALL(

SELECT DISTINCT E.SAL FROM EMP E WHERE E.DEPTNO=10);

--> ALL 等价于 >MAX()

SELECT E.EMPNO,E.ENAME,E.JOB,E.SAL FROM EMP E

WHERE E.DEPTNO<>10 AND E.SAL>(

SELECT MAX(E.SAL) FROM EMP E WHERE E.DEPTNO=10);

--------------ppt7练习2-----------------

--1.查询入职日期比10部门任意一个员工晚的员工姓名、入职日期,不包括10部门员工

SELECT E.ENAME,E.HIREDATE FROM EMP E

WHERE E.DEPTNO<>10 AND E.HIREDATE>ANY(

SELECT E.HIREDATE FROM EMP E WHERE E.DEPTNO=10);

--2.查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工

SELECT E.ENAME,E.HIREDATE FROM EMP E

WHERE E.DEPTNO<>10 AND E.HIREDATE>ALL(

SELECT E.HIREDATE FROM EMP E WHERE E.DEPTNO=10);

--3.查询职位和10部门任意一个员工职位相同的员工姓名,职位,不包括10部门员工

SELECT E.ENAME,E.JOB FROM EMP E

WHERE E.DEPTNO<>10 AND E.JOB=ANY(

SELECT E.JOB FROM EMP E WHERE E.DEPTNO=10);

--多行多列子查询;要求匹配条件字段列表和子查询结果集的字段列表具有一一对应关系

----(类似于Java函数调用时的实参和形参的关系

--查询出和1981年入职的任意一个员工的部门和职位完全相同员工姓名、部门、职位、入职日期,不包括1981年入职员工。

SELECT E.ENAME,E.DEPTNO,E.JOB,E.HIREDATE FROM EMP E

WHERE TO_CHAR(E.HIREDATE,'YYYY')<>'1981'

AND (E.DEPTNO,E.JOB)=ANY(SELECT E.DEPTNO,E.JOB FROM EMP E WHERE EXTRACT( YEAR FROM E.HIREDATE)=1981);

--------------不等价于----注意两者之间的区分逻辑----------------

SELECT E.ENAME,E.DEPTNO,E.JOB,E.HIREDATE FROM EMP E

WHERE TO_CHAR(E.HIREDATE,'YYYY')<>'1981'

AND (E.DEPTNO=ANY(SELECT E.DEPTNO FROM EMP E WHERE EXTRACT( YEAR FROM E.HIREDATE)=1981)

AND E.JOB=ANY(SELECT E.JOB FROM EMP E WHERE EXTRACT( YEAR FROM E.HIREDATE)=1981));

----------------------------------------------------------------

--查询出和1981年入职的任意一个员工的部门或职位相同员工姓名、部门、职位、入职日期,不包括1981年入职员工。

SELECT E.ENAME,E.DEPTNO,E.JOB,E.HIREDATE FROM EMP E

WHERE TO_CHAR(E.HIREDATE,'YYYY')<>'1981'

AND (E.DEPTNO=ANY(SELECT E.DEPTNO FROM EMP E WHERE EXTRACT( YEAR FROM E.HIREDATE)=1981)

OR E.JOB=ANY(SELECT E.JOB FROM EMP E WHERE EXTRACT( YEAR FROM E.HIREDATE)=1981));

---------子查询中控制null的处理------------

---查询不是经理的员工姓名

--使用not in的子查询注意需要对子查询结果集进行nvl()处理

SELECT * FROM EMP E WHERE E.EMPNO NOT IN(SELECT E.MGR FROM EMP E);----注意null的处理

SELECT * FROM EMP E WHERE E.EMPNO NOT IN(SELECT NVL(E.MGR,0) FROM EMP E);

---from子句中是子查询---

---查询比自己部门平均工资高的员工姓名,工资,部门编号,部门平均工资

---子查询:自己部门的平均工资

SELECT E.DEPTNO SELFDEPTNO,AVG(E.SAL) AVGSAL FROM EMP E GROUP BY E.DEPTNO;

---主查询:

SELECT E.ENAME,E.SAL,E.DEPTNO,S.AVGSAL

FROM EMP E,(SELECT AVG(E.SAL) AVGSAL,E.DEPTNO SELFDEPTNO FROM EMP E GROUP BY E.DEPTNO) S

WHERE E.DEPTNO=S.SELFDEPTNO AND E.SAL>S.AVGSAL ;

----分页查询

SELECT ROWNUM RN,E.* FROM EMP E;

SELECT ROWNUM RN,E.* FROM EMP E WHERE E.DEPTNO=30;

---分页显示;每页显示5条记录:要求显示EMP表中的第1-5条记录

SELECT ROWNUM RN,E.* FROM EMP E WHERE ROWNUM<=5;

---分页显示;每页显示5条记录:要求显示EMP表中的第6-10条记录(产生是在有了1-5的基础上才有6-10)

SELECT ROWNUM RN,E.* FROM EMP E WHERE ROWNUM>5 AND ROWNUM<=10;---不正确

---使用子查询进行分页显示:每页显示5条记录:要求显示EMP表中的第6-10条记录

SELECT * FROM (SELECT ROWNUM RN,E.* FROM EMP E) T WHERE T.RN>5 AND T.RN<=10;

--------------ppt7练习3-----------------

--1.查询职位及经理和10部门任意一个员工职位及经理相同的员工姓名,职位,不包括10部门员工

SELECT E.ENAME,E.JOB FROM EMP E

WHERE (E.JOB,E.MGR)=ANY(SELECT E.JOB,E.MGR FROM EMP E WHERE E.DEPTNO=10)

AND E.DEPTNO<>10;

--2.查询职位及经理和10部门任意一个员工职位或经理相同的员工姓名,职位,不包括10部门员工

SELECT E.ENAME,E.JOB FROM EMP E

WHERE (E.JOB=ANY(SELECT E.JOB FROM EMP E WHERE E.DEPTNO=10)

OR E.MGR=ANY(SELECT E.MGR FROM EMP E WHERE E.DEPTNO=10))

AND E.DEPTNO<>10;

--------------ppt7练习4-----------------

--1.查询比自己职位平均工资高的员工姓名、职位,部门名称,职位平均工资

SELECT E.ENAME,E.JOB,D.DNAME,MM.AVGSAL FROM EMP E

JOIN DEPT D ON E.DEPTNO=D.DEPTNO

JOIN (SELECT E.JOB MMJOB,AVG(NVL(E.SAL,0)) AVGSAL FROM EMP E GROUP BY E.JOB) MM ON E.JOB=MM.MMJOB

WHERE E.SAL>MM.AVGSAL ;

--2.查询职位和经理同员工SCOTT或BLAKE完全相同的员工姓名、职位,不包括SCOOT和BLAKE本人。

SELECT E.ENAME,E.JOB FROM EMP E

WHERE ((E.JOB,E.MGR) IN(

SELECT E.JOB,E.MGR FROM EMP E WHERE E.ENAME='SCOTT' OR E.ENAME='BLAKE' )

)AND E.ENAME!='SCOTT' AND E.ENAME!='BLAKE';

--3.查询不是经理的员工姓名。

SELECT * FROM EMP E WHERE E.EMPNO NOT IN(SELECT NVL(E.MGR,0) FROM EMP E);

--------------ppt7练习5-----------------

--1.查询入职日期最早的前5名员工姓名,入职日期。

SELECT FROM EMP E;

--2.查询工作在CHICAGO并且入职日期最早的前2名员工姓名,入职日期。

SELECT FROM EMP E;

--------------ppt7练习6-----------------

--1.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称。!!!!!!!!!!!!!

SELECT * FROM (SELECT ROWNUM ROWINDEX,E.* FROM EMP E) T

WHERE T.ROWINDEX>(2-1)*5 AND T.ROWINDEX<=2*5;

SELECT * FROM (SELECT ROWNUM ROWINDEX,E.* FROM EMP E) T

WHERE T.ROWINDEX>(2-1)*5 AND T.ROWINDEX<=2*5;

SELECT * FROM (SELECT ROWNUM ROWINDEX,E.* FROM EMP E) T

WHERE T.ROWINDEX>(3-1)*5 AND T.ROWINDEX<=3*5;

--------------ppt7练习7-----------------

--1.按照每页显示5条记录,分别查询工资最高的第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称、工资。

SELECT FROM EMP E;

--------------ppt7课后作业-----------------

--1.查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号、姓名及工资。

SELECT E.EMPNO,E.ENAME,E.SAL FROM EMP E

WHERE E.SAL>(SELECT E.SAL FROM EMP E WHERE E.EMPNO=7788)

AND E.JOB=(SELECT E.JOB FROM EMP E WHERE E.EMPNO=7369);

--2.查询工资最高的员工姓名和工资。

SELECT E.ENAME,E.SAL FROM EMP E WHERE E.SAL=(SELECT MAX(E.SAL) FROM EMP E);

--3.查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。

SELECT D.DEPTNO,D.DNAME,MIN(E.SAL) FROM EMP E JOIN DEPT D ON E.DEPTNO=D.DEPTNO

GROUP BY D.DEPTNO,D.DNAME

HAVING MIN(E.SAL)>(SELECT MIN(E.SAL) FROM EMP E WHERE D.DEPTNO=10);

--4.查询员工工资为其部门最低工资的员工的编号和姓名及工资。

SELECT E.DEPTNO,E.ENAME,E.SAL FROM EMP E

WHERE E.SAL=ANY(

SELECT MIN(E.SAL) FROM EMP E GROUP BY E.DEPTNO) GROUP BY E.DEPTNO,E.ENAME,E.SAL;

----

SELECT E.DEPTNO,E.ENAME,E.SAL FROM EMP E,(SELECT E.DEPTNO,MIN(E.SAL) MINSAL FROM EMP E GROUP BY E.DEPTNO) EE

WHERE E.DEPTNO=EE.DEPTNO

AND E.SAL=EE.MINSAL;

--5.显示经理是KING的员工姓名,工资。

SELECT E.ENAME,E.SAL FROM EMP E

WHERE E.MGR=(

SELECT E.EMPNO FROM EMP E WHERE E.ENAME='KING');

--6.显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间。

SELECT E.ENAME,E.SAL,E.HIREDATE FROM EMP E

WHERE E.HIREDATE>(SELECT E.HIREDATE FROM EMP E WHERE UPPER(E.ENAME)=UPPER('SMITH'));

--7.使用子查询的方式查询哪些职员在NEW YORK工作。???

SELECT * FROM EMP E JOIN DEPT D ON E.DEPTNO=D.DEPTNO

WHERE D.LOC='NEW YORK' ;

SELECT FROM EMP E

;

--8.写一个查询显示和员工SMITH工作在同一个部门的员工姓名,雇用日期,查询结果中排除SMITH。

SELECT E.ENAME,E.HIREDATE FROM EMP E

WHERE (E.DEPTNO=(

SELECT E.DEPTNO FROM EMP E WHERE UPPER(E.ENAME)=UPPER('SMITH'))

)AND UPPER(E.ENAME)!=UPPER('SMITH');

--9.写一个查询显示其工资比全体职员平均工资高的员工编号、姓名。

SELECT E.EMPNO,E.ENAME FROM EMP E

WHERE E.SAL>(SELECT AVG(NVL(E.SAL,0)) FROM EMP E);

--10.写一个查询显示其上级领导是King的员工姓名、工资。

SELECT E.ENAME,E.SAL FROM EMP E

WHERE E.MGR=(

SELECT E.EMPNO FROM EMP E WHERE E.ENAME='KING');

--11.显示所有工作在RESEARCH部门的员工姓名,职位。

SELECT E.ENAME,E.JOB FROM EMP E,DEPT D

WHERE E.DEPTNO=D.DEPTNO AND D.DNAME='RESEARCH';

--12.查询每个部门的部门编号、平均工资,要求部门的平均工资高于部门20的平均工资。

SELECT E.DEPTNO,AVG(NVL(E.SAL ,0)) FROM EMP E

GROUP BY E.DEPTNO

HAVING AVG(NVL(E.SAL ,0))>(SELECT AVG(NVL(E.SAL ,0)) FROM EMP E WHERE E.DEPTNO=20);

--13.查询大于自己部门平均工资的员工姓名,工资,所在部门平均工资,高于部门平均工资的额度。

SELECT E.ENAME,E.SAL,D.DNAME,E.SAL-MM.AVGSAL FROM EMP E ???????

JOIN DEPT D ON E.DEPTNO=D.DEPTNO

JOIN (SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) AVGSAL FROM EMP E GROUP BY E.DEPTNO) MM ON E.JOB=MM.MMJOB

WHERE E.SAL>MM.AVGSAL ;

--14.列出至少有一个雇员的所有部门

SELECT COUNT(*) ,DEPTNO FROM EMP

GROUP BY DEPTNO

HAVING COUNT(*)>0???????????/

SELECT D.DEPTNO,COUNT(E.DEPTNO) FROM DEPT D

LEFT JOIN EMP E ON E.DEPTNO=D.DEPTNO

WHERE COUNT(E.DEPTNO)>=1;

--15.列出薪金比"SMITH"多的所有雇员

SELECT * FROM EMP E

WHERE E.SAL>(

SELECT E.SAL FROM EMP E WHERE UPPER(E.ENAME)=UPPER('SMITH'));

--16.列出入职日期早于其直接上级的所有雇员

SELECT E.*,M.HIREDATE MhIREDATE FROM EMP E,EMP M WHERE E.MGR=M.EMPNO AND E.HIREDATE<M.HIREDATE;

--17.找员工姓名和直接上级的名字

SELECT E.ENAME,M.ENAME MNAME FROM EMP E,EMP M WHERE E.MGR=M.EMPNO;

--18.显示部门名称和人数

SELECT D.DNAME,COUNT(DISTINCT E.EMPNO) FROM DEPT D

LEFT JOIN EMP E ON E.DEPTNO=D.DEPTNO

GROUP BY D.DNAME;

--19.显示每个部门的最高工资的员工

SELECT MAX(E.SAL) FROM EMP E GROUP BY E.DEPTNO--子查询:每个部门的最高工资

SELECT * FROM EMP E,(SELECT MAX(E.SAL) MAXSAL,E.DEPTNO SELTDEPTNO FROM EMP E GROUP BY E.DEPTNO) S

WHERE E.DEPTNO=S.SELTDEPTNO AND E.SAL=S.MAXSAL;

--20.显示出和员工号7369部门相同的员工姓名,工资

SELECT E.ENAME,E.SAL FROM EMP E

WHERE E.DEPTNO=(

SELECT E.DEPTNO FROM EMP E WHERE E.EMPNO=7369);

--21.显示出和姓名中包含"W"的员工相同部门的员工姓名

SELECT E.ENAME FROM EMP E

WHERE E.DEPTNO=(

SELECT E.DEPTNO FROM EMP E WHERE INSTR(E.ENAME,'W')>0);

--22.显示出工资大于平均工资的员工姓名,工资

SELECT E.ENAME,E.SAL FROM EMP E

WHERE E.SAL>(SELECT AVG(NVL(E.SAL,0)) FROM EMP E);

--23.显示出工资大于本部门平均工资的员工姓名,工资

SELECT AVG(NVL(E.SAL,0)) FROM EMP E GROUP BY E.DEPTNO;---子查询:每个部门的平均工资

SELECT E.ENAME,E.SAL

FROM EMP E

WHERE E.SAL>(SELECT AVG(NVL(E.SAL,0)) FROM EMP E GROUP BY E.DEPTNO);?????

--24.显示每位经理管理员工的最低工资,及最低工资者的姓名

-------方式1:------

SELECT E.ENAME,MS.MINSAL

FROM EMP E JOIN

(SELECT E.MGR,MIN(NVL(E.SAL,0)) MINSAL FROM EMP E GROUP BY E.MGR) MS ON E.MGR=MS.MGR

WHERE E.SAL=MS.MINSAL;

-------方式2:------

SELECT E.ENAME,E.SAL

FROM EMP E WHERE (E.MGR,E.SAL)=ANY(

SELECT E.MGR,MIN(NVL(E.SAL,0)) MINSAL FROM EMP E GROUP BY E.MGR);

--25.显示比工资最高的员工参加工作时间晚的员工姓名,参加工作时间

SELECT E.HIREDATE FROM EMP E WHERE E.SAL=(SELECT MAX(E.SAL) FROM EMP E);---子查询:工资最高的员工的参加工作时间

-------方式1:------

SELECT E.ENAME,E.HIREDATE FROM EMP E

WHERE E.HIREDATE>ANY(

SELECT E.HIREDATE FROM EMP E WHERE E.SAL=(SELECT MAX(E.SAL) FROM EMP E));

-------方式2:------

SELECT E.ENAME,E.HIREDATE FROM EMP E

WHERE E.HIREDATE> (

SELECT MIN(NVL(E.HIREDATE,SYSDATE)) FROM EMP E WHERE E.SAL=(SELECT MAX(E.SAL) FROM EMP E));

--26.显示出平均工资最高的的部门平均工资及部门名称

SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) FROM EMP E GROUP BY E.DEPTNO;---子查询:每个部门的平均工资

-------方式1:------需要考虑的问题是:Oracle的等值关系是否会按照两个子表的顺序进行关联?

SELECT D.DNAME,T.AVGSAL

FROM (SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) AVGSAL FROM EMP E GROUP BY E.DEPTNO ORDER BY AVGSAL DESC) T

JOIN DEPT D ON D.DEPTNO=T.DEPTNO

WHERE ROWNUM=1;

-------方式2:-

-----

SELECT ROWNUM,TEMP.* FROM(

SELECT D.DNAME,T.AVGSAL

FROM DEPT D JOIN(SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) AVGSAL FROM EMP E GROUP BY E.DEPTNO ) T

ON D.DEPTNO=T.DEPTNO

ORDER BY T.AVGSAL DESC) TEMP

WHERE ROWNUM=1;

-------方式3:------

SELECT D.DNAME,T.AVGSAL

FROM (SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) AVGSAL FROM EMP E GROUP BY E.DEPTNO) T

JOIN DEPT D ON D.DEPTNO=T.DEPTNO

WHERE T.AVGSAL=(SELECT MAX(AVG(NVL(E.SAL,0))) FROM EMP E GROUP BY E.DEPTNO);

标签: #oracle统计嵌套查询 #oracle关联子表效率