学生信息管理系统(SQL数据库技术)

《SQL 数据库技术》课程设计

一、题目:学生成绩管理 二、因为我做的是学生成绩管理,所以数据库中至少有个一个表是来存储学生的各课成绩的。有了学生成绩,得知道这个成绩是哪个学生的,所以此表中也得有学生姓名,但是学生姓名肯定有重复的 ,所以得必须有个标志来惟一标识一个学生,所以得给每个学生一个编号(学号),但是也得必须清楚,这个成绩是哪门课程的,所以给课程定义了一个编号。之后,得想到有了学生成绩表,总得有个表来存放学生信息吧,所以又建立一个学生信息表,此表中的必须的字段得有学号、姓名、班级,其他的字段可以根据需要来添加。然后就是得有个课程表来存放哪个教师教哪门课程信息,所以此表中至少得有课程号,课程名称和教师的惟一标识(教师编号),再有一个表来存放教师的信息的,其中的字段必须有教师编号,教师姓名和所在的部门,当然也可以有教师出生日期、职称、电话号码等字段。

总之,这个学生管理系统总共包括四个表学生信息表st udent 、教师信息表t eacher 、成绩表sco r e 和课程表cour se 。

St udent 表:在建表时,除了添加学号、姓名、班级必要字段,还添加一些其他的字段,比如:出生日期、性别、邮箱地址和类型等。

Teacher 表:在建表时,除了添加教师编号,教师姓名,部门必要字段,还可以添加一些其他的字段,比如:出生日期、性别、和电话等。

Sco r e 表:此表应该包括学生学号、课程号和成绩等。 Cour se 表:应包括课程号,对应的课程名称和教此课程的教师编号。 (1)、建立一个数据库,然后在此数据库中建立这四个数据表。

(2)、向表中添加记录。 (3)、用一些查询语句来查看表中的特定记录。 (4)、向表中添加一些字段。如:向t eacher 表中添加字段 t el (5)、创建一个自定义数据类型,并修改s t udent 表中的某个字段为此数据类型。 (6)、创建几个视图

⏹ 查询某个班级的学生信息

⏹ ⏹ ⏹

查看每门课程的平均成绩

查看选修计算机课程的学生信息

查看所有男教师和所有男学生的信息

(7)、创建几个存储过程

● 显示成绩表中的课程号在课程表中且所任教师性别为男、计算机系的成绩表

● ●

显示某学生的学号,姓名,所学课程号,课程名称和对应的成绩 在执行此存储过程时,如果没有给出参数(学生姓名),则输入全部的学生的学号,姓名,班级,任课教师编号及其姓名,所学课程名称和成绩,如果有,则显示此学生的以上信息。

(8)、创建触发器

◆ 在成绩表中建立一个触发器,当向表中添加记录时,此学生的成绩都乘以1.2

◆ 检查学生的邮箱地址是否相同,如果相同,输出'inserting fail',并且回滚事务;如果不相同,则插入成功。 ◆ 在成绩表建立一个触发器,在向表中插入记录时,检验插入的课程号是否在课

程表中的课程号的范围之内。

(9)、创建规则,并绑定

● 在向成绩表中添加记录时,如果成绩degree

在向教师表中添加记录时,如果电话号码不是0-9的数字,则插入不成功。

(10)、创建自定义函数和索引

这些都在后面有完整的代码和解释。 三、四个表的E-R 实体模型图分析:

在教学管理中,学校开设若干门学科,一个教师可以教授其中的一门或多门课程,每个学生也需要学习其中的几门课程,因此,教学管理中涉及的对象(实体型)有学生、教师和课程。用E-R 图描述它们之间的联系。如图所示。其中,学生与课程是多对多的联系,而教师与课程的联系则是一对多。 这四个表的总的实体-关系图:

四、设计数据表:通过E-R 图分析,现在已经对数据库有一个很清楚的认识了。 在此学生成绩信息中有4个表需要建立

学生信息表(student )包括学号(sno )、姓名(sname )、性别(Ssex )、班级(class )、出生日期(sbirth )

教师信息表( teacher)包括教师编号(tno )、姓名(tname )、性别(Tsex )、部门(depart )、职称(prof )、出生日期(tbirth ) 成绩表(score )包括学号(sno )、课程号(cno )、成绩(degree )

课程信息表(course )包括课程号(cno )、课程名称(cname )、教师编号(tno ) 五、表结构

主键是一个表通过一个列或多个列组合的数据来唯一标识表中的每一行,这个列或列组合就被称为主键,煮件可以来强制实体完整性。 主键约束有以下特征和作用:

(1)主键约束通过不允许一个或多个列输入重复的值来保证一个表中所有行的惟一性,使所有浪都是可以区分的。

(2)一个表张只能有一个主键,且组成主键的列的数据都不能取空值。

(3)当定义主键约束时,SQL server 在主键列上建立惟一性索引,这个索引在煮件被查询时可以加快查询的速度。

在teacher 表中,以教师编号tno 为主键,对其进行惟一性约束。 在Course 表中,以课程号为主键,对其进行惟一性约束。

六、其他对象的说明:

(1)、外键约束(primary key ):外键也是由表中的一个列或多个列组成的,它是和在相关表中事先定义的具有惟一性的列一起使用的,该列一个是所在表的主键。外键约束用来建立和强制两个表之间的关联,即一个表的一个列或列组合与另一个表 的具有惟一性的列或列组合相关,这个列或列组合就成为第一个表中的外键外键约束限制将破坏这种关联的操作。作为外键的列的值可以是空值,或是它所引用的表中已经存在的值。

在score 表中,其学号sno 和课程号cno 都是此表的外键约束,因为此表中学号sno 要受学生信息表中的学号的约束,student 表中没有的学号,score 表中也应该没有,如果向score 表添加数据时违反的此规则,则添加不成功。课程号cno 也同样,受到course 表中课程号cno 的约束. 。

