数据库实验报告
组长:
组员:
班级:
指导教师:
主要任务:
1. 分析题意,画出E-R图,将E-R图转换为关系模式并进行模式优化。
2. SQL Server 2008环境下编写SQL代码,创建视图、触发器、存储过程和游标。
组员:
主要任务:
1. 根据优化后的关系模式创建基本表,并填充数据。
2. 参与优化模式讨论。
3. 撰写实验报告。
一.题目:设计学生管理系统
需求语义:
今要建立关于系、学生、班级、学会等诸信息的一个关系数据库。一个系有若干专业,每个专业每年只招一个班,每个班有若干学生。一个系的学生住在同一宿舍区。每个学生可参加若干学会,每个学会有若干学生。学生参加某学会有一个入会年份。描述各个实体的属性(加下划线者为主码)如下:
学生:学号、姓名、年龄、系名、班号、宿舍区。
班级:班号、专业名、入校年份、系名、人数。
系:系号、系名、系办公室地点、人数。
学会:学会号、学会名、成立年份、地点。
要完成的任务:
1. 画出E-R图。
2. 把E-R图转为关系模式,并优化。
3. 根据关系模式创建数据库。表名和属性名用英文,属性的数据类型根据上面的描述自己定义。
4. 创建一个视图,能显示每个学会的学会名,学生数(实际不存在,也不能增加)。
5. 创建一个触发器,能根据每个班的学生变动情况自动增减班级表和系表的人数字段的值。
6. 创建一个存储过程,实现如下功能:给定一个班的旧班号和新班号,把所有相关表中此班的旧班号改为新班号,并返回此班的人数(使用输出参数)。
7. 编写一段脚本,使用游标完成如下功能:确定系表中人数字段的值与实际学生数是否相符。如果不相符,把人数字段的值改为实际数,并在窗口打印此系的系号、系名、原人数、实际人数。
二.概念结构设计
原始E-R图:
消除冲突和冗余后的E-R图
三.逻辑结构设计
stuunion(uno,uname,uyear,uplace)
student(sno,sname,sage,clno)
sjoin(uno,sno,joinyear)
class(clno,clyear,cltotal)
major(mjname,clno,dnl)
dept(dno,dname,dwkplace,dtotal)
dormitory(dno,dorplace)
经检验,以上7个关系模式均满足第三范式要求
四.应用程序中遇到的问题及解决方法
根据设计好的关系模式,即可在SQL Sever 2008环境下编程。前面创建表、视图、触发器的过程都比较简单,创建存储过程的时候遇到了一点问题,班号更改以后无法把相关表中的班号也修改了,最后发现原因是student和major两个从表无法级联更新,于是又给这两个表增添了随着class表级联更新的属性,问题迎刃而解。最后创建游标的过程有点复杂,不过整体还是比较顺利的。
五.总结
这次上机实验收获还是挺多的,上课的时候学到了理论,当真正把理论运用到实践中的时候发现其实没那么容易。虽然只是设计了一个学生管理系统,这个系统规模不大,数据也不多,但是当真正设计这个数据库的时候过程是比较曲折的。我觉得重点就是根据需求设计E-R图,设计出E-R图后还要消除冲突和冗余,然后将E-R图转换为关系模式,还要对关系模式规范化,达到一个非常好的效果。此次上机实验也锻炼了同学之间的合作能力,我积极和同学探讨问题,也向老师请教问题,学到了好多课本上没有学到的知识。
附录:
代码:
--student 表
create table student
(
sno varchar(8) primary key,
sname varchar(20) not null unique,
sage int,
clno char(6) references class(clno)
);
--class表
create table class
(
clno char(6) primary key,
clyear int,
cltotal int
)
--major表
create table major
(
mjname varchar(20) primary key,
clno char(6) references class (clno),
dno char(2) references dept(dno)
)
--dept表
create table dept
(
dno char(2) primary key,
dname varchar(20) not null unique,
dworkplace varchar(20),
dtotal int
)
--dormitory表
create table dormitory
(
dorplace varchar(20),
dno char(2) references dept(dno)
)
--stuunion表
create table stuunion
(
uno char(6) primary key,
uname varchar(20) not null unique,
uyear int,
uplace varchar(20)
)
--sjoin表
create table sjoin
(
uno char(6) references stuunion(uno),
sno varchar(8) references student(sno),
joinyear int,
primary key(uno,sno)
)
--创建视图
create view uname_utotal(uname,utotal)
as
select uname,count(*)
from stuunion,sjoin
where stuunion.uno=sjoin.uno
group by stuunion.uname
with check option;
--创建触发器
create trigger insert_cltotal_dtotal on student
for insert
as
declare @a char(6);
declare @c char(2);
set @a=(
select class.clno
from class,inserted
where class.clno=inserted.clno
);
update class
set cltotal=cltotal+1
where clno=@a;
set @c=(
select dept.dno
from major,dept,inserted
where major.dno=dept.dno and major.clno=inserted.clno
);
update dept
set dtotal=dtotal+1
where dno=@c;
create trigger delete_cltotal_dtotal on student
for delete
as
declare @a char(6)
declare @c char(2)
set @a=(
select class.clno;
from class,deleted;
where class.clno=deleted.clno
);
update class
set cltotal=cltotal-1
where clno=@a;
set @c=(
select dept.dno
from major,dept,deleted
where major.dno=dept.dno and major.clno=deleted.clno
);
update dept
set dtotal=dtotal-1
where dno=@c;
--创建存储过程
create procedure pro_modifycno
@oldcno char(6), @newcno char(6), @classtotal int output
as
update class
set clno=@newcno
where clno=@oldcno;
update student
set clno=@newcno
where clno=@oldcno;
update major
set clno=@newcno
where clno=@oldcno;
set @classtotal=
(
select cltotal
from class
where clno=@newcno
)
declare @x int
exec pro_modifycno @oldcno='011221',@newcno='051221',@classtotal=@x output
print @x
alter table student add constraint c1 foreign key(clno) references class(clno) on update cascade
alter table major add constraint c2 foreign key(clno) references class(clno) on update cascade
--建立游标
declare @Dep varchar(10);
declare @Class varchar(10);
drop table Change
create table Change
(
dno char(10) primary key,
dtotal int
);
insert into Change(dno,dtotal)
select dept.dno,dept.dtotal
from dept
declare StuNumCheck cursor for
select dno,clno
from major
open StuNumCheck
update dept
set dtotal = 0
fetch next from StuNumCheck into @Dep,@Class
while @@FETCH_STATUS = 0
begin
update dept
set dtotal =dtotal + ( select COUNT(*)
from student
where clno = @Class
)
where dept.dno = @Dep;
fetch next from StuNumCheck into @Dep,@Class
end
select dept.dno,dept.dname,Change.dtotal,dept.dtotal
from Change,dept
where Change.dno = dept.dno
close StuNumCheck
deallocate StuNumCheck
第二篇:数据库实验报告(3)
数据库系统及应用
实验报告
实验名称:数据更新
实验地点:11教407
专业班级:
学生姓名:
学生学号:
指导教师:
成 绩:
20##年 11月 5日