在某软件公司里,要建立一个数据库来管理员工和项目,其中职员的信息包括员工编号、姓名、性别、生日、祖籍、工资信息,要求员工编号不能重复,姓名必须填写,性别如果不做特别说明默认为男,而且不能填写除‘男’或‘女’之外的其它任何字;项目的信息包括项目编号、项目名称、起始日期、结束日期、预算,要求项目编号从1001号起每个项目递增1,项目名称不能重复且不可空着。注意:职员是要做项目的!!
(1) 创建用户及表,并创建相应的约束
(2) 使用语句插入以下信息
1号员工王晓明 女 1980-1-3 山东青岛 8900
2号员工王涵 男 1978-6-12 广东佛山 7600
3号员工李有才 男 1978-5-23 上海 7800
4号员工张小小 女 1982-9-7 山东济南 4500
项目名称:小型监控系统 起始日期:2009-8-6 结束日期:2010-1-1 预算:100000
项目名称:办公网络安全 起始日期:2009-12-30 结束日期:2010-10-1 预算:450000
项目名称:电子购物广场 起始日期:2009-11-30 结束日期:2009-12-31 预算:12000
其中 王晓明三个项目都参加了
王涵参与了电子购物广场和办公室安全项目
李有才参与了小型监控系统和办公网络安全项目
张小小只参与了小型监控系统一个项目
(3) 使用语句做以下检索
a) 查询公司中所有的王姓员工
b) 查询参与了预算最多的员工有哪些
c) 检索一下每个项目有多少员工参与了
d) 检索李有才的基本信息及其参与的项目信息
(4) 使用语句修改以下信息
a) 将所有员工的祖籍信息前都加上‘中国’二字,比如‘山东青岛’改为‘中国山东青岛’
b) 将参与了‘办公网络安全’项目的职工的工资都加上200元
(5) 使用语句完成以下删除
a) 只保留李有才一个人在小型监控系统项目中,其他参与该项目的人不再插手该项目
(6) 创建一个名为‘检索信息’的存储过程,该存储过程完成检索指定员工号所参与的项目总数,其中员工号为输入参数,项目总数为输出参数
(7) 调用‘检索信息’存储过程,完成检索1号员工参与的项目总数。
-
--1.
-
--(1) 创建用户及表,并创建相应的约束
-
create table staff
-
(
-
sno number primary key,
-
sname varchar2(10) not null,
-
ssex varchar2(3) default '男' check(ssex='男' or ssex='女') ,
-
sbitthday date,
-
sddr varchar2(20),
-
salary number
-
);
-
-
create table proj
-
(
-
pno number primary key,
-
pname varchar2(20),
-
sdate date,
-
edate date,
-
buget number
-
);
-
-
create table sp
-
(
-
sno number ,
-
pno number ,
-
primary key (sno,pno),
-
foreign key(sno) references staff(sno),
-
foreign key(pno) references proj(pno)
-
);
-
-
commit;
-
--(2) 使用语句插入以下信息
-
insert into staff values(1,'王晓明','女','03-1月-1980','山东青岛',8900);
-
insert into staff values(2,'王涵','男','12-6月-1978','广东佛山',7600);
-
insert into staff values(3,'李有才','男','23-5月-1978','上海',7800);
-
insert into staff values(4,'张小小','女','07-9月-1982','山东济南',4500);
-
-
select * from STAFF;
-
-
insert into proj values(1001,'小型监控系统','06-8月-2009','01-1月-2010',100000);
-
insert into proj values(1002,'办公网络安全','30-12月-2009','30-11月-2009',450000);
-
insert into proj values(1003,'电子购物广场','30-11月-2009','31-12月-2009',12000);
-
-
select * from proj;
-
-
insert into sp values(1,1001);
-
insert into sp values(1,1002);
-
insert into sp values(1,1003);
-
insert into sp values(2,1002);
-
insert into sp values(2,1003);
-
insert into sp values(3,1002);
-
insert into sp values(3,1001);
-
insert into sp values(4,1001);
-
-
select * from sp;
-
-
commit;
-
--(3) 使用语句做以下检索
-
--a) 查询公司中所有的王姓员工
-
select * from STAFF
-
where SNAME like '王%';
-
-
--b) 查询参与了预算最多的员工有哪些
-
select * from
-
(select staff.sno,sname,sum(buget)
-
from STAFF join SP on staff.sno=sp.sno join proj on sp.pno=proj.pno
-
group by staff.sno,sname
-
order by sum(buget) desc)
-
where rownum<2;
-
-
--c) 检索一下每个项目有多少员工参与了
-
select pno ,count(sno)
-
from SP
-
group by pno;
-
-
--d) 检索李有才的基本信息及其参与的项目信息
-
select *
-
from STAFF join SP on staff.sno=sp.sno join proj on sp.pno=proj.pno
-
where sname='李有才';
-
-
--(4) 使用语句修改以下信息
-
--a) 将所有员工的祖籍信息前都加上‘中国’二字,比如‘山东青岛’改为‘中国山东青岛’
-
update staff set SDDR=concat('中国',sddr);
-
select *from staff;
-
-
--b) 将参与了‘办公网络安全’项目的职工的工资都加上200元
-
update staff set SALARY=salary+200
-
where sno in (SELECT sno
-
FROM SP join PROJ on sp.pno=PROJ.pno
-
where pname='办公网络安全' );
-
-
select * from staff
-
where sno in (SELECT sno
-
FROM SP join PROJ on sp.pno=PROJ.pno
-
where pname='办公网络安全' );
-
-
--(5) 使用语句完成以下删除
-
--a) 只保留李有才一个人在小型监控系统项目中,其他参与该项目的人不再插手该项目
-
DELETE from sp
-
where PNO=(select pno from PROJ where pname='小型监控系统')and
-
sno!=(select sno from STAFF where sname='李有才');
-
-
select sname,pname
-
from STAFF join SP on staff.sno=sp.sno join proj on sp.pno=proj.pno;
-
-
--(6) 创建一个名为‘检索信息’的存储过程,该存储过程完成检索指定员工号所参与的项目总数,其中员工号为输入参数,项目总数为输出参数
-
create or replace procedure 检索信息 (tsno in number,a out number,b out number)
-
as
-
begin
-
select sno,count(*)
-
into a,b
-
from sp
-
where sno=tsno
-
group by sno;
-
end 检索信息;
-
-
--(7) 调用‘检索信息’存储过程,完成检索1号员工参与的项目总数。
-
variable a number;
-
variable b number;
-
exec 检索信息(1,:a,:b);
-
print a b;
部分截图:
3
(a)

(b)

(c)

(d)

4
(a)

(b)

5
(a)

7
