百度空间 | 百度首页 
 
查看文章
 
oracle习题带答案(二)
2008-08-07 16:00

使用scott/tiger用户下的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.
select distinct dname
from dept
where deptno in
          (select distinct deptno
           from emp);

要查部门编号如果存在于emp 表中,说明这个部门有员工。

2.
select ename,job,mgr,hiredate,sal
from emp
where sal>
        (select sal
         from emp
         where ename='SMITH');

3.
select e.ename, e.mgr , w.ename
from emp e, emp w
where e.mgr=w.empno;

4.
select e.ename, e.mgr , e.hiredate,w.ename,w.hiredate
from emp e, emp w
where e.mgr=w.empno
and e.hiredate< w.hiredate;

5.
select e.ename,e.hiredate, d.dname,d.deptno
from emp e, dept d
where e.deptno (+)=d.deptno;

本例子使用的是外连接, 也可以用右连接。
select e.ename,e.hiredate, d.dname,d.deptno
from emp e right join dept d
on e.deptno=d.deptno;

6.
select e.ename,e.hiredate,e.job, d.dname,d.deptno
from emp e, dept d
where e.deptno =d.deptno
and e.job=upper('clerk');

7.
select job, min(sal)
from emp
group by job
having min(sal)>1500;

8.
select e.ename,d.dname
from emp e,dept d
where e.deptno=d.deptno
and d.dname=upper('sales');
或者:
select ename
from emp
where deptno =
      (select deptno
       from dept
       where dname=upper('SALES'));

9.
select ename, job, sal
from emp
where sal>
        (select avg(sal)
         from emp );

10.
select ename, job
from emp
where job =
       (select job
        from emp
        where ename=upper('scott'));
11.

select ename, sal,job
from emp
where sal in
       (select sal
        from emp
        where deptno=30);
12.
select ename, sal,job
from emp
where sal >all
       (select sal
        from emp
        where deptno=30);

或者
select ename ,sal
from emp
where sal>
       (select max(sal)
        from emp
        where deptno=30);

13.

select d.deptno,d.dname, count(e.ename), avg(e.sal), avg(months_between(sysdate,e.hiredate))
from emp e, dept d
where e.deptno(+)= d.deptno
group by d.deptno,dname;

或者下面的方法,这种方法更好理解,把需要汇总的生成一个视图e。
select e.*,d.dname ,
from (select deptno, count(ename) ,avg(sal),avg(months_between(sysdate,hiredate))
      from emp
      group by deptno) e, dept d
where e.deptno =d.deptno;

14.

select d.dname, e.ename, sal+nvl(comm,0)
from emp e, dept d
where d.deptno=e.deptno;

15.
select e.ename,e.job, e.deptno ,d.job, d.deptno
from emp e, emp d
where e.job=d.job and e.deptno<>d.deptno;

16.
select count(e.ename),d.dname
from emp e, dept d
where e.deptno(+)= d.deptno
group by e.deptno,d.dname;

或者写成
select d.deptno,e.*,d.dname
from (select deptno,count(ename)
     from emp
     group by deptno) e,dept d
where e.deptno(+)= d.deptno;

17.

select job,min(sal+nvl(comm,0))from emp group by job;

18.
select deptno,min(sal) from emp where job=upper('manager')
group by deptno ;

19.
select ename , (sal+nvl(comm,0))*12   yearsal
from emp
order by yearsal ;


类别:oracle学习 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu