学生成绩数据库设计 三 模拟数据

1 基础数据

 1 /*一 模拟数据说明:从2000年到当年,每年添加100个学生*/
 2 Declare @StuCount int, /*每年添加的数量*/
 3         @StartYear int,/*初始年份*/
 4         @CurYear int    /*当前年份*/
 5 Begin
 6     /*设置添加数据的初始值*/
 7     SET @StuCount=100
 8     SET @StartYear=2010
 9     SET @CurYear=YEAR(GETDATE())
10
11     /*1 向学年表添加数据*/
12     Declare @XnKaishi INT /*开始年份*/
13     SET @XnKaishi=@StartYear
14     WHILE(@XnKaishi<=@CurYear)
15         BEGIN
16             IF NOT EXISTS(SELECT 1 FROM SchoolYear WHERE SyStartYear=@XnKaishi AND SyEndYear=@XnKaishi+1)
17                 begin
18                     insert into SchoolYear(SyStartYear,SyEndYear) values(@XnKaishi,@XnKaishi+1)
19                 end
20             SET @XnKaishi=@XnKaishi+1
21         END
22
23
24     /*2 向学生表中添加数据*/
25     Declare @temSc int, /*记录当前的学生ID*/
26             @temXueHao NVARCHAR(12),/*当前学生的编号*/
27             @temXm nvarchar(20),/*学生的姓名*/
28             @temSy int  /*记录当前的年份*/
29     set @temSy=@StartYear
30     /*循环年份*/
31     WHILE(@temSy<=@CurYear)
32         BEGIN
33             /*循环添加该年份的学生*/
34             set @temSc=1
35             while(@temSc<=@StuCount)
36                 begin
37                     set @temXueHao=CONVERT(varchar(4),@temSy)
38                                   +‘-‘
39                                   +CONVERT(varchar(4),@temSc)
40                     if not exists(select 1 from Student where StuNO=@temXueHao)
41                         begin
42                             set @temXm=‘学生‘+CONVERT(varchar(4),@temSc)
43                             INSERT INTO Student(StuNO,StuName,StuJoinYear) VALUES(@temXueHao,@temXm,@temSy)
44                         end
45                     set @temSc=@temSc+1
46                 end
47             SET @temSy=@temSy+1
48         END
49 End
50
51 GO
52
53 /*二 模拟科目*/
54 Declare @KcCount int /*课程数量*/
55 BEGIN
56     SET @KcCount=20
57     DECLARE @i int,
58             @kcMc nvarchar(30)
59     set @i=1
60     while(@i<=@KcCount)
61         begin
62             set @kcMc=‘课程‘+CONVERT(varchar(2),@i)
63             if not exists(select 1 from Course where CourseName=@kcMc)
64                 begin
65                     insert into Course(CourseName) values(@kcMc)
66                 end
67             set @i=@i+1
68         end
69 END
70 GO
71
72 /*三 班级模拟:暂定三个年级,每个年级有三个班级*/
73 Declare @GradeNo int=1,/*年级编号*/
74         @ClassNo int=1,/*班级编号*/
75         @GcName  nvarchar(10)/*年级班级名称*/
76 BEGIN
77     WHILE(@GradeNo<=3)
78         BEGIN
79             SET @ClassNo=1
80             WHILE(@ClassNo<=3)
81                 BEGIN
82                     SET @GcName=CONVERT(varchar(1),@GradeNo)+‘年级‘+CONVERT(varchar(1),@ClassNo)+‘班级‘
83                     if not exists(select 1 from GradeClass where GradeNo=@GradeNo and ClassNo=@ClassNo)
84                         begin
85                             INSERT INTO GradeClass(GradeNo,ClassNo,GcName) values(@GradeNo,@ClassNo,@GcName)
86                         end
87                     SET @ClassNo=@ClassNo+1
88                 END
89             set @GradeNo=@GradeNo+1
90         END
91 END
92 GO