(2)、空值(null):空值意味着数据尚未如,它与0或长度为零的字符串(“”)的含义不同。如果表中的某一列必须有值才能使记录有意义,那么可以指明该列不允许取空值。

在教师信息表teacher 中其出生日期列tbirth 和职称prof 允许为空,但并不表示该教师没有生日,没有职称,而是目前还不知道而已。在学生信息表student 中其出生日期sbirth 也可为空,也是同样的道理。

(3)、check 约束:检查约束可以用来限制列上可以接受的数据值,检查约束使用逻辑表达式来限制列上可以接受的数据。可以在一个列上使用多个检查约束,也可以在表上建立一个可以在多个列上使用的检查约束。

比如:在学生信息表中,邮件地址semail 的格式必须是%@%格式的。 (4)、惟一性约束:使用惟一性约束的作用是保证在不是主键的指定惟一性的列上不会出现重复的数据。定义了惟一性约束的列上的数据可以为空值,一个表上可以定义多个惟一性约束。

七、创建数据库、数据表、视图、存储过程、自定义函数、触发器等语句和测试语句 1、创建数据库: create database ssh

on

( name=ssh,

filename='e:\老大\sql\ssh.mdf', size=1)

log on

( name=ssh1,

filename='e:\老大\sql\ssh1.ldf', size=1)

2、创建数据表 (1)、student 表 use ssh

create table student

(sno char(8) primary key, sname char(10) not null, Ssex char(2) not null,

Sbirth datetime,

class char(4) not null semail varchar(20)) (2)、score 表 create table score

(sno char(8) not null,

cno char(4) not null, degree float not null) (3)、course 表

create table course

(cno char(5) not null primary key, cname varchar(10) not null, tno char(3) not null ) (4)、teacher 表 create table teacher

(tno char(5) not null primary key, tname varchar(10) not null, depart varchar(8) not null, Tsex char(2) not null,

Tbirth datetime ,

prof char(6) ) 4向表中添加记录 (1)、向学生信息表中添加

insert into student values('101','生活',' 女','1983-09-18','11') insert into student values('102','风尘',' 男','1984-01-01','11') insert into student values('103','离开',' 男','1984-01-01','11') insert into student values('104','流浪',' 女','1984-11-11','11') insert into student values('105','生命',' 男','1984-12-05','13') insert into student values('106','无悔',' 女','1984-11-01','13') insert into student values('107','历史',' 女','1984-10-01','12') insert into student values('108','风尘',' 男','1985-9-08','11') insert into student values('109','活着',' 男','1985-12-12','12') insert into student values('110','傻瓜',' 女','1985-08-28','12') „„„„„„ 查看记录

Select * from student

(2)、向成绩表中添加

insert into score values('101','01',88) insert into score values('101','02',85) insert into score values('102','02',80) insert into score values('101','03',88) insert into score values('102','02',85) insert into score values('102','03',80) insert into score values('103','01',83) insert into score values('103','02',85) insert into score values('103','03',90) insert into score values('104','01',60) „„„„ 查看记录 Select * from score

(3)、向教师表中添加数据

insert into course values('01','计算机','11') insert into course values('02','网络管理','12') insert into course values('03','专业英语','13') insert into course values('04','软件工程','14') „„„„ 查看记录

Select * from course

(4)、向课程表中添加数据

insert into teacher values('11','无意',' 计算机系',' 男','1973-4-5',' 教授') insert into teacher values('12','生活',' 计算机系',' 女','1975-12-1',' 副教授') insert into teacher values('13','没有',' 管理系',' 女','1975-3-3',' 副教授') insert into teacher values('14','离开',' 英语系',' 男','1973-5-5',' 教授')

„„„„

查看记录

Select * from teacher

5、一些查询语句

(1)、查询成绩大于学号为101的学生的课程为02的成绩的所有列。

select * from score where degree>(select degree from score where sno='101' and cno='02')

(2)、查询课程号01大于课程号02的最大值、并以分数降序排序的成绩表中所有列 select * from score s where s.cno='01' and s.degree>=(select max(degree) from score y where y.cno='02' ) order by degree desc go

select max(degree) as "02max" from score where cno='02'

(3)、查询性别为男的学号,姓名,班级,课程号和成绩的学生

select student.sno,student.sname,student.class,score.cno,score.degree from student,score where student.sno=score.sno and ssex='男

'

(4)、查询成绩在60到80之间的所有列

select * from score where degree between 60 and 80

(5)、查询score 表中至少有5名学生选修的并以0开头的课程的平均分

select avg(degree) as " 平均分",cno from score where cno like '0%' group by cno having

count(*)>=5

6、创建自定义数据类型

创建一个email 自定义数据类型

exec sp_addtype email, 'varchar(20)' , 'null'

修改student 表中的semail 数据类型为email 类型 alter table student alter column semail email 7、向表中添加字段

向student 表添加type,semail,,b 并且邮件地址有check 约束 alter table student add type char(7)

alter table student add semail varchar(20) null constraint ck_sem check (semail like '%@%') alter table teacher add tel varchar(15) 8、创建视图

(1)、创建所有11班的学生信息的视图

create view student11

as

select * from student where class='11' 查看视图中的记录

select * from student11

(2)、创建视图course_degree,其中的内容是选修计算机课程的学生信息,包括(sno,sname,cno,cname,degree ),创建时加上with check option create view course_degree(sno,sname,cno,cname,degree)

as

select score.sno,sname,score.cno,cname,degree from course ,student, score where score.cno=course.cno and student.sno=score.sno and cname='计算机' with check option 查看视图中的记录

select * from course_degree

(3)、创建一个视图,其中的内容是成绩表中每门课程的 create view average

