(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 from 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 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','lengbingssh@sina.com','一般') (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) 八、以上这些东西都是老师平时让我们做的实验的一个汇总,然后再在里面加入了一些我个人的想法设计,仿照以前的实验,又增加了一些东西。总的来说,是把以前老师讲的知识又串了一下,又熟悉了许多,很多以前没有弄明白的知识点,通过这次课程设计,差不多都掌握了,对于那些像触发器、存储过程、自定义函数、视图等等应用程序的建立、使用方法和作用,我又有了更深一步的了解和掌握。但是还有很多欠缺,就像我做这些东西,感觉没有一定的逻辑顺序,好象之间没有多大的联系似的,所以还要更进一步的完善,但是由于时间紧迫,没有办法完善它。
做此课程设计过程中,得到老师和同学的大力支持和帮助,在此特别感谢。
数据库技术课程设计报告
------------学生成绩管理