2 注册课程数据

  1 /*2 模拟CourseRegist(课程注册表)的数据*/
  2
  3 --Declare @MixRegCount int=5,/*每学年允许的最小注册课程数*/
  4 --        @MaxRegCount int=12/*每学年运行的最大注册课程数*/
  5 BEGIN
  6     /*1 临时表:#TempReg用于中间的数据*/
  7     if   object_id(‘tempdb..#TempReg‘)   is   not   null
  8           BEGIN
  9             drop   table   #TempReg
 10           END
 11     SELECT * INTO #TempReg FROM CourseRegist where 1=2
 12
 13     INSERT INTO #TempReg(StuNO,SyID,CourseID)
 14     SELECT Student.StuNO,
 15             SchoolYear.SyID,
 16             Course.CourseID
 17     FROM Student
 18     CROSS JOIN SchoolYear
 19     CROSS JOIN Course;
 20
 21     /*2 删除掉非法的数据*/
 22     DELETE  #TempReg from #TempReg T1
 23         WHERE EXISTS
 24         (
 25             SELECT * FROM
 26             (
 27                 /*这些记录都是不合法的记录*/
 28                 SELECT T.CRID, /*成绩表ID*/
 29                 T.StuNO,/*学号*/
 30                 Student.StuJoinYear,/*入学年份*/
 31                 SchoolYear.SyStartYear,/*学年开始年份*/
 32                 SchoolYear.SyEndYear /*学年结束年份*/
 33         FROM #TempReg T
 34         LEFT JOIN Student on Student.StuNO=T.StuNO
 35         LEFT JOIN SchoolYear ON SchoolYear.SyID=T.SyID
 36         where Student.StuJoinYear>SchoolYear.SyStartYear /*入学年份大于学年开始年份*/
 37                 OR SchoolYear.SyStartYear>YEAR(GETDATE())/*该学年还没有到*/
 38                 /*该学年还没有过完。新学年从本年的9月1号到第二年的6月30号*/
 39                 OR(GETDATE() BETWEEN
 40                              CONVERT(datetime,convert(varchar(4),SchoolYear.SyStartYear)+‘-09-01‘)
 41                              AND
 42                              CONVERT(datetime,convert(varchar(4),SchoolYear.SyEndYear)+‘-06-30‘)
 43                    )
 44                 OR SchoolYear.SyStartYear>=Student.StuJoinYear+3/*学生入学年限已到了3年,即已毕业了*/
 45             ) T2
 46             WHERE T2.CRID=T1.CRID
 47         );
 48
 49     /*3 随机删除注册信息:之所以做这一步是因为并非每个学生都注册所有的课程*/
 50     DECLARE @SyID int,
 51             @StuNO NVARCHAR(12),
 52             @topNum int,/*随机取出的课程数量*/
 53             @DeleteSql varchar(2000) /*用于随机删除的语句*/
 54     /*第一个游标CUR_SY:用于取学年ID*/
 55     DECLARE CUR_SY CURSOR FOR SELECT SyID FROM SchoolYear
 56     open CUR_SY
 57     fetch next from CUR_SY into @SyID
 58
 59     while (@@fetch_status=0)
 60         BEGIN
 61             /*第二个游标CUR_STU:用于取学生表编号*/
 62             DECLARE CUR_StuNO CURSOR FOR SELECT StuNO FROM Student
 63             open CUR_StuNO
 64             fetch next from CUR_StuNO into @StuNO
 65
 66             while(@@fetch_status=0)
 67                 begin
 68                     IF EXISTS(SELECT 1 FROM #TempReg WHERE StuNo=@StuNO and Syid=@SyID)
 69                         BEGIN
 70                             /*随机删除注册课程*/
 71                             select @topNum=cast(ceiling(rand() * (SELECT COUNT(1) FROM Course)) as int)
 72                             SET @DeleteSql=N‘DELETE #TempReg ‘
 73                                        +N‘ WHERE StuNo=‘‘‘+@StuNO
 74                                        +‘‘‘ and Syid=‘+convert(varchar(2),@SyID)
 75                                        +‘ AND CourseID not IN (SELECT TOP ‘+convert(varchar(2),@topNum)+‘ CourseID FROM Course ORDER BY NEWID())‘
 76                             exec (@DeleteSql)
 77                         END
 78                     fetch next from CUR_StuNO into @StuNO
 79                 end
 80             close CUR_StuNO
 81             deallocate CUR_StuNO
 82
 83             fetch next from CUR_SY into @SyID
 84         END
 85     close CUR_SY
 86     deallocate CUR_SY
 87
 88     /*4 把处理好的临时表信息放到物理表中*/
 89     Merge into CourseRegist CR
 90         using
 91         (
 92             select StuNO,
 93                     SyID,
 94                     CourseID
 95             from #TempReg
 96         ) T
 97         ON CR.StuNO=T.StuNO
 98             AND CR.SyID=T.SyID
 99             AND CR.CourseID=T.CourseID
100         WHEN NOT MATCHED THEN INSERT (StuNO,SyID,CourseID) VALUES(T.StuNO,T.SyID,T.CourseID);
101 END

3 成绩数据

 1 /*三 模拟成绩*/
 2
 3 /*模拟成绩要注意:
 4 1 成绩都是随机生成的,使用floor(rand()*100)
 5 2 当前假设学生经历3个学年需要毕业,所以只能在3个学年有成绩。
 6   如入学年份2012年,则只能在2012-2013学年,2013-2014学年,2014-2015学年有成绩
 7   但当前2014-2015学年还没有过完,所以2014-2015学年亦没有成绩
 8 3 该表中的学号、课程ID、学年ID来自于CourseRegist表
 9 */
10 Merge into Score USING
11 (
12     SELECT StuNO,
13         SyID,
14         CourseID,
15         CASE
16         /*超过一百分则使用100分减去40范围之内的随机数,保证分数在60至100之间*/
17         WHEN ScoreValue>=100 THEN 100-cast(ceiling(rand(checksum(newid()))*40) as int)
18         ELSE ScoreValue
19         END AS ScoreValue
20     FROM
21     (
22         /*组合最初的数据*/
23         SELECT StuNO,SyID,CourseID,
24                 /*之所以随机数乘以500,是为了避免有过多的不及格的分数*/
25                cast(ceiling(rand(checksum(newid()))*500) as int) AS ScoreValue,
26                /*KeepFlag:保留标记位。*/
27                cast(ceiling(rand(checksum(newid()))*10) as int) AS KeepFlag
28         FROM CourseRegist
29     ) A where KeepFlag>1    /*保留十分之九的数据*/
30 ) B
31 ON Score.StuNO=B.StuNO
32     AND Score.SyID=B.SyID
33     AND Score.CourseID=B.CourseID
34 WHEN NOT MATCHED THEN INSERT (StuNO,SyID,CourseID,ScoreValue) VALUES(B.StuNO,B.SyID,B.CourseID,ScoreValue);

4 学生分班

 1 /*4 给学生分配班级*/
 2
 3 /*比如一个学生是2010年报道的,那么
 4 2010至2011学年是在一年级;
 5 2011至2012学年是在二年级;
 6 2012至2013学年是在三年级;
 7 以后的学年就没有该学生的记录了,因为已经毕业了
 8 每一学年分配的具体班级都是随机分配
 9 */
10
11 MERGE INTO GradeClassStu A USING
12 (
13     /*T2表:就是组合的最终的数据,要插入班级年级对照表*/
14     SELECT T1.SyID,/*学年*/
15             GC.GcID,/*班级年级编号*/
16             T1.StuNO/*学生学号*/
17     FROM
18     (
19         /*T1表:最初的组合数据*/
20         SELECT SY.SyID,S.StuNO,SY.SyStartYear,SY.SyEndYear,
21                 /*根据学生编号分组,根据学年进行排序。序号就是年级*/
22                ROW_NUMBER() over(partition by S.StuNO order by SY.SyID asc) AS GradeNo,
23                /*随机分配班级*/
24                cast(ceiling(rand(checksum(newid()))*3) as int) as ClassNo
25         FROM Student S
26         LEFT JOIN SchoolYear SY ON SY.SyStartYear>=S.StuJoinYear
27                                 AND SY.SyStartYear<S.StuJoinYear+3
28     ) T1
29     LEFT JOIN GradeClass GC ON GC.GradeNo=T1.GradeNo
30                             AND GC.ClassNo=T1.ClassNo
31 ) T2
32 ON A.SyID=T2.SyID
33     AND A.GcID=T2.GcID
34     AND A.StuNO=T2.StuNO
35 WHEN NOT MATCHED THEN INSERT (SyID,GcID,StuNO) VALUES(T2.SyID,T2.GcID,T2.StuNO);
时间: 2025-01-12 05:14:10

学生成绩数据库设计 三 模拟数据的相关文章

学生成绩数据库设计 一 问题由来

最近几天辞职了,在家里面无聊.某一天在百度知道上看到一个问题,比较感兴趣,就研究了一下. 问题来源: http://zhidao.baidu.com/question/1495573046720461139.html?fr=qlquick&entry=qb_browse_word 问题描述: 根据XSCJ数据库,编制存储过程完成部分常用的业务功能.在现有XSCJ数据库中做如下修改.在表XSB中新增一列"状态",表示学生在读情况,"1"表示在读(缺省状态),&

学生成绩数据库设计 二 数据库设计

数据库表关系图 数据库脚本建表脚本 1 /*学生表*/ 2 CREATE TABLE Student 3 ( 4 StuNO NVARCHAR(12) NOT NULL PRIMARY KEY,/*学号*/ 5 StuName nvarchar(20) not null,/*姓名*/ 6 StuState int not null default(1),/*学籍状态.1:在读:2:试读:3:退学:*/ 7 StuJoinYear int /*入学年份*/ 8 ) 9 /*学年表*/ 10 CRE

学生成绩数据库设计 五 执行存储过程

问题1: EXEC SelectScores '2010-10' 问题2: EXEC SelectCjPaiming '2011-10','课程3' 问题3: 1 DECLARE @strOutPut nvarchar(200) 2 BEGIN 3 EXEC UpdateStuState 2012,2013,@strOutPut OUTPUT 4 IF(@strOutPut IS NOT NULL) 5 begin 6 print @strOutPut 7 end 8 END 问题4: DECL

MySQL数据库--学生管理系统数据库设计

目录 学生管理系统数据库设计 学生管理系统功能介绍 数据库设计步骤 第1步: 找对象 第2步:找属性 第3步: 找关系 建表原则 第4步: 找特例: 等级明显而且不包含敏感数据的信息建议保持为1张表 总结: 数据库设计遵循的原则[重点] 学生管理系统数据库设计 设计一套数据库首先要熟悉当前系统有哪些功能,具体的业务流程是什么 学生管理系统功能介绍 一套学校用的学生管理系统,最核心的功能如下 学生信息管理(增加学生,删除学生,修改学生,查询学生信息==简称:CURD) 老师信息管理(CURD) 课

数据库设计 三范式

1NF:字段不可分; 2NF:有主键,非主键字段依赖主键; 3NF:非主键字段不能相互依赖; 解释: 1NF:原子性 字段不可再分,否则就不是关系数据库; 2NF:唯一性 一个表只说明一个事物; 3NF:每列都与主键有直接关系,不存在传递依赖; 不符合第一范式的例子(关系数据库中create不出这样的表): 表:字段1, 字段2(字段2.1, 字段2.2), 字段3 ...... 存在的问题: 因为设计不出这样的表, 所以没有问题; 不符合第二范式的例子: 表:学号, 姓名, 年龄, 课程名称,

数据库设计——三范式

关系型数据库是现在广泛应用的数据库类型,对关系型数据库的设计就是对数据进行组织化和结构化的过程.对于小规模的数据库我们处理起来还是比较轻松地,但是随着数据库规模的扩大我们将发现用户操控数据库的SQL语句将变得笨拙.复杂.更糟糕的是很有可能导致数据不完整,不准确.所以我们有必要将数据设计的更加符合规范. 在实际开发中最为常见的设计范式有三个: 1.第一范式 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只有数据库是关系型数据库(mysql/oracle/db2/informix/sys

数据库设计——三范式概念+实战

在利用三范式设计数据库的时候,以前总以为是先画完ER图,然后导出关系模式,最后用三范式去检验数据库设计的是否合理,but not!我们在一开始画ER图的时候,就应当和三范式联系起来,将错误消灭在源头.为了能最早的检验出错误,我们就要对ER图转换成关系模式的算法和三范式是如何消除冗余,避免冲突有深刻的了解,才能知道如何最早发现错误. 本文主要以机房收费系统数据库设计中的一些东西为例,结合三范式概念,简述下三范式. 一,1NF 定义: 如果关系模式R的每个关系r的属性值都是不可分的原子值,那么称R是

数据库设计三范式理解

数据库设计的第三范式 关系数据库中的关系必须满足一定的要求.满足不同程度要求的为不同范式.数据库的设计范式是数据库设计所需要满足的规范.只有理解数据库的设计范式,才能设计出高效率.优雅的数据库,否则可能会设计出错误的数据库. 目前,主要有六种范式:第一范式.第二范式.第三范式.BC范式.第四范式和第五范式.满足最低要求的叫第一范式,简称1NF.在第一范式基础上进一步满足一些要求的为第二范式,简称2NF.其余依此类推. 范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦,但是操作困难

mysql数据库设计三范式

为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际开发中最为常见的设计范式有三个: 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式. 第一范式的合理遵循需要根据系统的实际需求来定.比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个