目录
列出薪金比 SMITH 或 ALLEN 多的所有员工的编号、姓名、部门名称、领导姓名、部门人数,以及所在部门的平均工资、最高和最低工资
补充
spool
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
列出薪金比 SMITH 或 ALLEN 多的所有员工的编号、姓名、部门名称、领导姓名、部门人数,以及所在部门的平均工资、最高和最低工资
确定要使用的数据表
emp 表:员工的编号、姓名
dept 表:部门名称
emp 表:领导姓名
emp 表:统计信息
确定已知的关联字段
员工与部门:emp.deptno=dept.deptno
员工与领导:emp.mgr=memp.empno
第一步:知道 SMITH 或 ALLEN 的薪金,这个查询返回多行单列(WHERE 中使用)。
SQL> select sal
2 from emp
3 where ename in('SMITH','ALLEN');
SAL
----------
800
1600
第二步:应该比里面的任意一个多即可,但是要去掉这两个员工
由于是多行单列子查询,所以使用 >ANY 完成
SQL> select e.empno,e.ename,e.sal
2 from emp e
3 where e.sal>any(
4 select sal
5 from emp
6 where ename in('SMITH','ALLEN'))
7 and e.ename not in('SMITH','ALLEN');
EMPNO ENAME SAL
---------- -------------------- ----------
7839 KING 5000
7902 FORD 3000
7566 JONES 2975
7698 BLAKE 2850
7782 CLARK 2450
7844 TURNER 1500
7934 MILLER 1300
7654 MARTIN 1250
7521 WARD 1250
7900 JAMES 950
已选择 10 行。
第三步:找到部门名称
SQL> select e.empno,e.ename,e.sal,d.dname
2 from emp e,dept d
3 where e.sal>any(
4 select sal
5 from emp
6 where ename in('SMITH','ALLEN'))
7 and e.ename not in('SMITH','ALLEN')
8 and e.deptno=d.deptno;
EMPNO ENAME SAL DNAME
---------- -------------------- ---------- ----------------------------
7839 KING 5000 ACCOUNTING
7902 FORD 3000 RESEARCH
7566 JONES 2975 RESEARCH
7698 BLAKE 2850 SALES
7782 CLARK 2450 ACCOUNTING
7844 TURNER 1500 SALES
7934 MILLER 1300 ACCOUNTING
7521 WARD 1250 SALES
7654 MARTIN 1250 SALES
7900 JAMES 950 SALES
第四步:找到领导信息
SQL> select e.empno,e.ename,e.sal,d.dname,m.ename
2 from emp e,dept d,emp m
3 where e.sal>any(
4 select sal
5 from emp
6 where ename in('SMITH','ALLEN'))
7 and e.ename not in('SMITH','ALLEN')
8 and e.deptno=d.deptno
9 and e.mgr=m.empno(+);
EMPNO ENAME SAL DNAME ENAME
---------- -------------------- ---------- ---------------------------- --------------------
7902 FORD 3000 RESEARCH JONES
7844 TURNER 1500 SALES BLAKE
7521 WARD 1250 SALES BLAKE
7654 MARTIN 1250 SALES BLAKE
7900 JAMES 950 SALES BLAKE
7934 MILLER 1300 ACCOUNTING CLARK
7566 JONES 2975 RESEARCH KING
7698 BLAKE 2850 SALES KING
7782 CLARK 2450 ACCOUNTING KING
7839 KING 5000 ACCOUNTING
已选择 10 行。
第五步:得到部门人数,以及部门平均工资、最高和最低工资
整个查询里面不能够直接使用GROUP BY,所以现在应该利用子查询实现统计操作
SQL> select e.empno,e.ename,e.sal,d.dname,m.ename,temp.count,temp.avg,temp.max,temp.min
2 from emp e,dept d,emp m,(
3 select deptno dno,count(empno) count,avg(sal) avg,max(sal) max,min(sal) min
4 from emp
5 group by deptno) temp
6 where e.sal>any(
7 select sal
8 from emp
9 where ename in('SMITH','ALLEN'))
10 and e.ename not in('SMITH','ALLEN')
11 and e.deptno=d.deptno
12 and e.mgr=m.empno(+)
13 and d.deptno=temp.dno;
EMPNO ENAME SAL DNAME ENAME COUNT AVG MAX MIN
---------- -------------------- ---------- ---------------------------- -------------------- ---------- ---------- ---------- ----------
7902 FORD 3000 RESEARCH JONES 3 2258.33333 3000 800
7844 TURNER 1500 SALES BLAKE 6 1566.66667 2850 950
7654 MARTIN 1250 SALES BLAKE 6 1566.66667 2850 950
7521 WARD 1250 SALES BLAKE 6 1566.66667 2850 950
7900 JAMES 950 SALES BLAKE 6 1566.66667 2850 950
7934 MILLER 1300 ACCOUNTING CLARK 3 2916.66667 5000 1300
7566 JONES 2975 RESEARCH KING 3 2258.33333 3000 800
7698 BLAKE 2850 SALES KING 6 1566.66667 2850 950
7782 CLARK 2450 ACCOUNTING KING 3 2916.66667 5000 1300
7839 KING 5000 ACCOUNTING 3 2916.66667 5000 1300
已选择 10 行。
补充
spool
在数据库实际操作中,需要将查询结果输出到指定文件中,此时可以使用 spool 命令
spool filename [create][replace][append]|OFF|OUT
其中
filename 为输出的文件名称,默认的扩展名为 LST,后面所跟参数作用如下
create 表示创建新的文件,是默认状态
replace 表示替代已经存在的文件
append 表示把查询内容附加到已经存在的文件中
OFF|OUT 表示关闭输出
例如:
下面代码将查询结果输出到 D 盘的 temp.ext 文件中
SQL> spool d:\temp.txt
SQL> select empno,ename,job from emp;
EMPNO ENAME JOB
---------- -------------------- ------------------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
7566 JONES MANAGER
7654 MARTIN SALESMAN
7698 BLAKE MANAGER
7782 CLARK MANAGER
7839 KING PRESIDENT
7844 TURNER SALESMAN
7900 JAMES CLERK
7902 FORD ANALYST
EMPNO ENAME JOB
---------- -------------------- ------------------
7934 MILLER CLERK
8989 HELLO
已选择 13 行。
SQL> spool off
此时,我的D盘就有了这个文件,内容如下