数据库课程设计报告报告运动会成绩管理系统.docx
《数据库课程设计报告报告运动会成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据库课程设计报告报告运动会成绩管理系统.docx(45页珍藏版)》请在冰豆网上搜索。
数据库课程设计报告报告运动会成绩管理系统
数据库原理与应用课程设计
说明书
题目:
运动会成绩管理系统
学院:
班级:
完成人:
组号:
:
XXX学号:
XXXX成绩:
:
XXX学号:
XXXX成绩:
指导教师:
山东科技大学
2014年6月27日
课程设计任务书
一、课程设计题目:
运动会成绩管理系统
二、课程设计应解决的主要问题:
〔按实现的系统功能〕
〔1〕运动工程、运发动、运动成绩以及班级名次的记录存储
〔2〕添加修改和删除工程表、运发动表和成绩表信息
〔3〕自动生成班级名次表〔触发器〕
〔4〕运发动表有改动时,自动更新班级名次表〔触发器〕
〔5〕成绩表有改动时自动对成绩表中记录按工程排名次〔触发器〕
〔6〕成绩表自动排名自动更新班级名次表中班级总分〔存储过程〕
〔7〕更新班级总分之后自动对班级排名(学院名次,学校名次)(存储过程)
〔8〕对成绩表进展初次排名功能
〔9〕通过工程号获得相应工程的排名表〔表值函数〕
〔10〕通过学号或或运动号获得某学生运动成绩表〔表值函数〕
〔11〕通过班级名称获得某班所有运发动运动成绩表〔表值函数〕
〔12〕通过学院名称获得学院所有运发动运动成绩表〔表值函数〕
〔13〕获得全校所有运发动的运动成绩表〔表值函数〕
〔14〕获得全校所有班级总分数以及在学院排名和早全校排名〔表值函数〕
三、任务发出日期:
2014-4-25课程设计完成日期:
2014-6-27
小组分工说明
小组编号题目:
运动会成绩管理系统
小组分工情况:
XXX:
参与数据库的讨论和设计;搜集整理数据、录入数据;设计了具体的逻辑构造,绘制E-R图;创立数据库以及工程表、运发动表、成绩表和班级名次表;实现了表之间的关联,创立必要的默认值、规那么;创立了相应的索引;创立了班级名次表的视图。
XXX:
参与数据库的讨论和设计;创立某工程名次表值函数;创立触发器实现成绩表的按工程自动排名功能;创立存储过程实现班级名次表的班级总成绩的更新功能;创立存储过程实现班级名次表的排名功能;创立触发器实现运发动表改动时自动更新班级名次表的功能;创立多个表值函数用于实现不同的查询功能:
工程查询函数,个人成绩查询函数,班级成绩查询函数,学院成绩查询函数,全校成绩查询函数,全校班级名次查询函数。
整个数据库局部的设计共创立了三个触发器,四个存储过程以及七个表值函数。
另外还设计了本运动会成绩管理系统的界面局部,以及文档编辑工作。
组长签字:
年月日
指导教师对课程设计的评价
成绩:
指导教师签字:
年月日
1需求分析
本系统是用于管理运动会成绩的系统,要实现的功能就是运动会成绩的增加,修改和删除,同时还应该具有运发动和运动工程的增加修改和删除功能。
(1)本系统面向用户有两种:
成绩管理员、学生运发动。
(2)管理员功能介绍
管理员正确登陆后,可以增加、删除、修改、查询运发动信息,比赛工程以及比赛成绩。
(3)学生运发动主要功能介绍
学生登录后,可以查询〔比赛成绩、运动发动信息、运动工程〕。
1.1数据事实
数据实例
1.2主要用户视图
用户
需求
成绩管理员
登录〔正确输入用户名及密码登录〕
增加、删除、修改、查询运发动信息,比赛工程以及比赛成绩
学生
登录〔默认用户名〕
查询〔比赛成绩、运动发动信息、运动工程〕
2概念构造设计
图2.1系统边界
2.1局部ER图
图1工程表图2学生表
图3成绩表图4班级名次表
2.2全局ER图
3逻辑构造设计
关系模式如下:
运发动〔学号、、性别、学院、班级、运动号、工程一、工程二〕
运动工程〔工程号、工程名称〕
成绩〔学号、工程号、成绩、名次〕
班级排名〔学院、班级、总成绩、在学院名次、在校名次〕
4物理构造设计
学生表
列名
数据类型
允许空
说明
SNO
Int
否
学生编号
SName
Varchar(50)
否
SDept
Varchar(50)
是
系别
SClassNO
Varchar(50)
是
班级
SportsNO
Int
否
运动编号
工程表
列名
数据类型
允许空
说明
SportsNO
Int
否
工程编号
SportsName
Varchar(50)
否
工程名称
工程成绩表
列名
数据类型
允许空
说明
SNO
Int
否
学生编号
SportsNO
Int
否
工程编号
Score
Varchar〔50〕
否
成绩
Srank
int
否
名次
班级名次表
列名
数据类型
允许空
说明
sdeptname
Varchar〔20〕
是
学院
sclassname
Varchar〔20〕
否
班级
sclscore
int
是
总分
sclrankindept
int
是
学院名次
sclrankinsch
int
是
学校名次
5主要功能详细设计
5.1创立数据库
CREATEDATABASEsports
ON(
NAME=运动会数据,
FILENAME='D:
\SQL\sports.MDF',
SIZE=10MB,
MAXSIZE=100MB
)
LOGON(
NAME=运动会数据日志,
FILENAME='D:
\SQL\sports_Log.LDF',
SIZE=5MB,
MAXSIZE=25MB
)
5.2创立数据表
1、创立工程表
usesports
createtablesp
(sportnointNOTNULLPRIMARYKEY,
sportnamevarchar(30)notnull
)
2、创立学生表
createtablestu
(snointNOTNULLPRIMARYKEY,
snamevarchar(10)notnull,
sdeptvarchar(20),
sclassnamevarchar(20),
ssexvarchar
(2),
spnointnotnullunique,
sportno1intforeignkeyreferencessp(sportno)notnull,
sportno2intforeignkeyreferencessp(sportno)
)
3、创立成绩表
------------全体运发动的各个工程的成绩表
createtablesc
(snointFOREIGNKEYreferencesstu(sno),
sportnointFOREIGNKEYreferencessp(sportno),
scorevarchar(10),
srankint
primarykey(sno,sportno)
)
4、创立名次表
-------------记录全校所有班级的得分以及在学院的名次和在全校的名次
createtableclscore
(sdeptnamevarchar(20),--学院名
sclassnamevarchar(20)primarykey,--班级名称
sclscoreint,--班级成绩
sclrankindeptint,--班级在学院中的名次
sclrankinschint--班级在学校中的名次
)
5.3添加数据〔仅以一条为例〕
1、添加运动工程表记录
usesports
insertintospvalues(1,'男子一百'),(2,'男子二百')
2、添加学生表记录
usesports
insertintostuvalues(10103,'浩','数学','数学一班','男',10001,1,3),
(10105,'钱浩','数学','数学一班','男',10002,2,4)
3、添加比赛成绩表记录
usesports
insertintosc(sno,sportno,score)values
(10103,1,'12.2')
5.4数据库完整性
1、绑定列上默认值
usesports
go
createdefaultssexas'男'
go
execsp_bindefault'ssex','stu.ssex'
go
2、绑定规那么
createrulerule_sportnoasc1between1and12
go
createrulerule_snoasc1between10101and40340
go
execsp_bindrule'rule_sportno','sp.sportno'
go
execsp_bindrule'rule_sno','stu.sno'
go
5.5成绩表按成绩自动排名〔触发器,函数,存储过程〕
功能简介:
当sc表有成绩插入删除或者修改时就触发,实现对sc表中单工程名次nrank属性的及时更新,更新完之后,调用存储过程,实现对clscore表中班级成绩和班级排名的更新。
5.5.1更新工程名次触发器
--触发器----及时更新sc表
--当有成绩插入删除或者修改sc表时就触发
--实现对sc表中单工程名次nrank属性的及时更新
usesports
go----------------------------插入更新与删除操作sc表
ifexists(select*fromsysobjectswherename='trSC'andtype='TR')
droptriggertrSC
go
createtriggertrSC
onscafterinsert,update,delete
as
declaresportno0int,sno0int,sportno1int,sportno2int
selectsno0=sno,sportno0=sportnofrominserted
selectsportno1=sportno1,sportno2=sportno2fromstuwheresno=sno0
ifsportno0notin(sportno1,sportno2)
--ifsportno0!
=sportno1andsportno0!
=sportno2
begin
print'操作有误,此记录与运发动表不一致,请先修改运发动表!
'
rollback
end
else
begin
--更新名次
--声明变量
declaresnoint,sportnoint,rankint
declareiu_scSportno_cursorCURSORfor
selectsportnofromsp
openiu_scSportno_cursor
fetchnextfromiu_scSportno_cursorintosportno
whilefetch_status=0
begin
setrank=1
--声明游标
declareiu_sc_cursorCURSORfor
selectsnofromscRankFun(sportno)
--翻开游标
openiu_sc_cursor
--提取第一行
fetchnextfromiu_sc_cursorintosno
whileFETCH_STATUS=0
begin
updatesc
setsrank=rank
wheresno=snoandsportno=sportno
setrank=rank+1
fetchnextfromiu_sc_cursorintosno
end
closeiu_sc_cursor
deallocateiu_sc_cursor
fetchnextfromiu_scSportno_cursorintosportno
end
closeiu_scSportno_cursor
deallocateiu_scSportno_cursor
end
-----------执行存储过程updateClscore,更新clscore表-----------
execupdateClscore
go
Go
测试代码及截图如下:
5.5.2计算班级总成绩存储过程
存储过程:
当sc表名次有变动时,及时更新clscore表中的班级总成绩
---------------当sc表有更新时,及时更新clscore表中每个班的总分数----------
usesports
go
ifexists(select*fromsysobjectswherename='updateClscore'andtype='P')
dropprocedureupdateClscore
go
createprocedureupdateClscoreas
begin
declareclassnamevarchar(20),srankint,srankTotalint
declarecursor_classcursorfor
selectsclassnamefromstugroupbysclassname
opencursor_class
fetchnextfromcursor_classintoclassname
whileFETCH_STATUS=0
begin
setsrankTotal=0
declarecursor_srankcursorfor
selectsrankfromscwheresnoin(selectsnofromstuwheresclassname=classname)
opencursor_srank
fetchnextfromcursor_srankintosrank
whileFETCH_STATUS=0
begin
ifsrank<8
setsrankTotal=srankTotal+(8-srank)
else
setsrankTotal=srankTotal+0
fetchnextfromcursor_srankintosrank
end
updateclscore
setsclscore=srankTotalwheresclassname=classname
closecursor_srank
deallocatecursor_srank
fetchnextfromcursor_classintoclassname
end
closecursor_class
deallocatecursor_class
------------执行存储过程,更新clscore表,进展班级排名---------------
execupdateClscore_rank
end
Go
测试代码及截图如下:
5.5.3班级排名存储过程
存储过程:
更新clscore表,对clscore表中的班级总成绩分别按学院和学校排名次
--------------存储过程,更新clscore表,进展班级排名---------------
usesports
ifexists(select*fromsysobjectswherename='updateClscore_rank'andtype='p')
dropprocupdateClscore_rank
go
createprocupdateClscore_rank
as
begin
declaredeptvarchar(20),classvarchar(20),rankint
------------在学院排名次-------------
declarecursor_deptcursorfor
selectsdeptnamefromclscoregroupbysdeptname
opencursor_dept
fetchnextfromcursor_deptintodept
whileFETCH_STATUS=0
begin
setrank=1
declarecursor_classcursorfor
selectsclassnamefromclscorewheresdeptname=deptorderbysclscoredesc
opencursor_class
fetchnextfromcursor_classintoclass
whileFETCH_STATUS=0
begin
updateclscore
setsclrankindept=rankwheresclassname=class
setrank=rank+1
fetchnextfromcursor_classintoclass
end
closecursor_class
deallocatecursor_class
fetchnextfromcursor_deptintodept
end
closecursor_dept
deallocatecursor_dept
------------在学校排名次-------------
declarecursor_classcursorfor
selectsclassnamefromclscoreorderbysclscore
opencursor_class
fetchnextfromcursor_classintoclass
setrank=1
whileFETCH_STATUS=0
begin
updateclscore
setsclrankinsch=rankwheresclassname=class
setrank=rank+1
fetchnextfromcursor_classintoclass
end
closecursor_class
deallocatecursor_class
end
Go
5.5.4工程排名表值函数
------------------------------某工程排名函数表值函数
--输入:
某个工程的编号
--输出:
此工程的排序后的运发动学号顺序表
usesports
go
ifexists(select*fromsysobjectswherename='scRankFun'andtype='TF')
dropfunctionscRankFun
go
createfunctionscRankFun(sportnoint)
returnssttable
(
snoint,
sportnoint
)
as
begin
ifsportnoin(3,4,8,10)
begin
insertst
selectsno,sportno
fromsc
wheresportno=sportno
orderbyscoredesc
end
else
begin
insertst
selectsno,sportno
fromsc
wheresportno=sportno
orderbyscore
end
return
end
Go
5.6更新clscore表〔触发器〕
触发条件:
当运发动表stu有变动时,触发
功能:
根据运发动表stu中的信息,更新clscore表中的学院名和班级名
usesports
go
ifexists(select*fromsysobjectswherename='trClscoreSTU'andtype='TR')
droptriggertrClscoreSTU
go---------------------当stu表有变动时,及时更新
createtriggertrClscoreSTU
onstuafterinsert,update,delete
as
begin
declaresdeptnamevarchar(20),sclassnamevarchar(20)
declarestuSclassname_cursorcursorfor
selectsdept,sclassnamefromstu
openstuSclassname_cursor
fetchnextfromstuSclassname_cursorintosdeptname,sclassname
whilefetch_status=0
begin
ifnotexists(select*fromclscorewheresclassname=sclassname)
insertintoclscore(sdeptname,sclassname)values(sdeptname,sclassname)
fetchnextfromstuSclassname_cursorintosdeptname,sclassname
end
closestuSclassname_cursor
deallocatestuSclassname_cursor
end
go
go
5.7成绩表按照工程初始名次
usesports
--声明变量
go
declaresnoint,sportnoint,countspint
setsportno=1
selectcountsp=COUNT(*)fromsp
whilesportno<=countsp--所有工程均要排名
begin
declarerankint
setrank=1
--声明游标
declaresc_cursorCURSORfor
selectsnofromscRankFun(sportno)
--翻开游标
opensc_cursor
--提取第一行
fetchnextfromsc_cursorintosno
whileFETCH_STATUS=0
begin
usesports
updatesc
setsrank=rank
wheresno=sno
setrank=rank+1
fetchnextfromsc_cursorintosno
end
closesc_cursor
deallocatesc_cursor
setsportno=sportno+1
end
Go
5.8查询某个工程的全部成绩和排名〔表值函数〕
输入:
工程号
输出:
此工程的所有运发动的学号,,成绩,名次,班级,学院
----------------表值函数实现下面的查询功能------------------
--查询某个工程的全部成绩和排名
usesports
ifexists(select*fromsysobjectswherename='spFun'andtype='TF')
dropfunctionspFun
go
createfunctionspFun(sportnoint)
returnssttable
(学号int,varchar(20),成绩varchar(20),名次int,班级varchar(20),学院varchar(20))
as
begin
insertintost
selectstu.sno,stu.sname,s