数据库课程设计运动会成绩管理系统.docx
《数据库课程设计运动会成绩管理系统.docx》由会员分享,可在线阅读,更多相关《数据库课程设计运动会成绩管理系统.docx(40页珍藏版)》请在冰豆网上搜索。
数据库课程设计运动会成绩管理系统
数据库原理与应用课程设计
说明书
题目:
运动会成绩管理系统
学院:
班级:
完成人:
组号:
姓名:
XXX学号:
XXXX成绩:
姓名:
XXX学号:
XXXX成绩:
指导教师:
山东科技大学
2014年6月27日
课程设计任务书
一、课程设计题目:
运动会成绩管理系统
二、课程设计应解决的主要问题:
(按实现的系统功能)
(1)运动项目、运动员、运动成绩以及班级名次的记录存储
(2)添加修改和删除项目表、运动员表和成绩表信息
(3)自动生成班级名次表(触发器)
(4)运动员表有改动时,自动更新班级名次表(触发器)
(5)成绩表有改动时自动对成绩表中记录按项目排名次(触发器)
(6)成绩表自动排名自动更新班级名次表中班级总分(存储过程)
(7)更新班级总分之后自动对班级排名(学院名次,学校名次)(存储过程)
(8)对成绩表进行初次排名功能
(9)通过项目号获得相应项目的排名表(表值函数)
(10)通过学号或姓名或运动号获得某学生运动成绩表(表值函数)
(11)通过班级名称获得某班所有运动员运动成绩表(表值函数)
(12)通过学院名称获得学院所有运动员运动成绩表(表值函数)
(13)获得全校所有运动员的运动成绩表(表值函数)
(14)获得全校所有班级总分数以及在学院排名和早全校排名(表值函数)
3、任务发出日期:
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班级名次表
m
n
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_sportnoas@c1between1and12
go
createrulerule_snoas@c1between10101and40340
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
declare@sportno0int,@sno0int,@sportno1int,@sportno2int
select@sno0=sno,@sportno0=sportnofrominserted
select@sportno1=sportno1,@sportno2=sportno2fromstuwheresno=@sno0
if@sportno0notin(@sportno1,@sportno2)
--if@sportno0!
=@sportno1and@sportno0!
=@sportno2
begin
print'操作有误,此记录与运动员表不一致,请先修改运动员表!
'
rollback
end
else
begin
--更新名次
--声明变量
declare@snoint,@sportnoint,@rankint
declareiu_scSportno_cursorCURSORfor
selectsportnofromsp
openiu_scSportno_cursor
fetchnextfromiu_scSportno_cursorinto@sportno
while@@fetch_status=0
begin
set@rank=1
--声明游标
declareiu_sc_cursorCURSORfor
selectsnofromscRankFun(@sportno)
--打开游标
openiu_sc_cursor
--提取第一行
fetchnextfromiu_sc_cursorinto@sno
while@@FETCH_STATUS=0
begin
updatesc
setsrank=@rank
wheresno=@snoandsportno=@sportno
set@rank=@rank+1
fetchnextfromiu_sc_cursorinto@sno
end
closeiu_sc_cursor
deallocateiu_sc_cursor
fetchnextfromiu_scSportno_cursorinto@sportno
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
declare@classnamevarchar(20),@srankint,@srankTotalint
declarecursor_classcursorfor
selectsclassnamefromstugroupbysclassname
opencursor_class
fetchnextfromcursor_classinto@classname
while@@FETCH_STATUS=0
begin
set@srankTotal=0
declarecursor_srankcursorfor
selectsrankfromscwheresnoin(selectsnofromstuwheresclassname=@classname)
opencursor_srank
fetchnextfromcursor_srankinto@srank
while@@FETCH_STATUS=0
begin
if@srank<8
set@srankTotal=@srankTotal+(8-@srank)
else
set@srankTotal=@srankTotal+0
fetchnextfromcursor_srankinto@srank
end
updateclscore
setsclscore=@srankTotalwheresclassname=@classname
closecursor_srank
deallocatecursor_srank
fetchnextfromcursor_classinto@classname
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
declare@deptvarchar(20),@classvarchar(20),@rankint
------------在学院排名次-------------
declarecursor_deptcursorfor
selectsdeptnamefromclscoregroupbysdeptname
opencursor_dept
fetchnextfromcursor_deptinto@dept
while@@FETCH_STATUS=0
begin
set@rank=1
declarecursor_classcursorfor
selectsclassnamefromclscorewheresdeptname=@deptorderbysclscoredesc
opencursor_class
fetchnextfromcursor_classinto@class
while@@FETCH_STATUS=0
begin
updateclscore
setsclrankindept=@rankwheresclassname=@class
set@rank=@rank+1
fetchnextfromcursor_classinto@class
end
closecursor_class
deallocatecursor_class
fetchnextfromcursor_deptinto@dept
end
closecursor_dept
deallocatecursor_dept
------------在学校排名次-------------
declarecursor_classcursorfor
selectsclassnamefromclscoreorderbysclscore
opencursor_class
fetchnextfromcursor_classinto@class
set@rank=1
while@@FETCH_STATUS=0
begin
updateclscore
setsclrankinsch=@rankwheresclassname=@class
set@rank=@rank+1
fetchnextfromcursor_classinto@class
end
closecursor_class
deallocatecursor_class
end
Go
5.5.4项目排名表值函数
------------------------------某项目排名函数表值函数
--输入:
某个项目的编号
--输出:
此项目的排序后的运动员学号顺序表
usesports
go
ifexists(select*fromsysobjectswherename='scRankFun'andtype='TF')
dropfunctionscRankFun
go
createfunctionscRankFun(@sportnoint)
returns@sttable
(
snoint,
sportnoint
)
as
begin
if@sportnoin(3,4,8,10)
begin
insert@st
selectsno,sportno
fromsc
wheresportno=@sportno
orderbyscoredesc
end
else
begin
insert@st
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
declare@sdeptnamevarchar(20),@sclassnamevarchar(20)
declarestuSclassname_cursorcursorfor
sel