实验(一): 熟练掌握SQL语言
熟悉上机环境,创建数据库,在数据库上建立关系模式,插入数据,实验目的:进行相应的查询操作。
实验内容:具体包括如下三部分。
一、熟悉上机环境。
客户/服务器结构,数据库服务器在一台NT服务器上,同学们通过客户机(操作系统为Windows 2000)上安装的SQL Server客户端程序, 使用SQL Server数据库服务器。具体包括:
1. 了解SQL Server 环境。鼠标点击开始,进入“Microsoft SQL Server→企
业管理器”,点击SQL Server组下的数据库服务器(服务器名称为NEUC-201S(Windows NT)), 可以看到服务器上的圆形标志变为绿色,说明客户端程序已与服务器连接成功。点击服务器(NEUC-201S(Windows NT))下的数据库,可以看到服务器上已建立的数据库,你可访问你有权访问的数据库,并进行相应的操作功能。因为,数据库服务器上建有许多数据库, 每个数据库都有一些合法的用户。
2. 鼠标点击开始,进入“Microsoft SQL Server→查询分析器”,输入用户名
和口令,进入SQL查询分析器。如:你登录的客户机为27号,那么请以用户名user27,口令为user27登录,登录后缺省连到数据库user27上,user27/user27是数据库user27的创建者,因此用户user27/ user27具有在数据库user27上创建表等一切权力。
3. 在SQL查询分析器环境下,你就可进行SQL命令语句操作了。
二、在数据库useri上创建学生选课有关关系模式,并插入相应的数据,实现有
关查询。
1. 描述学生、课程情况的E-R图如下,请将其转化为用关系数据模型描述的关系模式
2. 在数据库中定义这些关系模式 学号姓名年龄试着插入重复的元3. 插入相应的数据,
学生所在系组,结果如何?
4. 在已建立的关系模式之上(已插入一成绩选修先行课号些数据)建立主键约束,参照约束和用户定义的约束(要求学生年龄不小课程学分于14岁,不大于35岁),如果约束课号课程名学时不能建立,请分析原因,修改后建立上述约束。
5. 如果约束建立后,请试着插入重复元组,结果如何?
实验(二): 熟练掌握SQL语言
用SQL完成下列查询
1. 求选修了课程的学生的学号,要求:
(1) 不用distinct消除重复元组,写出其SQL语句 (2) 用distinct消除重复元组,写出其SQL语句 (3) 如果该查询写成: select Students.Sno from Students, SC where Students.Sno=SC.Sno 请问该查询结果和上面哪个结果是相同的?
2. 求开设的课程号、课程名、学时和学分,要求对查询结果的列重新命名 3. 求计算机系和数学系的学生学号、姓名和年龄 4. 求不是数学系、计算机系的学生的情况,要求select后写*代替列出所有的
列名
5. 求全体学生的信息,要求按年龄升序排列
6. 求计算机系年龄在18~20岁之间的学生姓名和年龄 7. 求姓名时以D开头的数学系学生
8. 求选修了C2课程的学生的学号、姓名、成绩
9. 求学号为95开头的学生的学号和所选修的课程的学分
10. 求选修C1课程且成绩为80分以上的学生的学号、姓名和成绩 11. 求计算机系每个学生的姓名,选修的课程名和成绩 12. 求每个学生的学号及平均成绩
13. 求男学生每一年龄组中超过50人的年龄组及人数 14. 求每一门课程的间接先行课号 15. 求选修了全部课程的学生的学号
实验(三):数据库的安全性和完整性
实验目的:了解和使用安全子系统;进行完整性定义和检查。 实验内容:具体包括如下三部分。
一 熟练掌握SQL(续)
1. 修改表Students,在其中加入一个字段性别sex char(1) 2. 创建索引:在Students表的Sno上创建唯一聚簇索引, 在SC表的(Sno, Cno)
上创建唯一索引. 查询Students表的内容, 记录的顺序有变化吗? 查询SC表的内容, 记录的顺序有变化吗? 3. 创建视图
创建计算机系学生视图CS_Students,其中包括学号、年龄和性别。 带with check opition子句 不带with check opition子句
时各插入一计算机系学生记录, 通过视图查询插入的记录,结果如何?通过表Students查询插入的记录,查看所在系字段上的值?
创建一视图,表示学生的平均成绩,其中包括Sno,avgGrade。通过该视图插
入一学生姓名和平均成绩,结果如何?通过该视图查找平均成绩在90分以上的学生的学号和平均成绩,结果又如何?
二 了解和使用安全子系统
1、将sql server的一合法帐户(user60)加入到你的数据库当中来,并给其授权,使之:
具有创建表的权限
具有对Students表查询的权限
具有对Studetns表的年龄字段修改的权限 2、用user60/user60进入系统,完成权限验证:
创建表dept(sd,mn,addr) 创建视图s_view(Sno,Sage)
在Students表上,实现select * from Students 在course表上,实现select * from course update Studetns set Sage=Sage+1 update Students set Sdept=’CS’
3、你是数据库的dbo,你来查看dept表,结果如何?使用set user命令使自己成为user60后,查看dept表,结果如何?
三 完整性定义和检查
1、创建表Studetns,要求学生的年龄在16和25岁之间,并且所在系的缺省取值为‘CS’
在Studetns表上插入一学生记录(‘9921’,‘cccc’,’MA’,23,’f’) 在Studetns表上插入一学生记录(‘9922’,‘ddd’,’MA’,27,’m’)
在Studetns表上插入一学生记录(‘9923’,‘eeeee’,21,’m’) 在Studetns表上插入一学生记录(‘9922’,‘ddd’,’MA’,23,’m’) 2、创建表course,要求课号作为主键 在course表上插入一课程记录(’c9’,40,’cname1’,1) 在course表上插入一课程记录(’c9’,40,’cname2’,1) 在course表上插入一课程记录(null,25,’canme3’,2) 结果如何?
3、修改表Studetns,指定学号为主键,然后 插入一记录(’9908’,’shang’,’CI’,20) 插入一记录(’9908’,’shang’,’CI’,20) 插入一记录(’’,’liang’,’CS’,18) 插入一记录(’’,’an’,’CS’,19) 结果如何?
4、创建sc表,要求表sc中的学号参照表Studetns中的学号,sc中的课号参照course中的课号。参照约束创建完成后,向这三个表插入数据。
先在sc表插入一个选课记录,看看有什么情况发生? 先删除sc中的某个记录,看看有什么情况发生? 将Studetns表中的学号9906改为9907,看看有什么情况发生?
实验(四):事务的并发控制
通过实验了解实际系统中,三级封锁协议的实现方法和使用方法,体实验目的:
会加锁操作、死锁检测与解除。
实验内容:具体分如下五部分。
说明:
(1)Set transaction isolation level read uncommitted
read committed repeatable read serializable
分别对应隔离级0,1,2,3。 (2)要求两人一组。
1、隔离级1(缺省)方式下体会两事务的并发执行结果。具体步骤如下(以user1和user2为例):
z user1首先将user2接纳为自己数据库的用户, 并授权user2可以查询学生表students
z user1输入并执行下列语句 begin transaction
update table students set age=20+1 where sno=’95001’ z user2输入并执行下列语句 begin transaction
select * from students where sno=’95001’
1) 观察发生的现象, user2的语句可以执行吗(是否可以读到别人没有提交的数据)?
z user1输入并执行下列语句 commit
2) 观察发生的现象, user2的语句执行了吗? 3) 加锁和解锁操作的完成者是数据库用户吗? z user2输入并执行下列语句 commit
2、隔离级1(缺省)方式下体会两事务的并发执行结果。具体步骤如下(以user1和user2为例):
z user1首先将user2接纳为自己数据库的用户, 并授权user2可以查询学生表students
z user2输入并执行下列语句 begin transaction
select age from students where sno=’95001’ z user1输入并执行下列语句 begin transaction
update table students set age=20+1 where sno=’95001’
1) 观察发生的现象, user1的语句可以执行吗(是否可以修改别人正在读的数据)?
z user2输入并执行下列语句
select age from students where sno=’95001’
2) 观察发生的现象, user2的语句执行了吗? 结果如何(是否可重复读)?
z user2输入并执行下列语句 commit
z user1输入并执行下列语句 commit
3、在隔离级0方式下体会两事务的并发执行结果。具体步骤如下(以user1和user2为例):
z user1首先将user2接纳为自己数据库的用户, 并授权user2可以查询学生表students
z user1输入并执行下列语句 begin transaction
update table students set age=20+1 where sno=’95001’ z user2输入并执行下列语句 begin transaction
set transaction isolation level Read Uncommitted select * from students where sno=’95001’
1) 观察发生的现象, user2的语句可以执行吗(是否可以读到别人没有提交的数据)?
z user1输入并执行下列语句 commit
z user2输入并执行下列语句 commit
4、在隔离级1(缺省)方式下体会两事务的并发执行死锁情况。具体步骤如下(以user1和user2为例):
z user1首先将user2接纳为自己数据库的用户, 并授权user2可以修改学生表students和学生选课表sc z user1输入并执行下列语句 begin transaction
update table students set age=age+1 z user2输入并执行下列语句 begin transaction
update table sc set grade=grade+5 z user1输入并执行下列语句 update table sc set grade=grade+5
1) 观察发生的现象, user1的语句可以执行吗? z user2输入并执行下列语句 update table students set age=age+1
2) 观察发生的现象, user2的语句执行了吗? 结果如何? z 在成功执行的窗口输入并执行下列语句 commit
5、在隔离级1(缺省)方式下体会两事务并发执行锁的粒度(锁数据所在页)。具体
步骤如下(以user1和user2为例):
z user1首先将user2接纳为自己数据库的用户, 并授权user2可以查询学生表students(该实验要求表中元组数要足够多, 要求指定关键字约束) z user1输入并执行下列语句 begin transaction
update table students set age=age+1 where sno='95001' z user2输入并执行下列语句 begin transaction
select * from students where sno='95201' 1) 观察发生的现象, user2的语句可以执行吗? z user2输入并执行下列语句 commit
z user1输入并执行下列语句 commit