as

select avg(degree) as '平均分' from score group by cno 查看视图中的记录

select * from average

(4)、创建视图其中的内容是所有男教师和男学生的name,sex,birth create view man as

select sname as name,ssex as sex,sbirth as birth from student where ssex='男' union select tname,tsex,tbirth from teacher where tsex='男' 查看视图中的记录

select * from man

9、创建规则

规则的作用月CHECK 约束的部分功能相同,在向表中的某列插入或更新数据时,用它来限制输入的新值的取值范围。而它与CHECK 约束不同的是:

● ● ●

CHECK 约束是用CREA TE TABLE语句在建表时指定的,而规则需要作为单独的数据库对象来实现。

在一个列上只能使用一个规则。但可以使用多个CHECK 约束。

规则可以应用于多个列,还可以应用于用户自定义的数据类型,而CHECK 约束只能应用于它定义的列。

(1)、创建一个degree_rule规则 create rule degree_rule

as

@values>0

把此规则绑定到score 表中degree 列

exec sp_bindrule 'degree_rule','score.degree'

在向成绩表中添加记录时,如果成绩degree

@value like '[0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9]' 把此规则绑定到teacher 表中tel 列

exec sp_bindrule 'tel_rule','teacher.tel'

在向教师表中添加记录时,如果电话号码不是0-9的数字,则插入不成功。

10、创建存储过程

存储过程是存储在服务器上的例行程序及过程,在SQL SERVER 只能感定义某个过程,其中记录了一系列的造作,每次应用程序只需调用该过程就可完成该操作,这种SQL SERVER 中定义的过程就被称为存储过程。它可以完成以下功能:

⏹ 接受输入参数并返回多个输出值。

包含T-SQL 语句用以完成特定的SQL SERVER 操作,其中可以有对其他存储过程的调用。

⏹ 返回一个指示成功与否及失败原因的状态代码给调用它的过程。 存储过程不能接用过程名返回值,也不能直接在表达式中使用。

(1)、创建一个存储过程,来显示成绩表中的课程号在课程表中并且所任教师性别为男、所在部门是计算机系的成绩表中的列 create proc student_11

as

select * from score where cno in (select cno from course ,teacher where course.tno=teacher.tno and depart='计算机系' and tsex='男') 调用此存储过程 Exec student_11

(2)、创建一个带输入参数的存储过程,调用此存储过程时,给出一个学生名,显示出此学生的学号,姓名,所学课程号,课程名称和对应的成绩 create proc student_name @sname varchar(10) as

select student.sno,sname,score.cno,degree cname from student,score,course where student.sno=score.sno and score.cno=course.cno and sname=@sname 调用此存储过程,(此例是输出姓名为历史的学生的信息) exec student_name '历史

'

(3)、创建一个存储过程,在执行此存储过程时,如果没有给出参数(学生姓名),则输入全部的学生的学号,姓名,班级,任课教师编号及其姓名,所学课程名称和成绩,如果有,则显示此学生的以上信息。

create proc student_teacher

@sname varchar(10)=null

as

if @sname is null

select student.sno,sname,student.class,teacher.tno,teacher.tname,degree,cname

student,score,course,teacher

where student.sno=score.sno and score.cno=course.cno and course.tno=teacher.tno

else

select student.sno,sname,student.class,teacher.tno,teacher.tname,degree,cname from from student,score,course,teacher

where student.sno=score.sno and score.cno=course.cno and course.tno=teacher.tno and sname=@sname

调用此存储过程

exec student_teacher(没有实参)

exec student_teacher '历史' (查询姓名为历史的学生的选课信息和成绩)

(4)、创建一个存储过程,传递一个学生姓名,先判断此学生是否有邮箱,如果有,则显示此学生的姓名,邮箱地址,学号,班级;如果没有的话,输出此句话'the semail is empty' create proc student_email

@sname varchar(10)

as

begin

if (select semail from student where sname=@sname) is null

begin

print'the semail is empty'

end

else

select sname,semail,sno,class from student where sname=@sname

end

调用此存储过程

exec student_email 'super'

当给出姓名的那个学生没有邮箱地址时, 则会显示如下内容。

exec student_email dfdf'

11、触发器

触发器是一种特殊的存储过程,它不能显式地调用,而是在往表中插入记录、更新记录或者删除记录时,被自动的激活。所以,触发器可以用来对表实施复杂的完整性约束,当触发器所保护的数据发生改变时,触发器会自动被激活,从而防止对数据的不正确修改。在触发器中卡仪查询其他表,也可以执行更复杂的T-SQL 语句。如果发现引起触发器执行的T-SQL 语句执行了一个非法的操作,则可以通过回滚事务使语句不能执行,回滚后SQL SERVER 会自动返回到此事务执行前的状态。

SQL SERVER为每个触发器都查了两个专用表,inserted 表和deleted 表. 这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后,与该触发器相关的这两个表也会被删除。

一个表中可以有多个具有不同名称的各种类型的触发器,每个触发器都可以完成不同的功能,但每个触发器只能作用在一个表上。

(1)、创建一个触发器,来检查学生的邮箱地址是否相同,如果相同,输出'inserting fail',并且回滚事务;如果不相同,则插入成功。

create trigger studentinsert

on student

after insert

as

if (select semail from inserted where semail in (select semail from student)) is not null begin

print 'inserting fail'

rollback transaction

end

else

print'insering succeed'

向学生信息表中插入一条记录,检验是否成功插入

insert into student values('114','lengbing','女','1985-12-12','11','[email protected]','一般')

(2)、在成绩表中建立一个触发器,当向表中添加记录时,此学生的成绩都乘以1.2 create trigger scoreupdate on score

after insert

as

