数据库
学 院 计算机学院 专 业 计算机科学与技术 班 级 学 号 姓 名 指导教师
2012/4/30
实验三 更新数据库、视图及数据库完整性
一、实验目的
熟悉通过SQL语句更新数据库、创建视图以及操作视图的基本使用方法,熟悉DBMS系统关于数据库完整性的约束。
二、实验内容和要求
1、熟练update,delete,insert语句进行更新数据库操作
2、创建视图以及操作视图的基本使用方法,
3、通过实验,了解并掌握实体完整性、参照完整性的定义、违约处理。练习使用触发器确保数据完整性。
三、实验主要仪器设备和材料
1.计算机及操作系统:PC机,Windows 2000/xp; 2.数据库管理系统:SQL sever 2000/2005; 四、实验方法、步骤及结果测试
实验题目:
题目1、在表S中插入学生学号009,姓名:麦兜,性别男,1984年4月1日出生,网络工程专业,CS系,籍贯:北京。 实现代码及查询结果截图:格式如下 SQL语句 use student1 go insert into s(sno,sname,ssex,sbirth,ssp,sdept,sfrom) values(009,'麦兜','男','1984-4-1','网络工程','cs','北京') go 查询结果截图显示 题目2、把王涛同学的选课信息全部删掉。查询每个学生选课信息,包括学号,姓名,选课课号,成绩
实现代码及查询sc表的结果截图:
use student1 go delete from Sc where sno in(
select sno from s
where sname='王涛' )
如图所示,学号为6的王涛的选课信息已被删除。 题目3、将选修数据库不及格的成绩全部置空。 实现代码及查询结果截图:
use student1 go
update Sc set grade=null
where grade<60 and cno in(
select cno from C
where cname='数据库' )
Go
题目4、
①查找IS系选修数据库的学生学号,姓名,课程号,成绩。给出截图
use student1
select s.sno,sname,cno,grade from s,Sc
where s.sdept='is' and cno in( ) go
select cno from C
where cname='数据库'
②把IS系同学选修DB的成绩提高10分。
use student1 go
update Sc
set grade=grade+10 where sno in( )
and cno in(
select cno from C select sno from s
where sdept='is'
where cname='数据库' ) Go
修改后的结果如下学号为7和8,课程号为5的结果成绩:
③查看IS系选修数据库的学生学号,姓名,课程号,成绩。给出截图 实现代码及查询结果截图:
use student1
select s.sno,sname,cno,grade from s,Sc
where s.sdept='is' and cno in( ) go
select cno from C
where cname='数据库'
题目5、
①增加麦兜的选课信息。选修’计算机应用’,成绩44分。选修’数据库’,成绩60分 (可以分步求,也可以参照T-SQL中的变量的用法)
use student1 go
insert into Sc(sno,cno,grade) values(009,01,44)
insert into Sc(sno,cno,grade) values(009,05,60)
②查看麦兜的选修信息。显示字段包括学号,姓名,选修课名,成绩
use student1 go
select s.sno,sname,cname,grade from s,C,Sc
where s.sno=009 and s.sno=Sc.sno and C.cno=Sc.cno
实现代码及查询结果截图:
题目6、删除麦兜不及格的选课信息。
use student1 go delete from Sc
where grade<60 and sno=009
实现代码及查询结果截图:
题目7、把CS系学生的学号、姓名、选课课号、课程名、成绩做成视图CS_SC,然后查询该视图所有信息
USE student1 go
create view CS_SC (sno,sname,cno,cname,grade) as
select s.sno,sname,c.cno,cname,grade from s,C,Sc
where s.sdept='cs' and s.sno=Sc.sno and C.cno=Sc.cno
use student1 go select * from CS_SC
实现代码及查询结果截图:
题目8、在CS系的视图中,将学号为009的学生的成绩增加5分 实现代码及查询结果截图:
use student1 go
update CS_SC set grade=grade+5
where sno=009 go select * from CS_SC where sno=009 go
题目9、在sc中插入一条信息,学号009,这个学生还没选课,没有成绩,查看DBMS的提示信息。写出原因(违反了什么完整性规则,应该怎么解决) 实现代码及查询结果截图:
use student1 go
insert into Sc (sno) values(009) go
提示信息如图所示,原因是在sc表中,sno与cno共同构成了sc表的主键,主键是不能为空的,而在插入学号009时,因为该学号还没有选课,也没有成绩,自然也没有对应的课程号,这与主键不为空相矛盾,显然违反了用户定义完整性。
题目10、插入一门课的信息,课程号:08,课程名:java基础, 课程学分:40,查看DBMS提示信息。写出原因 实现代码及查询结果截图:
use student1 go
insert into C(cno,cname,ccredit) values(08,'java基础',40) go
出现的错误如图所示,原因是违反了属性上的约束条件。Ccredit的约束条件是(0,20)取值。
题目11、插入学生信息。学号002,姓名张三,性别男。查看查看DBMS提示信息。写出原因
实现代码及查询结果截图:
use student1 go
insert into s(sno,sname,ssex) values(002,'张三','男') go
出现的错误如图所示,原因是sno是在s表中是主键,取值为一,表中已经存在002学号学生,不能重复插入相同的键。
题目12、①将姓名刘%的学生信息删掉,查看dbms的提示。给出截图。思考该操作违反什么完整性操作?
use student1 go delete
from s
where sname='刘%' go
错误如图所示,该操作违反了参照完整性。若从s表中删除刘%的信息,会导致在sc表中刘%对应的学号在s表中找不到一个刘%的元组。
②删除刘%的选课信息之后,删除该学生信息,DBMS有何提示
删除刘%的选课信息代码: use student1 go delete from Sc where sno in( )
select sno from s
where sname='刘%'
删除刘%的选课信息如下图所示:
删除刘%学生信息代码: use student1 go delete
from s
where sname='刘%' go 结果如图:
删除成功。
③在学生表上设置删除触发器,如果被删除的学生姓名为”麦兜”,则不执行删除操作,并给出提示 ”通过设计触发器禁止删除麦兜同学的信息,请继续执行其它操作!”(提示:请学习临时表inserted和deleted的用法,输出提示信息用PRINT)
use student1 go
create trigger delet_麦兜 on s for delete as begin
if((select sname from s)='麦兜' ) print '不能删除' rollback
end
④思考题
如何通过cascade或者触发器或者SQLServer2005中自带的设置来实现级联删除或级联更新?实现后给出实现代码或者实现操作步骤以及截图
use student1 go
create trigger delet_update on s
for update,delete as begin
if exists(select sno from Sc)
update s set sno=(select sno from Sc) else
delete s where sno=(select sno from Sc) end
go
实现代码及查询结果截图:
五、实验中出现的问题及解决方案
在给选修了数据库的学生成绩加10分的时候遇到数据类型冲突的问题。