数据库实验报告.docx

上传人:b****5 文档编号:7523027 上传时间:2023-01-24 格式:DOCX 页数:11 大小:65.05KB
下载 相关 举报
数据库实验报告.docx_第1页
第1页 / 共11页
数据库实验报告.docx_第2页
第2页 / 共11页
数据库实验报告.docx_第3页
第3页 / 共11页
数据库实验报告.docx_第4页
第4页 / 共11页
数据库实验报告.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

数据库实验报告.docx

《数据库实验报告.docx》由会员分享,可在线阅读,更多相关《数据库实验报告.docx(11页珍藏版)》请在冰豆网上搜索。

数据库实验报告.docx

数据库实验报告

数据库实验报告

 

组长:

______

组员:

_____

班级:

________

指导教师:

_____________

 

组长:

主要任务:

1.分析题意,画出E-R图,将E-R图转换为关系模式并进行模式优化。

2.SQLServer2008环境下编写SQL代码,创建视图、触发器、存储过程和游标。

组员:

主要任务:

1.根据优化后的关系模式创建基本表,并填充数据。

2.参与优化模式讨论。

3.撰写实验报告。

一.题目:

设计学生管理系统

需求语义:

今要建立关于系、学生、班级、学会等诸信息的一个关系数据库。

一个系有若干专业,每个专业每年只招一个班,每个班有若干学生。

一个系的学生住在同一宿舍区。

每个学生可参加若干学会,每个学会有若干学生。

学生参加某学会有一个入会年份。

描述各个实体的属性(加下划线者为主码)如下:

学生:

学号、姓名、年龄、系名、班号、宿舍区。

班级:

班号、专业名、入校年份、系名、人数。

系:

系号、系名、系办公室地点、人数。

学会:

学会号、学会名、成立年份、地点。

要完成的任务:

1.画出E-R图。

2.把E-R图转为关系模式,并优化。

3.根据关系模式创建数据库。

表名和属性名用英文,属性的数据类型根据上面的描述自己定义。

4.创建一个视图,能显示每个学会的学会名,学生数(实际不存在,也不能增加)。

5.创建一个触发器,能根据每个班的学生变动情况自动增减班级表和系表的人数字段的值。

6.创建一个存储过程,实现如下功能:

给定一个班的旧班号和新班号,把所有相关表中此班的旧班号改为新班号,并返回此班的人数(使用输出参数)。

7.编写一段脚本,使用游标完成如下功能:

确定系表中人数字段的值与实际学生数是否相符。

如果不相符,把人数字段的值改为实际数,并在窗口打印此系的系号、系名、原人数、实际人数。

二.概念结构设计

原始E-R图:

uyear

uname

uplace

uno

belong

sdname

sdor

sclno

sno

sname

sage

live

dept

major

class

student

stuunion

joinyear

sjoin

m

n

 

p

cltotal

q

clyear

1

clmjname

belong

open

clno

1

mname

cldname

1

1

dno

establish

n

dname

dorplace

1

dwkplace

dormitory

11

dtotal

 

消除冲突和冗余后的E-R图

 

uyear

uplace

uname

uno

stuunion

joinyear

sjoin

m

dorplace

dormitory

dtotal

dname

dwkplace

dno

establish

mjname

clyeaar

cltotal

clno

open

blong

sno

sname

sage

live

dept

major

student

n

p

1

class

1

1

n

1

1

1

三.逻辑结构设计

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个关系模式均满足第三范式要求

四.应用程序中遇到的问题及解决方法

根据设计好的关系模式,即可在SQLSever2008环境下编程。

前面创建表、视图、触发器的过程都比较简单,创建存储过程的时候遇到了一点问题,班号更改以后无法把相关表中的班号也修改了,最后发现原因是student和major两个从表无法级联更新,于是又给这两个表增添了随着class表级联更新的属性,问题迎刃而解。

最后创建游标的过程有点复杂,不过整体还是比较顺利的。

五.总结

这次上机实验收获还是挺多的,上课的时候学到了理论,当真正把理论运用到实践中的时候发现其实没那么容易。

虽然只是设计了一个学生管理系统,这个系统规模不大,数据也不多,但是当真正设计这个数据库的时候过程是比较曲折的。

