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

第二步:如果要加入部门的名称,则肯定应该加入dept表,做表关联查询

Select e.empno,e.ename,dept.dname

From emp e,emp m,dept

Where e.mgr=m.empno and e.hiredate

 

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命令的使用、约束的建立和删除 、视图的作用及创建