东北大学数据库实验报告.docx
- 文档编号:9499317
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:48
- 大小:4.12MB
东北大学数据库实验报告.docx
《东北大学数据库实验报告.docx》由会员分享,可在线阅读,更多相关《东北大学数据库实验报告.docx(48页珍藏版)》请在冰豆网上搜索。
东北大学数据库实验报告
东北大学数据库实验报告2016
实验
(一):
熟练掌握SQL语言
实验目的:
熟悉上机环境,创建数据库,在数据库上建立关系模式,插入数据,进行相应的查询操作。
实验内容:
具体包括如下三部分。
一、熟悉上机环境。
客户/服务器结构,数据库服务器在一台NT服务器上,同学们通过客户机(操作系统为Windows2000)上安装的SQLServer客户端程序,使用SQLServer数据库服务器。
具体包括:
1.了解SQLServer环境。
鼠标点击开始,进入“MicrosoftSQLServer→企业管理器”,点击SQLServer组下的数据库服务器(服务器名称为NEUC-201S(WindowsNT)),可以看到服务器上的圆形标志变为绿色,说明客户端程序已与服务器连接成功。
点击服务器(NEUC-201S(WindowsNT))下的数据库,可以看到服务器上已建立的数据库,你可访问你有权访问的数据库,并进行相应的操作功能。
因为,数据库服务器上建有许多数据库,每个数据库都有一些合法的用户。
2.鼠标点击开始,进入“MicrosoftSQLServer→查询分析器”,输入用户名和口令,进入SQL查询分析器。
如:
你登录的客户机为27号,那么请以用户名user27,口令为user27登录,登录后缺省连到数据库user27上,user27/user27是数据库user27的创建者,因此用户user27/user27具有在数据库user27上创建表等一切权力。
3.在SQL查询分析器环境下,你就可进行SQL命令语句操作了。
二、在数据库useri上创建学生选课有关关系模式,并插入相应的数据,实现有关查询。
1.描述学生、课程情况的E-R图如下,请将其转化为用关系数据模型描述的关系模式
学生
课程
选修
学号
姓名
年龄
所在系
成绩
课号
课程名
学时
学分
先行课号
2.在数据库中定义这些关系模式,并向基本表中插入如下数据:
CREATEtableStudents
(Snochar(10)primarykey,
Snamechar(20),
Sageint,
sdeptchar(20))
createtableCourses
(Cnochar(4),
Cnamechar(40),
Ccreditint,
Ctimeint,
Cpnochar(4),
primarykey(cno),
Foreignkey(Cpno)referencesCourses(Cno))
createtableSC
(Snochar(10),
Cnochar(4),
Gradeint,
primarykey(Sno,Cno),
foreignkey(Sno)referencesStudents(Sno),
foreignkey(Cno)referencesCourses(Cno))
insertintoCoursesvalues('0001','C语言',4,60,null)
insertintoCoursesvalues('0002','C++语言',4,60,null)
insertintoCoursesvalues('0003','JAVA',4,60,null)
insertintoCoursesvalues('0004','数据结构',4,60,null)
insertintoCoursesvalues('0005','高数',4,60,null)
insertintoCoursesvalues('0006','离散数学',4,60,null)
insertintoCoursesvalues('0007','计算原理',4,60,'0005')
insertintoCoursesvalues('0008','算法设计',4,60,null)
insertintoCoursesvalues('0009','文本',4,60,null)
insertintoCoursesvalues('0010','信息安全',4,60,'0009')
3.插入相应的数据,试着插入重复的元组,结果如何?
插入相同数据
不能插入重复数据
4.在已建立的关系模式之上(已插入一些数据)建立主键约束,参照约束和用户定义的约束(要求学生年龄不小于14岁,不大于35岁),如果约束不能建立,请分析原因,修改后建立上述约束。
altertableStudentsaddcheck(Sage>=14andSage<=35)
altertableStudentsaddprimarykey(Sno)不能建立
5.如果约束建立后,请试着插入重复元组,结果如何?
试着插入重复元组,无法插入:
实验
(二):
熟练掌握SQL语言
insertintoCoursesvalues('0000','C1',4,60,null)
insertintoCoursesvalues('0001','C语言',4,60,null)
insertintoCoursesvalues('0002','C++',4,60,null)
insertintoCoursesvalues('0003','JAVA',4,60,null)
insertintoCoursesvalues('0004','数据结构',4,60,null)
insertintoCoursesvalues('0005','高数',4,60,null)
insertintoCoursesvalues('0006','离散',4,60,null)
insertintoCoursesvalues('0007','数据库',4,60,'0005')
insertintoCoursesvalues('0008','算法设计',4,60,null)
insertintoCoursesvalues('0009','文本智能处理',4,60,null)
insertintoCoursesvalues('0010','信息安全',4,60,'0009')
insertintoCoursesvalues('0011','C2',4,60,'null')
用SQL完成下列查询
1.求选修了课程的学生的学号,要求:
(1)不使用distinct语句,消除重复元组,写出其SQL语句
SelectSnofromSC
(2)使用distinct语句,消除重复元组,写出其SQL语句
selectdistinctSnofromSC
(3)如果该查询写成:
selectStudents.SnofromStudents,SCwhereStudents.Sno=SC.Sno
请问该查询结果和上面哪个结果是相同的?
和1相同
2.求开设的课程号、课程名、学时和学分,要求对查询结果的列重新命名。
selectCnoMyCno,CnameMyCname,CtimeMyCtime,CCreditMyCredictfromCourses
3.求计算机系和数学系的学生学号、姓名和年龄。
selectSno,Sname,SagefromStudentswhereSdept='计算机'orSdept='数学'
4.求不是数学系、计算机系的学生的情况,要求select后写*代替列出所有的列名。
select*fromStudentswhereStudents.Sdept!
='数学'andStudents.Sdept!
='计算机'
5.求全体学生的信息,要求按年龄升序排列。
select*fromStudentsorderbySageasc
6.求计算机系年龄在18~20岁之间的学生姓名和年龄
selectSname,SagefromStudentswhereSage>=18andSage<=20andSdept='计算机'
7.求姓名是以老开头的计算机系学生。
select*fromStudentswhereSnamelike'老%'andSdept='计算机'
8.求选修了C1课程的学生的学号、姓名、成绩。
selectStudents.Sno,Students.Sname,SC.GradefromStudents,SC,CourseswhereSC.Sno=Students.SnoandSC.Cno=Courses.CnoandCourses.Cname='C1'
9.求学号为95开头的学生的学号和所选修的课程的学分。
selectStudents.Sno,Courses.Cname,Courses.CCreditfromStudents,SC,CourseswhereStudents.Snolike'95%'andStudents.Sno=SC.SnoandSC.Cno=Courses.Cno
10.求选修C1课程且成绩为80分以上的学生的学号、姓名和成绩。
selectStudents.Sno,Students.Sname,SC.GradefromStudents,SC,CourseswhereStudents.Sno=SC.SnoandSC.Cno=Courses.CnoandCourses.Cname='C1'andSC.Grade>80
11.求计算机系每个学生的姓名,选修的课程名和成绩。
selectStudents.Sname,Courses.Cname,SC.GradefromStudents,SC,CourseswhereStudents.Sdept='计算机'andStudents.Sno=SC.SnoandSC.Cno=Courses.Cno
12.求每个学生的学号及平均成绩。
selectSno,AVG(Grade)AvgGradefromSCgroupbySno
13.求男学生每一年龄组中超过1人的年龄组及人数。
selectSage,Count(Sno)countSnofromStudentsgroupbySagehavingCount(Sno)>1
14.求每一门课程的间接先行课号。
selectC1.Cno,C2.CpnofromCoursesC1,CoursesC2whereC1.Cpno=C2.Cno
15.求选修了全部课程的学生的学号。
selectSnofromStudentswherenotexists(select*fromCourseswherenotexists(select*fromSCwhereSno=Students.SnoandCno=Courses.Cno));
实验(三):
数据库的安全性和完整性
实验目的:
了解和使用安全子系统;进行完整性定义和检查。
实验内容:
具体包括如下三部分。
一熟练掌握SQL(续)
1.修改表Students,在其中加入一个字段性别sexchar
(1)
altertableStudentsaddsexchar
(1);
2.创建索引:
在Students表的Sno上创建唯一聚簇索引,在SC表的(Sno,Cno)上创建唯一索引.查询Students表的内容,记录的顺序有变化吗?
查询SC表的内容,记录的顺序有变化吗?
CreateuniqueclusteredindexStudent_snoonStudents(Sno);
CreateuniqueindexSno_cnoonSC(Sno,Cno);
Students表的内容,记录的顺序有变化
SC表的内容,记录的顺序没有变化
3.创建视图
▪创建计算机系学生视图CS_Students,其中包括学号、年龄和性别。
带withcheckopition子句
不带withcheckopition子句
时各插入一计算机系学生记录,通过视图查询插入的记录,结果如何?
通过表Students查询插入的记录,查看所在系字段上的值?
createviewCS_students1asselectSno,Sage,sexfromStudentswhereSdept='CS'withcheckoption
INSERTINTOCS_students1
VALUES('20133333',19,'m');
createviewCS_students2asselectSno,Sage,sexfromStudentswhereSdept='CS'
INSERTINTOCS_students2
▪创建一视图,表示学生的平均成绩,其中包括Sno,avgGrade。
通过该视图插入一学生姓名和平均成绩,结果如何?
通过该视图查找平均成绩在90分以上的学生的学号和平均成绩,结果又如何?
createviewStuavggrade(sno,avggrade)
asselectSno,avg(Grade)fromSCgroupbySC.sno
InsertintoStuavggrade
selectsno,avggrade
fromStuavggrade
whereavggrade>=90
二了解和使用安全子系统
1、将sqlserver的一合法帐户(user60)加入到你的数据库当中来,并给其授权,
SP_grantdbaccess'user63';
使之:
具有创建表的权限
grantCreatetabletouser63;
具有对Students表查询的权限
grantselectonStudentstouser63;
具有对Studetns表的年龄字段修改的权限
grantupdate(Sage)onStudentstouser63;
2、用user60/user60进入系统,完成权限验证:
在Students表上,实现select*fromStudents
在course表上,实现select*fromcourse
updateStudetnssetSage=Sage+1
updateStudentssetSdept=’CS’
3、你是数据库的dbo,你来查看dept表,结果如何?
使用setuser命令使自己成为user60后,查看dept表,结果如何?
三完整性定义和检查
1、创建表Studetns,要求学生的年龄在16和25岁之间,并且所在系的缺省取值为‘CS’
CREATETABLEStudents
(SnoCHAR(9)notnull,
SnameCHAR(20),
Sdeptchar(20)default'CS',
Sageintcheck(Sage>=16andSage<=25),
Ssexchar
(2)
);
在Studetns表上插入一学生记录(‘9921’,‘cccc’,’MA’,23,’f’)
insertintoStudents(Sno,Sname,Sdept,Sage,Ssex)
values('9921','cccc','MA',23,'f');
在Studetns表上插入一学生记录(‘9922’,‘ddd’,’MA’,27,’m’)
insertintoStudents(Sno,Sname,Sdept,Sage,Ssex)
values('9922','ddd','MA',27,'m');
在Studetns表上插入一学生记录(‘9923’,‘eeeee’,21,’m’)
insertintoStudents(Sno,Sname,Sage,Ssex)
values('9923','eeeee',21,'m');
在Studetns表上插入一学生记录(‘9922’,‘ddd’,’MA’,23,’m’)
insertintoStudents(Sno,Sname,Sdept,Sage,Ssex)
values('9922','ddd','MA',23,'m');
2、创建表course,要求课号作为主键
createtablecourse
(cnochar(10)primarykey,
ctimechar(10),
cnamechar(20),
cscorechar(10)
);
在course表上插入一课程记录(’c9’,40,’cname1’,1)
insertintocourse(cno,ctime,cname,cscore)
values('c9',40,'cname1',1);
在course表上插入一课程记录(’c9’,40,’cname2’,1)
insertintocourse(cno,ctime,cname,cscore)
values('c9',40,'cname2',1);
在course表上插入一课程记录(null,25,’canme3’,2)
insertintocourse(cno,ctime,cname,cscore)
values(null,25,'cname3',2);
3、修改表Studetns,指定学号为主键,然后
ALTERTABLEStudentsADDCONSTRAINTpk_SnoPRIMARYKEY(Sno)
插入一记录(’9908’,’shang’,’CI’,20)
insertintoStudents(Sno,Sname,Sdept,Sage)
values('9908','shang','CI',20);
插入一记录(’9908’,’shang’,’CI’,20)
insertintoStudents(Sno,Sname,Sdept,Sage)
values('9908','shang','CI',20);
插入一记录(’’,’liang’,’CS’,18)
insertintoStudents(Sno,Sname,Sdept,Sage)
values('','liang','CS',18);
插入一记录(’’,’an’,’CS’,19)
insertintoStudents(Sno,Sname,Sdept,Sage)
values('','an','CS',19);
4、创建sc表,要求表sc中的学号参照表Studetns中的学号,sc中的课号参照course中的课号。
参照约束创建完成后,向这三个表插入数据。
createtableSC
(Snochar(9),
Cnochar(10),
Gradeint,
foreignkey(Sno)referencesStudents(Sno),
foreignkey(Cno)referencescourse(cno)
)
先在sc表插入一个选课记录,看看有什么情况发生?
insertintoSC(Sno,Cno,Grade)
values('9922','c9',85);
先删除sc中的某个记录,看看有什么情况发生?
deletefromSCwhereSno='9922';
将Studetns表中的学号9906改为9907,看看有什么情况发生?
updateStudentssetSno='9907'
whereSno='9906';
实验(四):
事务的并发控制
实验目的:
通过实验了解实际系统中,三级封锁协议的实现方法和使用方法,体会加锁操作、死锁检测与解除。
实验内容:
具体分如下五部分。
说明:
(1)Settransactionisolationlevelreaduncommitted
readcommitted
repeatableread
serializable
分别对应隔离级0,1,2,3。
(2)要求两人一组。
1、隔离级1(缺省)方式下体会两事务的并发执行结果。
具体步骤如下(以user1和user2为例):
●user1首先将user2接纳为自己数据库的用户,并授权user2可以查询学生表students
●user1输入并执行下列语句
begintransaction
updatetablestudentssetage=20+1wheresno=’95001’
●user2输入并执行下列语句
begintransaction
select*fromstudentswheresno=’95001’
1)观察发生的现象,user2的语句可以执行吗(是否可以读到别人没有提交的数据)?
不可以
2)user1输入并执行下列语句
commit
观察发生的现象,user2的语句执行了吗?
可以
3)加锁和解锁操作的完成者是数据库用户吗?
●user2输入并执行下列语句
commit
不是,是数据库系统
2、隔离级1(缺省)方式下体会两事务的并发执行结果。
具体步骤如下(以user1和user2为例):
●user1首先将user2接纳为自己数据库的用户,并授权user2可以查询学生表students
●user2输入并执行下列语句
begintransaction
selectagefromstudentswheresno=’95001’
●user1输入并执行下列语句
begintransaction
updatetablestudentssetage=20+1wheresno=’95001’
1)观察发生的现象,user1的语句可以执行吗(是否可以修改别人正在读的数据)?
可以
●user2输入并执行下列语句
selectagefromstudentswheresno=’95001’
2)观察发生的现象,user2的语句执行了吗?
结果如何(是否可重复读)?
user2输入并执行下列语句
commit
●user1输入并执行下列语句
commit
不执行
3、在隔离级0方式下体会两事务的并发执行结果。
具体步骤如下(以user1和user2为例):
●user1首先将user2接纳为自己数据库的用户,并授权user2可以查询学生表students
●user1输入并执行下列语句
begintransaction
updatetablestudentssetage=20+1wheres
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东北大学 数据库 实验 报告