update score set degree=degree*1.2 from score where sno in (select sno from inserted ) 向表中插入一条记录,检验触发器是否有用。

insert into score values('108','01','56')

(3)、在成绩表建立一个触发器,在向表中插入记录时,检验插入的课程号是否在课程表中的课程号的范围之内。如果在,则插入成功;否则,提示信息' 没有这门课程' ,回滚事务。 create trigger course_score

on score

after insert

as

if (select cno from inserted where cno in(select cno from course)) is null

begin

print' 没有这门课程'

rollback transaction

end

向表中添加一条记录,进行验证。

insert into score values('108','06','60')

12、自定义函数

函数是由一条或多条T-SQL 语句组成的代码段,用语实现一些常用的功能,编写好的函数可以重复使用。用户自定义函数可以接受零个或多个输入参数,函数的返回值可以是一个数值,也可以是一个表。用户自定义函数有三种类型:

● 返回数值的用户自定义函数 内联(单语句)的返回表的用户自定义函数 多语句的返回表的用户自定义函数

(1)、创建一个用户自定义函数,输出与指定的学生同班的学生个数

create function studentcount

(@sno char(5))

returns int

begin

eclare @counter int

select @counter=count(*) from student where class=(select class from student where sno=@sno)

return @counter

end

调用此自定义函数(本例是查找与学号102同班的学生个数)

declare @a int

set @a=dbo.studentcount('102')

print convert(char(3),@a)

(2)、创建一个用户自定义函数,用于输出同一个班级中的学生信息

create function studentclass

(@class char(5))

returns table

return(select * from student where class=@class)

调用自定义函数(本例是输出12班的学生信息)

select * from studentclass('12')

(3)、创建一个自定义函数,把某一学生所学课程名称,课程号及其成绩插入一个临时表中显示出来。

create function studentscore

(@sno varchar(5))

returns @student_score table

(sno char(5),

sname varchar(10),

cno char(5),

cname varchar(10),

degree float)

begin

insert @student_score

select student.sno,sname,score.cno,cname,degree from student,score,course

where student.sno=score.sno and score.cno=course.cno and student.sno=@sno

return

end

查看学号为103的学生的各科成绩。

select * from studentscore('103')

13、建立索引

SQL SERVER 的索引是一种物理结构,它能够提供一种以一列或多列的值为基础迅速查找表中行的能力。索引中记录了表中的关键值,提供了指向表中行的指针。它既可以在定义表时创建,也可以在定义表之后的任何时候创建。索引可以创建在一个列或多个列的组合上。

(1)、在学生信息表邮箱列上创建一个惟一性的非聚簇索引

create unique nonclustered index ix_semail on student(semail)

(2)、在学生信息表的学号列上创建一个惟一性聚簇索引

create unique clustered index ix_sno on student (sno desc)

(3)、在教师信息表的姓名列上创建一个非惟一性的非聚簇索引

create nonclustered index ix_name on teacher(tname)

八、以上这些东西都是老师平时让我们做的实验的一个汇总,然后再在里面加入了一些我个人的想法设计,仿照以前的实验,又增加了一些东西。总的来说,是把以前老师讲的知识又串了一下,又熟悉了许多,很多以前没有弄明白的知识点,通过这次课程设计,差不多都掌握了,对于那些像触发器、存储过程、自定义函数、视图等等应用程序的建立、使用方法和作用,我又有了更深一步的了解和掌握。但是还有很多欠缺,就像我做这些东西,感觉没有一定的逻辑顺序,好象之间没有多大的联系似的,所以还要更进一步的完善,但是由于时间紧迫,没有办法完善它。

做此课程设计过程中,得到老师和同学的大力支持和帮助,在此特别感谢。

《SQL 数据库技术》课程设计

一、题目:学生成绩管理 二、因为我做的是学生成绩管理,所以数据库中至少有个一个表是来存储学生的各课成绩的。有了学生成绩,得知道这个成绩是哪个学生的,所以此表中也得有学生姓名,但是学生姓名肯定有重复的 ,所以得必须有个标志来惟一标识一个学生,所以得给每个学生一个编号(学号),但是也得必须清楚,这个成绩是哪门课程的,所以给课程定义了一个编号。之后,得想到有了学生成绩表,总得有个表来存放学生信息吧,所以又建立一个学生信息表,此表中的必须的字段得有学号、姓名、班级,其他的字段可以根据需要来添加。然后就是得有个课程表来存放哪个教师教哪门课程信息,所以此表中至少得有课程号,课程名称和教师的惟一标识(教师编号),再有一个表来存放教师的信息的,其中的字段必须有教师编号,教师姓名和所在的部门,当然也可以有教师出生日期、职称、电话号码等字段。

总之,这个学生管理系统总共包括四个表学生信息表st udent 、教师信息表t eacher 、成绩表sco r e 和课程表cour se 。

St udent 表:在建表时,除了添加学号、姓名、班级必要字段,还添加一些其他的字段,比如:出生日期、性别、邮箱地址和类型等。

Teacher 表:在建表时,除了添加教师编号,教师姓名,部门必要字段,还可以添加一些其他的字段,比如:出生日期、性别、和电话等。

Sco r e 表:此表应该包括学生学号、课程号和成绩等。 Cour se 表:应包括课程号,对应的课程名称和教此课程的教师编号。 (1)、建立一个数据库,然后在此数据库中建立这四个数据表。

(2)、向表中添加记录。 (3)、用一些查询语句来查看表中的特定记录。 (4)、向表中添加一些字段。如:向t eacher 表中添加字段 t el (5)、创建一个自定义数据类型,并修改s t udent 表中的某个字段为此数据类型。 (6)、创建几个视图

⏹ 查询某个班级的学生信息

⏹ ⏹ ⏹

查看每门课程的平均成绩

查看选修计算机课程的学生信息

