当前位置: 代码迷 >> Oracle开发 >> 子查询3(在FROM子句中使用子查询)
  详细解决方案

子查询3(在FROM子句中使用子查询)

热度:65   发布时间:2016-04-24 06:30:49.0
子查询三(在FROM子句中使用子查询)

FROM子句中使用子查询一般都是返回多行多列,可以将其当作一张数据表

 

示例一、查询出每个部门的编号,名称,位置,部门人数,平均工资

SELECT d.deptno,d.dname,d.loc,temp.con,temp.avgsalFROM dept d,(SELECT deptno dno,COUNT(empno) con,ROUND (AVG(sal),2) avgsal             FROM emp              GROUP BY deptno) tempWHERE d.deptno=temp.dno;

 

示例二、查询出所有在部门SALES(销售部)工作的员工编号,姓名,基本工资,奖金,职位,入职日期,部门最高和最低工资

SELECT e.empno,e.ename,e.sal,e.comm,e.job,e.hiredate,e.deptno,temp.maxsal,temp.minsalFROM emp e,(            SELECT deptno dno,MAX(sal) maxsal,MIN(sal) minsal            FROM emp            GROUP BY deptno            ) tempWHERE e.deptno=(SELECT deptno                 FROM dept                 WHERE dname='SALES')                 AND e.deptno=temp.dno;

 

示例三、查询出所有工资高于公司平均工资的员工编号,姓名,基本工资,职位,入职日期,部门名称,位置,上级领导姓名,公司的工资等级,部门人数,平均工资,平均服务年限

SELECT e.empno,e.ename,e.job,e.hiredate,d.dname,d.loc,m.ename,s.grade,temp.avgsal,temp.avgyearFROM emp e,dept d,emp m,salgrade s,(                                   SELECT deptno dno,COUNT(empno) con,ROUND (AVG(sal),2) avgsal,ROUND(AVG(months_between(SYSDATE,hiredate)/12),2) avgyear                                   FROM emp                                   GROUP BY deptno                                   ) tempWHERE e.sal>(SELECT AVG(sal)              FROM emp)              AND e.deptno=d.deptno              AND e.mgr=m.empno(+)              AND e.sal BETWEEN s.losal AND s.hisal              AND e.deptno=temp.dno;

 

示例四、列出工资比ALLEN或者CLARK多的所有员工的编号,姓名,基本工资,部门名称,领导姓名,部门人数

SELECT e.empno,e.ename,e.sal,d.dname,m.ename,temp.conFROM emp e,dept d,emp m,(                          SELECT deptno dno,COUNT(empno) con                          FROM emp                          GROUP BY deptno                          )tempWHERE e.sal>ANY(SELECT sal                 FROM emp                 WHERE ename IN('ALLEN','CLARK')                 )              AND e.ename NOT IN ('ALLEN','CLARK')              AND e.deptno=d.deptno              AND e.mgr=m.empno(+)              AND e.deptno=temp.dno;

 

示例五、列出公司各个部门的经理(一个部门只有一个)的姓名,工资,部门名称,部门人数,部门平均工资

 

--列出公司各个部门的经理(一个部门只有一个)的姓名,工资,部门名称,部门人数,部门平均工资SELECT e.ename,e.sal,d.dname,temp.con,temp.avgsalFROM emp e,dept d,(                    SELECT deptno dno,COUNT(empno) con,ROUND(AVG(sal),2) avgsal                   FROM emp                   GROUP BY deptno                   )tempWHERE e.job='MANAGER'       AND e.deptno=d.deptno(+)       AND e.deptno=temp.dno;

 

 

 

  相关解决方案