使用Emp表和Dept表完成下列练习
Emp员工表
empno |
ename |
job |
Mgr |
Hiredate |
Sal |
Comm |
Deptno |
员工号 |
员工姓名 |
工作 |
上级编号 |
受雇日期 |
薪金 |
佣金 |
部门编号 |
Dept表
Deptno |
Dname |
Loc |
部门编号 |
部门名称 |
地点 |
1.列出至少有一个员工的所有部门。
2.列出薪金比“SMITH”多的所有员工。
3.列出所有员工的姓名及其直接上级的姓名。
4.列出受雇日期早于其直接上级的所有员工。
5.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
6.列出所有“CLERK”(办事员)的姓名及其部门名称。
7.列出最低薪金大于1500的各种工作。
8.列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
9.列出薪金高于公司平均薪金的所有员工。
10.列出与“SCOTT”从事相同工作的所有员工。
11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
13.列出在每个部门工作的员工数量、平均工资和平均服务期限。
14.列出所有员工的姓名、部门名称和工资。
15.列出从事同一种工作但属于不同部门的员工的一种组合。
16.列出所有部门的详细信息和部门人数。
17.列出各种工作的最低工资。
18.列出各个部门的MANAGER(经理)的最低薪金。
19.列出所有员工的年工资,按年薪从低到高排序。
1 1. 2 select distinct dname 3 from dept 4 where deptno in 5 (select distinct deptno 6 from emp); 7 --要查部门编号如果存在于emp 表中,说明这个部门有员工。 8 2. 9 select ename,job,mgr,hiredate,sal 10 from emp 11 where sal> 12 (select sal 13 from emp 14 where ename='SMITH'); 15 3. 16 select e.ename, e.mgr , w.ename 17 from emp e, emp w 18 where e.mgr=w.empno; 19 4. 20 select e.ename, e.mgr , e.hiredate,w.ename,w.hiredate 21 from emp e, emp w 22 where e.mgr=w.empno 23 and e.hiredate< w.hiredate; 24 5. 25 select e.ename,e.hiredate, d.dname,d.deptno 26 from emp e, dept d 27 where e.deptno (+)=d.deptno; 28 --本例子使用的是外连接, 也可以用右连接。 29 select e.ename,e.hiredate, d.dname,d.deptno 30 from emp e right join dept d 31 on e.deptno=d.deptno; 32 6. 33 select e.ename,e.hiredate,e.job, d.dname,d.deptno 34 from emp e, dept d 35 where e.deptno =d.deptno 36 and e.job=upper('clerk'); 37 7. 38 select job, min(sal) 39 from emp 40 group by job 41 having min(sal)>1500; 42 8. 43 select e.ename,d.dname 44 from emp e,dept d 45 where e.deptno=d.deptno 46 and d.dname=upper('sales'); 47 --或者: 48 select ename 49 from emp 50 where deptno = 51 (select deptno 52 from dept 53 where dname=upper('SALES')); 54 9. 55 select ename, job, sal 56 from emp 57 where sal> 58 (select avg(sal) 59 from emp ); 60 10. 61 select ename, job 62 from emp 63 where job = 64 (select job 65 from emp 66 where ename=upper('scott')); 67 11. 68 select ename, sal,job 69 from emp 70 where sal in 71 (select sal 72 from emp 73 where deptno=30); 74 12. 75 select ename, sal,job 76 from emp 77 where sal >all 78 (select sal 79 from emp 80 where deptno=30); 81 --或者 82 select ename ,sal 83 from emp 84 where sal> 85 (select max(sal) 86 from emp 87 where deptno=30); 88 13. 89 select d.deptno,d.dname, count(e.ename), avg(e.sal), avg(months_between(sysdate,e.hiredate)) 90 from emp e, dept d 91 where e.deptno(+)= d.deptno 92 group by d.deptno,dname; 93 --或者下面的方法,这种方法更好理解,把需要汇总的生成一个视图e。 94 select e.*,d.dname , 95 from (select deptno, count(ename) ,avg(sal),avg(months_between(sysdate,hiredate)) 96 from emp 97 group by deptno) e, dept d 98 where e.deptno =d.deptno; 99 14. 100 select d.dname, e.ename, sal+nvl(comm,0) 101 from emp e, dept d 102 where d.deptno=e.deptno; 103 15. 104 select e.ename,e.job, e.deptno ,d.job, d.deptno 105 from emp e, emp d 106 where e.job=d.job and e.deptno<>d.deptno; 107 16. 108 select count(e.ename),d.dname 109 from emp e, dept d 110 where e.deptno(+)= d.deptno 111 group by e.deptno,d.dname; 112 --或者写成 113 select d.deptno,e.*,d.dname 114 from (select deptno,count(ename) 115 from emp 116 group by deptno) e,dept d 117 where e.deptno(+)= d.deptno; 118 17. 119 select job,min(sal+nvl(comm,0))from emp group by job; 120 18. 121 select deptno,min(sal) from emp where job=upper('manager') 122 group by deptno ; 123 19. 124 select ename , (sal+nvl(comm,0))*12 yearsal 125 from emp 126 order by yearsal ;