查看所有男教师和所有男学生的信息

(7)、创建几个存储过程

● 显示成绩表中的课程号在课程表中且所任教师性别为男、计算机系的成绩表

● ●

显示某学生的学号,姓名,所学课程号,课程名称和对应的成绩 在执行此存储过程时,如果没有给出参数(学生姓名),则输入全部的学生的学号,姓名,班级,任课教师编号及其姓名,所学课程名称和成绩,如果有,则显示此学生的以上信息。

(8)、创建触发器

◆ 在成绩表中建立一个触发器,当向表中添加记录时,此学生的成绩都乘以1.2

◆ 检查学生的邮箱地址是否相同,如果相同,输出'inserting fail',并且回滚事务;如果不相同,则插入成功。 ◆ 在成绩表建立一个触发器,在向表中插入记录时,检验插入的课程号是否在课

程表中的课程号的范围之内。

(9)、创建规则,并绑定

● 在向成绩表中添加记录时,如果成绩degree

在向教师表中添加记录时,如果电话号码不是0-9的数字,则插入不成功。

(10)、创建自定义函数和索引

这些都在后面有完整的代码和解释。 三、四个表的E-R 实体模型图分析:

在教学管理中,学校开设若干门学科,一个教师可以教授其中的一门或多门课程,每个学生也需要学习其中的几门课程,因此,教学管理中涉及的对象(实体型)有学生、教师和课程。用E-R 图描述它们之间的联系。如图所示。其中,学生与课程是多对多的联系,而教师与课程的联系则是一对多。 这四个表的总的实体-关系图:

四、设计数据表:通过E-R 图分析,现在已经对数据库有一个很清楚的认识了。 在此学生成绩信息中有4个表需要建立

学生信息表(student )包括学号(sno )、姓名(sname )、性别(Ssex )、班级(class )、出生日期(sbirth )

教师信息表( teacher)包括教师编号(tno )、姓名(tname )、性别(Tsex )、部门(depart )、职称(prof )、出生日期(tbirth ) 成绩表(score )包括学号(sno )、课程号(cno )、成绩(degree )

课程信息表(course )包括课程号(cno )、课程名称(cname )、教师编号(tno ) 五、表结构

主键是一个表通过一个列或多个列组合的数据来唯一标识表中的每一行,这个列或列组合就被称为主键,煮件可以来强制实体完整性。 主键约束有以下特征和作用:

(1)主键约束通过不允许一个或多个列输入重复的值来保证一个表中所有行的惟一性,使所有浪都是可以区分的。

(2)一个表张只能有一个主键,且组成主键的列的数据都不能取空值。

(3)当定义主键约束时,SQL server 在主键列上建立惟一性索引,这个索引在煮件被查询时可以加快查询的速度。

在teacher 表中,以教师编号tno 为主键,对其进行惟一性约束。 在Course 表中,以课程号为主键,对其进行惟一性约束。

六、其他对象的说明:

(1)、外键约束(primary key ):外键也是由表中的一个列或多个列组成的,它是和在相关表中事先定义的具有惟一性的列一起使用的,该列一个是所在表的主键。外键约束用来建立和强制两个表之间的关联,即一个表的一个列或列组合与另一个表 的具有惟一性的列或列组合相关,这个列或列组合就成为第一个表中的外键外键约束限制将破坏这种关联的操作。作为外键的列的值可以是空值,或是它所引用的表中已经存在的值。

在score 表中,其学号sno 和课程号cno 都是此表的外键约束,因为此表中学号sno 要受学生信息表中的学号的约束,student 表中没有的学号,score 表中也应该没有,如果向score 表添加数据时违反的此规则,则添加不成功。课程号cno 也同样,受到course 表中课程号cno 的约束. 。

(2)、空值(null):空值意味着数据尚未如,它与0或长度为零的字符串(“”)的含义不同。如果表中的某一列必须有值才能使记录有意义,那么可以指明该列不允许取空值。

在教师信息表teacher 中其出生日期列tbirth 和职称prof 允许为空,但并不表示该教师没有生日,没有职称,而是目前还不知道而已。在学生信息表student 中其出生日期sbirth 也可为空,也是同样的道理。

(3)、check 约束:检查约束可以用来限制列上可以接受的数据值,检查约束使用逻辑表达式来限制列上可以接受的数据。可以在一个列上使用多个检查约束,也可以在表上建立一个可以在多个列上使用的检查约束。

比如:在学生信息表中,邮件地址semail 的格式必须是%@%格式的。 (4)、惟一性约束:使用惟一性约束的作用是保证在不是主键的指定惟一性的列上不会出现重复的数据。定义了惟一性约束的列上的数据可以为空值,一个表上可以定义多个惟一性约束。

七、创建数据库、数据表、视图、存储过程、自定义函数、触发器等语句和测试语句 1、创建数据库: create database ssh

on

( name=ssh,

filename='e:\老大\sql\ssh.mdf', size=1)

log on

( name=ssh1,

filename='e:\老大\sql\ssh1.ldf', size=1)

2、创建数据表 (1)、student 表 use ssh

create table student

(sno char(8) primary key, sname char(10) not null, Ssex char(2) not null,

Sbirth datetime,

class char(4) not null semail varchar(20)) (2)、score 表 create table score

(sno char(8) not null,

cno char(4) not null, degree float not null) (3)、course 表

create table course

(cno char(5) not null primary key, cname varchar(10) not null, tno char(3) not null ) (4)、teacher 表 create table teacher

(tno char(5) not null primary key, tname varchar(10) not null, depart varchar(8) not null, Tsex char(2) not null,

Tbirth datetime ,

prof char(6) ) 4向表中添加记录 (1)、向学生信息表中添加

