10_子查询------随堂练习
1、列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称,上级的姓名
第一步:使用emp表实现自身关联,查询出员工的编号,姓名,上级姓名
SELECT e.empno,e.ename,m.ename FROM emp e,emp m
WHERE e.mgr = m.empno(+) AND e.hiredate < m.hiredate;
第二步:找到部门名称
SELECT e.empno,e.ename,m.ename,d.dname FROM emp e,emp m ,dept d
WHERE e.mgr = m.empno(+) AND e.hiredate < m.hiredate AND e.deptno = d.deptno;
select e.employee_id , e.last_name , m.last_name,d.department_name
from employees e , employees m , departments d
where e.manager_id = m.employee_id and e.hire_date < m.hire_date and e.department_id = d.department_id;
2、列出薪金比“SMITH”高的所有员工
第一步:找到SMITH的工资
SELECT sal FROM emp WHERE ename = 'SMITH';
第二步:使用1的结果在WHERE子句中,执行查询
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename = 'SMITH');
3、列出所有“CLERK”(办事员)的姓名及其部门名称,部门人数
第一步:找到所有的办事员信息
SELECT e.ename FROM emp e WHERE e.job = 'CLERK' ;
第二步:找到部门数据
SELECT e.ename,d.dname FROM emp e , dept d WHERE e.job = 'CLERK' AND e.deptno = d.deptno;
第三步:增加子查询,查询部门人数
SELECT e.ename,d.dname ,temp.count FROM emp e,dept d,(
SELECT deptno dno,COUNT(empno) count FROM emp GROUP BY deptno) temp
WHERE e.job = 'CLERK' AND e.deptno = d.deptno AND d.deptno = temp.dno;
4、列出与“SCOTT”从事相同工作的所有员工及部门名称
SELECT job FROM emp WHERE ename = 'SCOTT';
第二步:筛选员工数据和部门名称
SELECT e.* ,d.* FROM emp e,dept d WHERE e.deptno = d.deptno AND e.job = (
SELECT job FROM emp WHERE ename = 'SCOTT');
5、列出各职位的最低工资以及从事此工作的雇员姓名。
第一步:按照职位分组,进而统计出职位名称和最低工资
SELECT job,MIN(sal) min FROM emp GROUP BY job;
第二步:将以上的查询作为FROM 子句的数据
SELECT e.* FROM emp e,(
SELECT job ,MIN(sal) min FROM emp GROUP BY job) temp
WHERE e.job = temp.job AND e.sal = temp.min;
6.部门平均工资最高的部门名称
第一步:按照部门分组,查询出所有部门中平均工资的最大值
SELECT max(avg(sal)) FROM emp GROUP BY deptno
第二步:按照部门分组,查询出平均工资最高的部门的部门编号
SELECT deptno FROM emp GROUP BY deptno
HAVING AVG (sal) = (
SELECT MAX (AVG(sal)) FROM emp GROUP BY deptno
)
第三步:根据获得的部门编号,得到部门的详细信息
SELECT * FROM dept WHERE deptno = (
SELECT deptno FROM emp GROUP BY deptno
HAVING AVG (sal) = (
SELECT MAX (AVG(sal)) FROM emp GROUP BY deptno
)
)