1. 列出至少有3个员工的所有部门
解:
第一步:通过部门分组实现,求出所有部门的员工数量
Select deptno,count(deptno) from emp group by deptno;
第二步:通过having子句来实现员工人数大于3个,注意having子句在形成分组后才起作用。
Select deptno,count(deptno)from emp group by edptno having count(deptno)>3;
第三步:通过部门表,做联合查询即可查询出部门的详细信息(要详细列出另外一个表达信息可以通过表加.*,例如dept.*)
Select dept.deptno,dept.dname,dept.loc,qdept.coun
from (Select deptno,count(deptno) coun from emp group by deptno having count(deptno)>3) qdept,dept
where qdept.deptno=dept.deptno;
2. 列出薪金比“SMITH”多的所有员工
第一步:先求出该员工的薪金
Select sal from emp where ename=’SMITH’;
第二步:以上面的结果为条件,查询所有符合条件的雇员信息
自己的答案:
select emp.* from emp,(select sal from emp where ename='SMITH') query where emp.sal>query.sal;
标准答案:select * from emp where sal>(select sal from emp where ename='SMITH');
总结:自己过于滥用联合查询。
3. 列出所有员工的姓名及其直接上级的姓名
解:此程序涉及自身关联查询
自己解答:
select emp1.empno,emp1.ename,emp1.job,emp1.mgr,emp2.ename from emp emp1,emp emp2 where emp1.mgr=emp2.empno ;
标准答案:select e.ename,m.ename from emp e,emp m where e.mgr=m.empo(+)做连接操作
4. 列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
第一步:自身关联,查找mgr=empno的同时还要比较hiredate,先查询编号、姓名
Select e.empno,e.ename
From emp e,emp m
Where e.mgr=m.empno and e.hiredate<m.hiredate;
第二步:如果要加入部门的名称,则肯定应该加入dept表,做表关联查询
Select e.empno,e.ename,dept.dname
From emp e,emp m,dept
Where e.mgr=m.empno and e.hiredate<m.hiredate and e.deptno=dept.deptno;
5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
解:左、右关联问题
自己解答:SQL> select emp.*,dept.dname from dept,emp where dept.deptno=emp.deptno(+);
6. 列出所有“CLERK”(办事员)的姓名及其部门名称,部门的人数。
第一步:找出所有办事员的姓名及其编号
Select ename,deptno
From emp
Where job=’CLERK’;
第二步:如果要找到部门名称,则肯定要使用部门表。
Select e.ename,d.dname from emp e,dept d where e.job=’CLERK’ AND e.deptno=d.deptno;
第三步:部门人数肯定要使用分组完成,一旦使用分组,肯定是group by.
Select e.name,d.dname,ed.cou From emp e,dept d,(select deptno,count(empno) cou from emp group by deptno) ed Where job=’CLERK’ AND e.deptno=d.deptno and ed.deptno=e.deptno;
7.
8. 总结:
多表查询,要注意产生的笛卡尔积
分组统计,所有的统计函数只能在分组语句中使用
子查询,子查询可以在任意的位置上编写
Commit rollback命令的使用、约束的建立和删除 、视图的作用及创建