insert into student values('101','生活',' 女','1983-09-18','11') insert into student values('102','风尘',' 男','1984-01-01','11') insert into student values('103','离开',' 男','1984-01-01','11') insert into student values('104','流浪',' 女','1984-11-11','11') insert into student values('105','生命',' 男','1984-12-05','13') insert into student values('106','无悔',' 女','1984-11-01','13') insert into student values('107','历史',' 女','1984-10-01','12') insert into student values('108','风尘',' 男','1985-9-08','11') insert into student values('109','活着',' 男','1985-12-12','12') insert into student values('110','傻瓜',' 女','1985-08-28','12') „„„„„„ 查看记录

Select * from student

(2)、向成绩表中添加

insert into score values('101','01',88) insert into score values('101','02',85) insert into score values('102','02',80) insert into score values('101','03',88) insert into score values('102','02',85) insert into score values('102','03',80) insert into score values('103','01',83) insert into score values('103','02',85) insert into score values('103','03',90) insert into score values('104','01',60) „„„„ 查看记录 Select * from score

(3)、向教师表中添加数据

insert into course values('01','计算机','11') insert into course values('02','网络管理','12') insert into course values('03','专业英语','13') insert into course values('04','软件工程','14') „„„„ 查看记录

Select * from course

(4)、向课程表中添加数据

insert into teacher values('11','无意',' 计算机系',' 男','1973-4-5',' 教授') insert into teacher values('12','生活',' 计算机系',' 女','1975-12-1',' 副教授') insert into teacher values('13','没有',' 管理系',' 女','1975-3-3',' 副教授') insert into teacher values('14','离开',' 英语系',' 男','1973-5-5',' 教授')

„„„„

查看记录

Select * from teacher

5、一些查询语句

(1)、查询成绩大于学号为101的学生的课程为02的成绩的所有列。

select * from score where degree>(select degree from score where sno='101' and cno='02')

(2)、查询课程号01大于课程号02的最大值、并以分数降序排序的成绩表中所有列 select * from score s where s.cno='01' and s.degree>=(select max(degree) from score y where y.cno='02' ) order by degree desc go

select max(degree) as "02max" from score where cno='02'

(3)、查询性别为男的学号,姓名,班级,课程号和成绩的学生

select student.sno,student.sname,student.class,score.cno,score.degree from student,score where student.sno=score.sno and ssex='男

'

(4)、查询成绩在60到80之间的所有列

select * from score where degree between 60 and 80

(5)、查询score 表中至少有5名学生选修的并以0开头的课程的平均分

select avg(degree) as " 平均分",cno from score where cno like '0%' group by cno having

count(*)>=5

6、创建自定义数据类型

创建一个email 自定义数据类型

exec sp_addtype email, 'varchar(20)' , 'null'

修改student 表中的semail 数据类型为email 类型 alter table student alter column semail email 7、向表中添加字段

向student 表添加type,semail,,b 并且邮件地址有check 约束 alter table student add type char(7)

alter table student add semail varchar(20) null constraint ck_sem check (semail like '%@%') alter table teacher add tel varchar(15) 8、创建视图

(1)、创建所有11班的学生信息的视图

create view student11

as

select * from student where class='11' 查看视图中的记录

select * from student11

(2)、创建视图course_degree,其中的内容是选修计算机课程的学生信息,包括(sno,sname,cno,cname,degree ),创建时加上with check option create view course_degree(sno,sname,cno,cname,degree)

as

select score.sno,sname,score.cno,cname,degree from course ,student, score where score.cno=course.cno and student.sno=score.sno and cname='计算机' with check option 查看视图中的记录

select * from course_degree

(3)、创建一个视图,其中的内容是成绩表中每门课程的 create view average

as

select avg(degree) as '平均分' from score group by cno 查看视图中的记录

select * from average

(4)、创建视图其中的内容是所有男教师和男学生的name,sex,birth create view man as

select sname as name,ssex as sex,sbirth as birth from student where ssex='男' union select tname,tsex,tbirth from teacher where tsex='男' 查看视图中的记录

select * from man

9、创建规则

规则的作用月CHECK 约束的部分功能相同,在向表中的某列插入或更新数据时,用它来限制输入的新值的取值范围。而它与CHECK 约束不同的是:

● ● ●

CHECK 约束是用CREA TE TABLE语句在建表时指定的,而规则需要作为单独的数据库对象来实现。

在一个列上只能使用一个规则。但可以使用多个CHECK 约束。

规则可以应用于多个列,还可以应用于用户自定义的数据类型,而CHECK 约束只能应用于它定义的列。

(1)、创建一个degree_rule规则 create rule degree_rule

as

@values>0

把此规则绑定到score 表中degree 列

exec sp_bindrule 'degree_rule','score.degree'

在向成绩表中添加记录时,如果成绩degree

@value like '[0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9]' 把此规则绑定到teacher 表中tel 列

exec sp_bindrule 'tel_rule','teacher.tel'

在向教师表中添加记录时,如果电话号码不是0-9的数字,则插入不成功。

10、创建存储过程

存储过程是存储在服务器上的例行程序及过程,在SQL SERVER 只能感定义某个过程,其中记录了一系列的造作,每次应用程序只需调用该过程就可完成该操作,这种SQL SERVER 中定义的过程就被称为存储过程。它可以完成以下功能:

⏹ 接受输入参数并返回多个输出值。

包含T-SQL 语句用以完成特定的SQL SERVER 操作,其中可以有对其他存储过程的调用。

⏹ 返回一个指示成功与否及失败原因的状态代码给调用它的过程。 存储过程不能接用过程名返回值,也不能直接在表达式中使用。

(1)、创建一个存储过程,来显示成绩表中的课程号在课程表中并且所任教师性别为男、所在部门是计算机系的成绩表中的列 create proc student_11

as

