数据库上机报告.docx
《数据库上机报告.docx》由会员分享,可在线阅读,更多相关《数据库上机报告.docx(9页珍藏版)》请在冰豆网上搜索。
数据库上机报告
数据库实验报告
实验二交互式SQL语言
1实验报告
《数据库系统概论》实验报告
题目:
交互式SQL
姓名
刘忠梅
日期
2012-6-19
实验环境:
操作系统:
Windows7;数据库管理系统:
MSSQLServer2008
实验内容与完成情况:
1.数据定义:
表的创建、修改及删除
(1)学生表:
Student(Sno,Sname,Sex,Sage,Sdept)。
Student由学号(Sno)、姓名(Sname)、性别(Sex)、年龄(Sage)、所在系(Sdept)五个属性组成,其中Sno为主键。
createtableStudent
(Snochar(9)primarykeynotnull,
Snamechar(20)uniquenotnull,
Ssexchar
(2)notnull,
Sagesmallintnotnull,
Sdeptchar(20)notnull)
InsertintoStudent(Sno,Sname,Ssex,Sage,Sdept)
values('200215121','李勇','男',20,'CS')
insertintoStudent(Sno,Sname,Ssex,Sage,Sdept)
values('200215122','刘晨','女',19,'CS')
insertintoStudent(Sno,Sname,Ssex,Sage,Sdept)
values('200215123','王敏','女',18,'MA')
insertintoStudent(Sno,Sname,Ssex,Sage,Sdept)
values('200215125','张立','男',19,'IS')
(2)课程表:
Course(Cno,Cname,Cpno,Ccredit)
Course课程号(Cno)、课程名(Cname)、先行课的课程号(Cpno)、学分(Ccredit)四个属性组成,其中Cno为主键。
其中Cpno参考了本表的Cno字段的值,Cno为主键
createtablecourse
(cnochar(40)primarykeynotnull,
cnamechar(4)notnull,
ccreditsmallintnotnull
foreignkey(Cpon)referencescourse(Cno))
insertintoCoursevalues('1','数据库','5',4)
insertintoCoursevalues('2','数学','',2)
insertintoCoursevalues('3','信息系统','1',4)
insertintoCoursevalues('4','操作系统','6',3)
insertintoCoursevalues('5','数据结构','7',4)
3基本表的修改:
a)向Student表增加“入学时间”列,期数据类型为日期型
b)将年龄的数据类型由字符型改为整型
c)增加课程名称必须取唯一值的约束条件
altertablestudebtadds_entrancedatetime
altertablestudentaltercolumnsageint
altertablecourseaddunique(cname)
2.数据操作:
1.查询全体学生的学号和姓名
selectsno,sname
fromstudent
2.查询全体学生的详细记录
select*
fromstudent
3.查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示所有系名。
selectsname,'yearofbirth:
',2011-sage,lower(
sdept)
fromstudent
4.查询选修了课程的学生学号,去掉结果中的重复行。
selectdistinctsno
fromsc
5.查询所有年龄在20~23岁之间的学生姓名、系别和年龄。
selectsname,sdept,sage
fromstudent
wheresagenotbetween20and23
1将一新学生记录(学号:
95050;姓名:
陈冬;性别:
男;年龄:
18;所在系:
计算机科学系)插入学生表中。
insert
intostudent(sno,sname,ssex,sage,sdept)
values('95050','陈冬','男',18,'Is')
2插入一条选课记录(‘95020’,’1’)。
insert
intosc(sno,cno)
values('95020','1')
3对每一个系,求学生的平均年龄,并把结果存入数据库。
createtabledept_age
(sdeptchar(15)
Avg_agesmallint)
4.将学生95001的年龄改为22岁。
updatestudent
setsage=22
wheresno='95001'
5将所有学生的年龄增加一岁
updatestudent
setsage=sage+1
--6将计算机科学系全体学生的成绩置零。
updatesc
setgrade=0
视图
1.建立信息系学生的视图
createviewIS_student
as
selectsno,sname,sage
fromstudent
wheresdept='IS'
2.建立信息系学生的视图,并要求进行修改和插入操作时仍须保证该视图只有信息系的学生。
createviewIS_student
as
selectsno,sname,sage
fromstudent
wheresdept='IS'
withcheckoption
3.建立信息系选修了’1’号课程的学生视图
createviewIS_s1(sno,sname,grade)
as
selectstudent.sno,sname,grade
fromstudent,sc
wheresdept='IS'and
sc.sno=student.snoand
sc.sno='1'
出现问题:
在使用查询分析器时,没有相应改变路径使得操作无法正确执行!
一开始刚刚使用SQL2000时,因为对其查询语言不太熟悉,所以会出现那一些语法错误和使用错误,
实验三数据控制(安全性部分)
《数据库系统概论》实验报告
题目:
数据控制(安全部分)
姓名
刘忠梅
日期
2012-6-20
实验内容完成情况:
(注明源程序的名字)
1.授权,建立多个用户,给他们赋予不同的权限,然后查看是否真正拥有被授予的权限。
建立用户U1、U2、U3、U4、U5、U6、U7,选择全部为CONNECT角色。
在SYSTEM与七个用户之间进行授权。
再授权之后验证用户是否有了相应的权限。
GRANTSELECT
ONTABLESTDUENT
TOU1;
2.回收权限。
将权限部分收回,检查回收后,该用户是否真正失去了对数据的相应权限。
可将权限授予用户U5时,允许该用户将权限在授予给其他用户之后再将权限授予U6,将用户U5的权限收回时必须级联收回。
否则系统将拒绝执行该命令。
REVOKEUPDATE(SNO)
ONTABLESTDUFROMU4;
出现的问题:
删除不了用户组G1
解决方案(不能解决的将问题列出):
只有在当前数据库上拥有DBA权限或拥有想用权限的用户才能够删除用户。
实验四数据控制(完整性部分)
《数据库系统概论》实验报告
题目:
数据控制
姓名
刘忠梅
日期
2012-6-19
关系模型的实体完整性在CREATETABE中庸PRIMARYKEY定义。
定义主码方法分为定义为列级约束条件和定义为表级约束条件两种。
CREATETRIGGERTRIBEFOREUPDATEORINSERTONTAB
FOREACHROW
ASBEGIN
IFnew.col>100ANDnew.col<1000THEN
new.col:
=50;
ENDIF;
IFnew.col>1000THEN
RAISEEXCEPTION'Newvaluescannotbemorethan1000';
ENDIF;
END;替换为:
CREATETRIGGERTRI
ONTAB
FORUPDATE,INSERT
AS
DECLARE@colINT
IF(SELECTcolFROMinserted)>1000
BEGIN
PRINT'Newvaluescannotbemorethan1000'
BEGIN
UPDATETABSETcol=50
WHERE(colBETWEEN100AND1000)
END
ELSE
BEGIN
UPDATETABSETcol=50
WHERE(colBETWEEN100AND1000)
END
ROLLBACKTRANSACTION
END
ELSE
BEGIN
UPDATETABSETcol=50
WHERE(colBETWEEN100AND1000)
END
出现的问题:
对表中的数据进行更新,将20更新为1500
系统报出NEWVALUESCANNOTMORETHAN1000的错误
解决方案(不能解决的将问题列出):
对表进行查询后发现,表中的数据并没有发生改变。
说明在更新数据时,只大于1000,则触发器TRI自动执行,系统报错,更新无效。
实验九查询优化
《数据库系统概论》实验报告
题目:
查询优化
姓名
刘忠梅
日期
2012-6-20
实验内容完成情况:
(注明源程序的名字)
单表查询:
(1)查询Student表中20岁以上学生的信息
SELECT*FROMSTUDENTWHERESage>20
表查询
(1)查询选修了2号课程的学生姓名
(2)查询没有选修1号课程的学生姓名
CREATETABLECourse
(CNOCHAR(7)PRIMARYKEY,
CNAMEVARCHAR(50),
CREDITINT
)
GO
CREATETABLEStudent
(SNOCHAR(8)PRIMARYKEY,
SNAMECHAR(8),
SSEXCHAR
(2),
SAGEINT,
SDEPTVARCHAR(50)
)
GO
出现的问题:
多表查询
【例5】嵌套查询(表元组数少)
[例5-1]查询选修了2号课程的学生姓名。
SELECTSname
FROMStudent
WHERESnoIN
(SELECTSno
FROMSC
WHERECno=‘2’);
嵌套查询(表元组数多
查询选修了2号课程的学生姓名。
SELECTname
FROMSTU
WHEREnumIN
(SELECTs_num
FROMS_C
WHEREc_num=‘2’);
查询计划:
QUERYPLAN
解决方案(不能解决的将问题列出):
在STU表上使用了索引,因为STU表的元组数足够大,系统在分析后选择了代价
较小的索引查找方法。
这个例子产生的查询计划是一个嵌套循环,并且是将选择完后的S_C表作为外表对STU
表进行循环扫描。
这样做的原因是对S_C进行过滤之后,产生的中间结果元组数不比STU表