我觉得重点就是根据需求设计E-R图,设计出E-R图后还要消除冲突和冗余,然后将E-R图转换为关系模式,还要对关系模式规范化,达到一个非常好的效果。

此次上机实验也锻炼了同学之间的合作能力,我积极和同学探讨问题,也向老师请教问题,学到了好多课本上没有学到的知识。

附录:

代码:

--student表

createtablestudent

snovarchar(8)primarykey,

snamevarchar(20)notnullunique,

sageint,

clnochar(6)referencesclass(clno)

);

--class表

createtableclass

clnochar(6)primarykey,

clyearint,

cltotalint

--major表

createtablemajor

mjnamevarchar(20)primarykey,

clnochar(6)referencesclass(clno),

dnochar

(2)referencesdept(dno)

--dept表

createtabledept

dnochar

(2)primarykey,

dnamevarchar(20)notnullunique,

dworkplacevarchar(20),

dtotalint

--dormitory表

createtabledormitory

dorplacevarchar(20),

dnochar

(2)referencesdept(dno)

--stuunion表

createtablestuunion

unochar(6)primarykey,

unamevarchar(20)notnullunique,

uyearint,

uplacevarchar(20)

--sjoin表

createtablesjoin

unochar(6)referencesstuunion(uno),

snovarchar(8)referencesstudent(sno),

joinyearint,

primarykey(uno,sno)

--创建视图

createviewuname_utotal(uname,utotal)

as

selectuname,count(*)

fromstuunion,sjoin

wherestuunion.uno=sjoin.uno

groupbystuunion.uname

withcheckoption;

--创建触发器

createtriggerinsert_cltotal_dtotalonstudent

forinsert

as

declare@achar(6);

declare@cchar

(2);

set@a=(

selectclass.clno

fromclass,inserted

whereclass.clno=inserted.clno

);

updateclass

setcltotal=cltotal+1

whereclno=@a;

set@c=(

selectdept.dno

frommajor,dept,inserted

wheremajor.dno=dept.dnoandmajor.clno=inserted.clno

);

updatedept

setdtotal=dtotal+1

wheredno=@c;

 

createtriggerdelete_cltotal_dtotalonstudent

fordelete

as

declare@achar(6)

declare@cchar

(2)

set@a=(

selectclass.clno;

fromclass,deleted;

whereclass.clno=deleted.clno

);

updateclass

setcltotal=cltotal-1

whereclno=@a;

set@c=(

selectdept.dno

frommajor,dept,deleted

wheremajor.dno=dept.dnoandmajor.clno=deleted.clno

);

updatedept

setdtotal=dtotal-1

wheredno=@c;

 

--创建存储过程

createprocedurepro_modifycno

@oldcnochar(6),@newcnochar(6),@classtotalintoutput

as

updateclass

setclno=@newcno

whereclno=@oldcno;

updatestudent

setclno=@newcno

whereclno=@oldcno;

updatemajor

setclno=@newcno

whereclno=@oldcno;

set@classtotal=

selectcltotal

fromclass

whereclno=@newcno

 

declare@xint

execpro_modifycno@oldcno='011221',@newcno='051221',@classtotal=@xoutput

print@x

altertablestudentaddconstraintc1foreignkey(clno)referencesclass(clno)onupdatecascade

altertablemajoraddconstraintc2foreignkey(clno)referencesclass(clno)onupdatecascade

 

--建立游标

declare@Depvarchar(10);

declare@Classvarchar(10);

droptableChange

createtableChange

dnochar(10)primarykey,

dtotalint

);

insertintoChange(dno,dtotal)

selectdept.dno,dept.dtotal

fromdept

declareStuNumCheckcursorfor

selectdno,clno

frommajor

openStuNumCheck

updatedept

setdtotal=0

fetchnextfromStuNumCheckinto@Dep,@Class

while@@FETCH_STATUS=0

begin

updatedept

setdtotal=dtotal+(selectCOUNT(*)

fromstudent

whereclno=@Class

wheredept.dno=@Dep;

fetchnextfromStuNumCheckinto@Dep,@Class

end

selectdept.dno,dept.dname,Change.dtotal,dept.dtotal

fromChange,dept

whereChange.dno=dept.dno

closeStuNumCheck

deallocateStuNumCheck

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1