select * from score where cno in (select cno from course ,teacher where course.tno=teacher.tno and depart='计算机系' and tsex='男') 调用此存储过程 Exec student_11

(2)、创建一个带输入参数的存储过程,调用此存储过程时,给出一个学生名,显示出此学生的学号,姓名,所学课程号,课程名称和对应的成绩 create proc student_name @sname varchar(10) as

select student.sno,sname,score.cno,degree cname from student,score,course where student.sno=score.sno and score.cno=course.cno and sname=@sname 调用此存储过程,(此例是输出姓名为历史的学生的信息) exec student_name '历史

'

(3)、创建一个存储过程,在执行此存储过程时,如果没有给出参数(学生姓名),则输入全部的学生的学号,姓名,班级,任课教师编号及其姓名,所学课程名称和成绩,如果有,则显示此学生的以上信息。

create proc student_teacher

@sname varchar(10)=null

as

if @sname is null

select student.sno,sname,student.class,teacher.tno,teacher.tname,degree,cname

student,score,course,teacher

where student.sno=score.sno and score.cno=course.cno and course.tno=teacher.tno

else

select student.sno,sname,student.class,teacher.tno,teacher.tname,degree,cname from from student,score,course,teacher

where student.sno=score.sno and score.cno=course.cno and course.tno=teacher.tno and sname=@sname

调用此存储过程

exec student_teacher(没有实参)

exec student_teacher '历史' (查询姓名为历史的学生的选课信息和成绩)

(4)、创建一个存储过程,传递一个学生姓名,先判断此学生是否有邮箱,如果有,则显示此学生的姓名,邮箱地址,学号,班级;如果没有的话,输出此句话'the semail is empty' create proc student_email

@sname varchar(10)

as

begin

if (select semail from student where sname=@sname) is null

begin

print'the semail is empty'

end

else

select sname,semail,sno,class from student where sname=@sname

end

调用此存储过程

exec student_email 'super'

当给出姓名的那个学生没有邮箱地址时, 则会显示如下内容。

exec student_email dfdf'

11、触发器

触发器是一种特殊的存储过程,它不能显式地调用,而是在往表中插入记录、更新记录或者删除记录时,被自动的激活。所以,触发器可以用来对表实施复杂的完整性约束,当触发器所保护的数据发生改变时,触发器会自动被激活,从而防止对数据的不正确修改。在触发器中卡仪查询其他表,也可以执行更复杂的T-SQL 语句。如果发现引起触发器执行的T-SQL 语句执行了一个非法的操作,则可以通过回滚事务使语句不能执行,回滚后SQL SERVER 会自动返回到此事务执行前的状态。

SQL SERVER为每个触发器都查了两个专用表,inserted 表和deleted 表. 这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后,与该触发器相关的这两个表也会被删除。

一个表中可以有多个具有不同名称的各种类型的触发器,每个触发器都可以完成不同的功能,但每个触发器只能作用在一个表上。

(1)、创建一个触发器,来检查学生的邮箱地址是否相同,如果相同,输出'inserting fail',并且回滚事务;如果不相同,则插入成功。

create trigger studentinsert

on student

after insert

as

if (select semail from inserted where semail in (select semail from student)) is not null begin

print 'inserting fail'

rollback transaction

end

else

print'insering succeed'

向学生信息表中插入一条记录,检验是否成功插入

insert into student values('114','lengbing','女','1985-12-12','11','[email protected]','一般')

(2)、在成绩表中建立一个触发器,当向表中添加记录时,此学生的成绩都乘以1.2 create trigger scoreupdate on score

after insert

as

update score set degree=degree*1.2 from score where sno in (select sno from inserted ) 向表中插入一条记录,检验触发器是否有用。

insert into score values('108','01','56')

(3)、在成绩表建立一个触发器,在向表中插入记录时,检验插入的课程号是否在课程表中的课程号的范围之内。如果在,则插入成功;否则,提示信息' 没有这门课程' ,回滚事务。 create trigger course_score

on score

after insert

as

if (select cno from inserted where cno in(select cno from course)) is null

begin

print' 没有这门课程'

rollback transaction

end

向表中添加一条记录,进行验证。

insert into score values('108','06','60')

12、自定义函数

函数是由一条或多条T-SQL 语句组成的代码段,用语实现一些常用的功能,编写好的函数可以重复使用。用户自定义函数可以接受零个或多个输入参数,函数的返回值可以是一个数值,也可以是一个表。用户自定义函数有三种类型:

● 返回数值的用户自定义函数 内联(单语句)的返回表的用户自定义函数 多语句的返回表的用户自定义函数

(1)、创建一个用户自定义函数,输出与指定的学生同班的学生个数

create function studentcount

(@sno char(5))

returns int

begin

eclare @counter int

select @counter=count(*) from student where class=(select class from student where sno=@sno)

return @counter

end

调用此自定义函数(本例是查找与学号102同班的学生个数)

declare @a int

set @a=dbo.studentcount('102')

print convert(char(3),@a)

(2)、创建一个用户自定义函数,用于输出同一个班级中的学生信息

create function studentclass

(@class char(5))

returns table

return(select * from student where class=@class)

调用自定义函数(本例是输出12班的学生信息)

select * from studentclass('12')

(3)、创建一个自定义函数,把某一学生所学课程名称,课程号及其成绩插入一个临时表中显示出来。

create function studentscore

(@sno varchar(5))

returns @student_score table

(sno char(5),

sname varchar(10),

cno char(5),

cname varchar(10),

degree float)

begin

insert @student_score

select student.sno,sname,score.cno,cname,degree from student,score,course

where student.sno=score.sno and score.cno=course.cno and student.sno=@sno

return

end

查看学号为103的学生的各科成绩。

select * from studentscore('103')

13、建立索引

SQL SERVER 的索引是一种物理结构,它能够提供一种以一列或多列的值为基础迅速查找表中行的能力。索引中记录了表中的关键值,提供了指向表中行的指针。它既可以在定义表时创建,也可以在定义表之后的任何时候创建。索引可以创建在一个列或多个列的组合上。

(1)、在学生信息表邮箱列上创建一个惟一性的非聚簇索引

create unique nonclustered index ix_semail on student(semail)

(2)、在学生信息表的学号列上创建一个惟一性聚簇索引

create unique clustered index ix_sno on student (sno desc)

(3)、在教师信息表的姓名列上创建一个非惟一性的非聚簇索引

create nonclustered index ix_name on teacher(tname)

八、以上这些东西都是老师平时让我们做的实验的一个汇总,然后再在里面加入了一些我个人的想法设计,仿照以前的实验,又增加了一些东西。总的来说,是把以前老师讲的知识又串了一下,又熟悉了许多,很多以前没有弄明白的知识点,通过这次课程设计,差不多都掌握了,对于那些像触发器、存储过程、自定义函数、视图等等应用程序的建立、使用方法和作用,我又有了更深一步的了解和掌握。但是还有很多欠缺,就像我做这些东西,感觉没有一定的逻辑顺序,好象之间没有多大的联系似的,所以还要更进一步的完善,但是由于时间紧迫,没有办法完善它。

做此课程设计过程中,得到老师和同学的大力支持和帮助,在此特别感谢。


相关内容

  • 在线教学质量评价系统的设计与实现
  • 在线教学质量评价系统的设计与实现 摘 要 在线教学质量评价系统可以方便和全面地收集教师教学工作的数据,提供师生网上评教的评分结果,快速集中收集各方面的评教信息,使教务管理部门能够及时了解教学动态和师资情况,为教务老师提供相关决策支持,为职称评聘提供教学工作质量的科学依据,同时减轻了教务老师的工作量. ...

  • ASP学生成绩管理系统论文
  • [摘 要] 人类已进入21世纪,科学技术突飞猛进,经济知识和信息产业初见端倪,特别是信息技术和网络技术的讯速发展和广泛应用,对社会的政治.经济.军事.文化等领域产生越来越深刻.学生成绩管理系统是一个教育单位不可缺少的部分, 它的内容对于学校的决策者和管理者来说都至关重要.本论文叙述到的学生成绩管理系 ...

  • 大学生档案管理系统的设计与实现
  • 学士学位设计论文(设计) 题 目 大学生档案管理系统的设计与实现 姓 名 学 号 二零一六年五月四日 摘 要 随着计算机技术的飞速发展,高校也已进入信息化时代.为了使高校学生信息更高效.更科学,决定开发高校学生档案信息系统.学生档案管理系统是一个教育单位不可缺少的 部分,它的内容对于学校的决策者和管 ...

  • 毕业论文(教师教学评价管理系统)
  • SHANDONGUNIVERSITY OF TECHNOLOGY 毕业论文 教师教学评价管理系统 的设计与实现 学 院: 计算机科学与技术学院 专 业: 计算机科学与技术 学生姓名: 袁霖方 学 号: 0812104359 指导教师: 孙学用 2012 年 6 月 摘要 摘 要 将计算机应用于信息管 ...

  • 学生团员信息管理系统的设计与实现毕业设计
  • (此文档为word 格式,下载后您可任意编辑修改!) 摘 要 信息工程学院学生团员信息管理系统主要是针对团员信息管理设计的.目的是对该院团员四年信息进行有效管理,和注入管理意识提高学生实践能力,以及加深对面向对象思想的理解和系统设计工具的熟练运用. 学生团员信息管理系统是基于Eclipse 开发环境 ...

  • N多毕业设计题目
  • 基于Ajax技术的WEB应用的设计 又快到毕业的时候了,大家该准备做毕业设计了.大学问问特意收集了一些毕业设计(论文)的题目,供大家选择. VB售楼管理系统 VB无纸化考试系统 VB小区物业管理系统 VB航空公司管理信息系统 VB计算机机房管理系统 VB房地产评估系统VB+SQL2000 VB光盘信 ...

  • 实验室管理系统详细设计
  • 实验室管理系统 第一章:引言 1.1课题背景 计算机技术的进步, 促使现代工业技术在快速发展, 随着科研和生产技术的不断发展, 原来的人工管理模式已显得不太适应, 而对于高校实验室, 无论其规模的大小, 每时每刻都会产生例如实验设备信息.实验数据.设备维修等等这样大量的信息, 这些数据.信息不仅是一 ...

  • 学生图书管理系统
  • 学生信息管理系统课程设计 内容提要 在当今知识大爆炸的时代,图书作为信息的一种载体,仍是人们获得知识 的一种重要途径,因而作为图书管理与借阅的图书馆,它的运行情况则关系到知识的传播速度问题.以往旧的图书管理模式完全是手工操作,从新书的购买.编码.入库.上架,到借阅.续借.归还.查询,无一不是人工处理 ...

  • 毕业设计论文-上机考试系统的设计与实现
  • 忻州师范学院成教院 题 目 专 业 年 级 指导教师 学员姓名 学 号 上机考试系统的设计与实现 计算机科学与技术 08级 杜 娟 珍赵 晋 明 年 5月 26日 (毕业论文) 2011 目 录 摘要·················································· ...

  • 学生管理系统项目开发计划
  • 2.1 引言 2.1.1 编写目的 2.1.2 背景 2.1.3 定义 2.1.4 参考资料 2.2 项目概述 2.2.1 工作内容 2.2.2 主要参加人员 2.2.3 产品及成果 2.2.3.1 程序 2.2.3.2 文件 2.2.3.3 服务 2.2.3.4 非移交产品 2.2.4 验收标准 ...