数据库原理实验报告 下载本文

《数据库原理》

实 验 报 告

学号: 541013100256 姓名: 张浩鹏 专业班级: 软件工程(java技术)

java10-02班

指导教师: 宋胜利

郑州轻工业学院软件

时间:2012年12月12日星期三

目 录

一、实验内容及要求 ..................................................................................... 错误!未定义书签。 二、实验目的 ................................................................................................................................... 4 三、Microsoft SQL Server 2008实验 ............................................................................................. 5

实验一 数据库创建 ................................................................................................................. 5 实验二 创建表 ......................................................................................................................... 8 实验三 创建数据完整性 ....................................................................................................... 12 实验四 数据完整性实验 ....................................................................................................... 18 实验五 索引 ........................................................................................................................... 26 实验六 更新数据 ................................................................................................................... 32 实验七 Sql 查询语句 ........................................................................................................... 34 实验八 视图 ........................................................................................................................... 47 实验九 安全性控制实验 ....................................................................................................... 54 实验十 存储过程 ................................................................................................................... 55 实验十一 触发器 ................................................................................................................... 59 实验十二 恢复技术 ............................................................................................................... 59 实验十三 事务 ....................................................................................................................... 66 实验十四 锁 ........................................................................................................................... 68 四、实验体会 ................................................................................................................................. 71

2

一、实验内容及要求

实验一 数据库创建

要求:1 创建数据库 2 修改数据库 3 删除数据库

实验二 创建表

要求:1 创建表 2 修改表结构 3 删除表

实验三 创建数据完整性

要求:1 能建立完整性约束 2 修改完整性约束 3 删除完整性约束

实验四 数据完整性实验

要求:记录实验中遇到的问题,并写出原因。

实验五 索引

要求:建索引

实验六 更新数据

要求:更新数据

实验七 Sql 查询语句

要求:Sql查询语句

实验八 视图

要求:建视图

实验九 安全性控制实验

要求:会安全性控制

实验十 存储过程

要求:建存储过程

实验十一 触发器

要求:建触发器

实验十二 恢复技术

要求:会数据库恢复技术

实验十三 事务

要求:会处理事务

实验十四 锁

要求:会建立锁

3

二、实验目的

实验一 数据库创建

1掌握利用SQL语言进行数据库的创建、维护。 2 sp_helpdb 命令

实验二 创建表

1 掌握利用SQL语言创建表的方法。 2 sp_help 命令

实验三 创建数据完整性

1掌握创建数据完整性约束的命令。 2 掌握完整性约束的修改、删除。

实验四 数据完整性实验

1理解实体完整性、参照完整性、用户自定义完整性的作用 2 特别掌握外码的作用。

实验五 索引

掌握索引的建立、删除的方法。

实验六 更新数据

掌握insert,update ,delete 语句的使用。

实验七 Sql 查询语句

掌握 Select 查询语句。

实验八 视图

掌握视图的建立、使用。

实验九 安全性控制实验

掌握Sql-server 的授权机制.

实验十 存储过程

掌握存储过程的概念、编程及使用

实验十一 触发器

了解触发器的机制及编程设计、使用

实验十二 恢复技术

1 掌握数据库的备份及恢复的方法。 2 了解备份方案的设定

实验十三 事务

1 掌握并理解事务

实验十四 锁

1 理解锁的概念及锁的作用

4

三、实验步骤及运行结果

实验一 数据库创建

一 建立school 数据库

1 Create database school;

刷新左边的数据库即可看到建立的school数据库

2 用sp-helpdb查询数据库school的信息

5

二 删除School数据库

1 使用查询分析器删除数据库 school DROP DATABASE school

刷新后可看到已创建的数据库school已被删除

2 使用SQL-Server 的企业管理器删除数据库 school 。

三 create Database 深入研究

6

1 建立school数据库,要求数据库存储在D:\\sqldata文件夹下,初始大小为5MB ,增量为 1MB。

CREATE DATABASE school ON( Name = ‘school_dat’,

Filename =’ D:\\sqldata \\school.mdf’, SIZE = 5,

FILEGROWTH = 1 )

刷新数据库可看到school数据库

7

实验二 创建表

一 写出使用 Create Table 语句创建表 student, SC,course 的SQL语句。

学生表、课程表、选课表属于数据库 School ,其各自得数据结构如下: 学生 student (Sno,Sname,Ssex,Sage,Sdept)

序号 列名 含义 数据类型 长度 1 Sno 6 学号 字符型(char) 2 Sname 8 姓名 字符型(varchar) 3 Ssex 2 性别 字符型(char) 4 Sage 年龄 整数 (smallint) 5 sdept 15 系科 字符型(varchar)

课程表 course(Cno,Cname,Cpno,Ccredit)

序号 列名 含义 数据类型 长度 1 Cno 4 课程号 字符型(char) 2 cname 20 课程名 字符型(varchar) 3 Cpno 4 先修课 字符型(char) 4 Ccredit 学分 短整数 (tinyint) 学生选课 SC(Sno,Cno,Grade)

序号 列名 含义 数据类型 长度 1 Sno 4 学号 字符型(char) 2 Cno 6 课程名 字符型(char) 3 Grade 12,1 成绩 小数(decimal)

二 要执行的Sql语句。

create table student ( Sno char(6) , Sname char(10) , Ssex char(2) , Sage smallint , Sdept char(10) , )

create table course( Cno char(4) , Cname char(16) , Cpno char(4) , Ccredit int, )

create table SC( Sno char(6), Cno char(4) , Grade int )

8

四 利用 sql 语句表结构修改

Alter table student add address varchar(60); Alter table student add inDate datetime; 使用sp_help进行查看:

9

alter table student alter column address varchar(50); 使用sp_help查看结果:

alter table student drop column inDate;

分别删除表sc、student、course

drop table sc;

drop table student;

drop table course;

10

11

实验三 创建数据完整性

一 写出带有完整性约束的 Create Table 命令建立表student、course、SC 。要求:

1 Student表的主码:Sno student 的约束:

? 姓名不可为空,且唯一

? 性别 不能为空且取值范围为{男,女} ? 年龄大于16岁

? Sdept 默认为 ?JSJ? 系

2 Course表的主码:Cno course 的约束:

? Ccredit 取值范围{ 0 ,1,2,3,4,5 }

? 课程表的每一行的 Cno 与 cpno 不可相同

3 SC表的主码:Sno,Cno 。主码名为 PK_SC

Sc的外码:

? 外码:SC 表的Sno 参照表 student 的Sno ? 外码:SC 表的Cno 参照表 course 的Cno

4 把上述创建表的sql 语句的脚本存储到文件 createSchool.sql 。 create table student ( Sno char(6) ,

Sname char(10) not null unique ,

Ssex char(2) check (ssex='男' or ssex='女') , Sage smallint check(sage>16) ,

Sdept char(10) not null default 'JSJ' ,

primary key (Sno) )

create table course( Cno char(4) , Cname char(16) , Cpno char(4) ,

Ccredit int check (Ccredit >=0 and Ccredit<=5),

check( Cno<>Cpno) , --约束 primary key (Cno) )

create table SC( Sno char(6), Cno char(4) ,

Grade int check(grade<=100) ,

constraint pk_sc primary key (Sno,Cno), foreign key (Sno) references student(Sno) , foreign key (Cno) references course(Cno) , )

12

二 使用 SP_HELP 查看表 student 的主码名,约束名,并记录。

记录结果为:

主码名:PK__student__7C8480AE(sno)

约束名:CK__student__sage__7F60ED59([sage]>(16))

CK__student__ssex__7E6CC920 ([ssex]='男' OR [ssex]='女') DF__student__sdept__00551192 ('JSJ') PK__student__7C8480AE (sno) UQ__student__7D78A4E7(sname)

1、删除sc的主码

alter table sc drop pk_sc;

13

删除sc表参照表course表的外码的名字。 先找到course表的外码名 sp_help course;

school.dbo.sc: FK__sc__cno__08EA5793 alter table sc drop FK__sc__cno__08EA5793;

14

添加sc表的主码

alter table sc add constraint pk_sc primary key(sno,cno);

添加sc表的cno的外码

alter table sc add foreign key (cno) references course(cno);

15

加自定义约束:表sc的成绩只能在0-100分之间。

alter table sc add check(grade>=0 and grade<=100);

四 使用 Sql-Server 企业管理器完成:

1 删除 SC 表参照 course 表的外码。

2 建立 SC 表的Cno 的外码 ,参照表Course的Cno. *使该外码具有级联修改的功能。

3 删除表 SC的成绩只能在 0 – 100分之间的约束.

3加自定义约束:表 SC的成绩只能在 0 – 100分之间。

16

五 使用

select * from student 查看信息 select * from course 查看信息 select * from SC 查看信息

17

实验四 数据完整性实验

1、向student表中输入数据

insert into student (

sno,sname,ssex,sage,sdept)

values ('3001','赵达','男','20','SX');

插入第二条记录:

insert into student (

sno,sname,ssex,sage,sdept)

values ('3002','杨丽','女','21','JSJ');

插入第三条记录:

insert into student (

sno,sname,ssex,sage,sdept)

18

values ('3001','李寅','女','21','SX');

发现消息框提示错误:第三行不能输入,student的主码为sno,因此,sno列的值不能重复。

用select语句对表student进行查询,发现只插入了前两条记录,由于第三条记录违反了主码唯一性,所以插入失败。截图如下:

insert into sc( sno,cno,grade)

values('3001','1081','79');

截图如下:

19

由上图可知有错,原因是:sc表的主码为:sno,cno,主码名为:PK_SC,违反了PRIMARY KEY唯一性,因此不能插入重复值,提示错误。 用户自定义完整性约束: Student表数据的输入: 插入第一条记录:

insert into student(

sno,sname,ssex,sage,sdept)

values('3005','赵达','男','14','SX');

截图如下:

20

由上图可知出错,原因:违反了用户自定义约束:年龄规定为大于16,而这里插入的是14(<16),所以插入失败,提示错误。 插入第二条记录:

insert into student(

sno,sname,ssex,sage,sdept)

values('3006','杨丽','南','21','JSJ');

截图如下:

由上图可知插入失败,原因:违反了用户自定义完整性约束:性别不能为空且取值范围为{男,女},

而此处的性别为南不等于男,所以插入失败,提示错误。 用select语句查询插入的记录数:

select * from student;

截图如下:

21

Course表数据的输入: 第一条记录:

insert into course(

cno,cname,cpno,ccredit)

values('1085','c++','','9');

截图如下:

由上图可知插入失败,原因是:违反了course表的自定义约束:ccredit取值范围{0,1,2,3,4,5},而这里插入的ccredit为6,不属于ccredit规定的取值范围,所以插入失败,给出提示信息。

22

第二条记录:

insert into course(

cno,cname,cpno,ccredit)

values('1086','语文','1086','3');

截图如下:

由上图可知插入失败,原因:违反了表course的自定义约束:课程表的每一行的cno与cpno不可相同,而这里插入的cno:1086=cpno:1086,所以插入失败,给出提示信息。 用select语句查询看成功插入了几条语句:

select * from course;

截图如下:

23

由上图可知成功插入了一条记录。 Sc表数据的输入:

insert into sc( sno,cno,grade)

values('3002','1081','128');

截图如下:

由上图可知插入失败,原因:grade不能大于100分,而这里是128(>100),所以插入失败。

在sc表中添加新行:

24

insert into sc( sno,cno,grade)

values('4001','1066','76');

添加失败,原因:cno是外码,参照course表的cno,但在course表中没有1066的课程号。

25

实验五 索引

1、创建索引

建student的索引:为姓名建立索引,索引名:ix_student_sname 为系科建立索引,索引名:ix_student_sdept

create index ix_student_sname on student(sname);

创建索引成功。

create index ix_student_sdept on student(sdept);

26

创建索引成功。 Sc的索引

为课程号建立索引:ix_sc_cno create index ix_sc_cno on sc(cno);

创建索引成功。 Course的索引

为课程名建立唯一性索引:ix_course_cname

create unique index ix_course_cname on course(cname);

27

创建索引成功。

用sp_help分别查看表student,sc,course所创建的索引。 sp_help student;

sp_help sc;

28

sp_help course;

删除course表的索引ix_course_cname

drop index course.ix_course_cname;

29

把索引ix_student_sname修改为唯一性索引。 步骤:

1、先删除索引ix_student_sname:

drop index student.ix_student_sname;

1、建唯一性索引ix_student_sname:

create unique index ix_student_sname on student(sname);

30

31

实验六 更新数据

一 insert

1 写出把下述学生的信息添加到student表中的命令。 学号 姓名 性别 年龄 系科 4001 20 SX 赵茵 男 4002 21 杨华 女 Insert into student (sno,sname,ssex,sage,sdept) values (?4001 ?,?赵茵?,?男?,20,? SX?) Insert into student (sno,sname,ssex,sage) values (?4002 ?,?杨华?,?女?,21)

2 批量插入数据

1) 建立一个新表 sc_name ,有属性 sno , sname , ssex , cno , grade 。 CREATE TABLE sc_name ( Sno char(6) , Sname varchar(20), Ssex char(2) , Cno char(4) , Grade int )

2) 把 SX 系学生的sno,sname,ssex, cno , grade 插入到表 sc_name 中。 Insert into sc_name(Sno,Sname,Ssex,Cno,Grade) select student.Sno,Sname,Ssex,Cno,Grade from student,SC where student.Sno = SC.Sno and Sdept = 'SX' 3) 察看 sc_name 表的数据 select * from sc_name

32

二 Update

1 修改3001 学生的系科为: JSJ

Update student set Sdept = 'JSJ' where Sno = '3001'; 2 把陈小明的年龄加1岁,性别改为女。

Update student set sage=sage+1 , ssex=?女? where sname=?陈小明? 3 修改杨华的1081课程的成绩为 93 分

update SC set Grade = 93 where Cno = '1081' and Sno in( select Sno from student where Sname = '杨华' )

4 把“数据库原理”课的成绩减去1分

update SC set Grade = Grade-1 where Cno in(

select Cno from course where Cname = '数据库原理' )

三 Delete

1 删除所有 JSJ 系的男生 delete from student where sdept=?JSJ? 2 删除“数据库原理”的课的选课纪录

delete from SC where Cno in (select Cno from course where Cname = '数据库原理')

33

实验七 Sql 查询语句

一 单表

1查询年龄在19至21岁之间的女生的学号,姓名,年龄,按年龄从大到小排列。 select Sno,Sname,Sage from student

where Sage between 19 and 21 and Ssex = '女' order by Sage desc; 2查询姓名中第2个字为“明”字的学生学号、性别。

select COUNT(*) from student where Sname like '_明%'; 3查询 1081课程没有成绩的学生学号、课程号

select Sno,Cno from SC where Grade is null and Cno = '1081' 4查询JSJ 、SX、WL 系的学生学号,姓名,结果按系及学号排列

select Sno,Sname from student where Sdept in ('JSJ','SX','WL') order by Sdept,Sno

5按10分制查询学生的sno,cno,10分制成绩

(1-10分 为1 ,11-20分为2 ,30-39分为3,。。。90-100为10) select Sno , Cno , Grade/10.0+1 as level from SC

6查询 student 表中的学生共分布在那几个系中。(distinct) select distinct Sdept from student

7查询3001号学生1081,1082课程的成绩。

Select Grade from SC where Sno='3001' and (Cno='1081' or Cno='1082')

二 统计

1查询姓名中有“明”字的学生人数。

select COUNT(*) from student where Sname like '%明%'; 2计算‘JSJ’系的平均年龄及最大年龄。

Select avg(Sage) , max(Sage) from student Where Sdept='JSJ'

34

3计算每一门课的总分、平均分,最高分、最低分,按平均分由高到低排列 select Cno,sum(Grade),avg(Grade),max(Grade),min(Grade) from SC group by Cno

order by avg(Grade) desc

4 计算 1081,1082 课程的平均分。

Select Cno , avg(Grade) from SC where Cno in ('1081','1082') Group by cno

35

5 查询平均分大于80分的学生学号及平均分 select SC.Sno , avg(Grade) from SC group by SC.Sno

having avg(Grade)>80

6 统计选修课程超过 2 门的学生学号

select Sno from SC group by Sno having count(*)>2

7 统计有10位成绩大于85分以上的课程号。 Select Cno from SC where Grade>80

36

group by Cno having count(*) =2

8 统计平均分不及格的学生学号 select Sno from SC

group by Sno having avg(Grade)<60

9 统计有大于两门课不及格的学生学号 select Sno from SC where Grade<60 group by Sno having COUNT(*)>2

三 连接

1查询 JSJ 系的学生选修的课程号

select Cno from student,SC where student.Sno = SC.Sno and Sdept = 'JSJ'

37

2查询选修1081 课程的学生的学生姓名 (不用嵌套及嵌套2种方法)

a: select Sname from Student,SC where student.Sno = SC.Sno and Cno = '1081' b: select Sname from student where Sno in (select Sno from SC where Cno = '1081')

3查询数据库原理不及格的学生学号及成绩 select sno,grade from sc ,course

where sc.cno=course.cno and cname=’数据库原理’

4查询选修“数据库原理”课且成绩 80 以上的学生姓名(不用嵌套及嵌套2种方法) a: select Sname from student,SC,course

38

where student.Sno = SC.Sno and SC.Cno = course.Cno and Grade>80 and Cname = '数据库原理'

b:select Sname from student where Sno in(select Sno from SC where Grade>80 and Cno in(select Cno from course where Cname = '数据库原理') )

5查询平均分不及格的学生的学号,姓名,平均分。

select student.Sno,MAX(Sname),AVG(Grade) as avggrade from SC,student where student.Sno=SC.Sno group by student.Sno having AVG(Grade)<80

39

6查询女学生平均分高于75分的学生姓名。

A: select Sname from student where Ssex ='?' and Sno in( select Sno from SC group by Sno having AVG(Grade)>75 )

B: Select max(sname ) from sc,student where student.sno=sc.sno and Ssex=’女’ Group by student.sno having avg(grade)>75

7查询男学生学号、姓名、课程号、成绩。(一门课程也没有选修的男学生也要列出,不能遗漏)

select student.Sno,Sname,Cno,Grade from student left join SC ON student.Sno = SC.Sno and Ssex = '男'

40

四 嵌套、相关及其他

1 查询平均分不及格的学生人数

select COUNT(*) from student where Sno in(

select Sno from SC group by Sno having AVG(Grade)<60 )

2 查询没有选修1002 课程的学生的学生姓名

41

select Sname from student where Sno not in( select Sno from SC where Cno = '3001' )

3 查询平均分最高的学生学号及平均分 (2种方法 TOP , any , all)

a: select top 1 Sno,avg(Grade) from SC group by Sno order by avg(Grade) desc B: select Sno,avg(Grade) from SC group by Sno

having avg(Grade) = (select top 1 avg(Grade) from SC group by Sno order by avg(Grade) desc ) c: select Sno,avg(Grade) from SC group by Sno

having avg(Grade) >=all ( select avg(Grade) from SC group by Sno )

42

*4 查询没有选修1001,1002课程的学生姓名。

Select Sname from student where not exists (

Select * from course where Cno in ('3001','3002') and

Not exists ( select * from SC where Sno=student.Sno and Cno=course.Cno ) )

5 查询1002课程第一名的学生学号(2种方法)

select top 3 Sno from SC group by Sno order by avg(Grade) desc

6 查询平均分前三名的学生学号

select top 3 sno from sc group by sno order by avg(grade) desc

43

7 查询 JSJ 系的学生与年龄不大于19岁的学生的差集

a: select * from student where Sdept='JSJ' and Sage>19 b: select * from student where sdept='JSJ' except select * from student where sage<19

8 查询1001号课程大于90分的学生学号、姓名及平均分大于85分的学生学号、姓名 select student.Sno,Sname from student,SC where Cno='1081' and Grade>90 union select Sno,Sname from student where Sno in( select Sno from SC group by Sno having AVG(Grade)>85 )

44

9 查询每门课程成绩都高于该门课程平均分的学生学号 select Sno from student where Sno not in ( select Sno from SC X where Grade < (

select avg(Grade) from SC where Cno=X.Cno ) )

select sno from student where sno not in (

select sno from sc X where grade < (

select avg(grade) from sc where cno=X.cno ) )

10 查询大于本系科平均年龄的学生姓名 select Sname from student X where Sage > ( select avg(Sage) from student y where Sdept=x.Sdept )

45

46

实验八 视图

建立学生学号、姓名、性别、课程号、成绩的视图v_sc,并且查看v_sc中的数据。

create view v_sc(sno,sname,ssex,cno,grade) as(select student.sno,sname,ssex,cno,grade from student,sc

where student.sno=sc.sno );

创建视图成功。

select * from v_sc;

47

查询成功,共有14条记录.

建立学生学号、姓名、出生年月的视图v_age,并且查看v_age中的数据。

create view v_age(sno,sname,sbirth)

as select sno,sname,2008-sage from student;

创建成功。

select * from v_age;

48

查询成功,共有12条记录.

建立’JSJ’系的学生学号、姓名、性别、年龄的视图V_JSJ

create view V_JSJ(sno,sname,ssex,sage) as select sno,sname,ssex,sage from student where sdept='JSJ';

建立视图成功。

建立每门课程的平均分的视图v_average

create view v_average(cno,grade1)

49

as select cno,avg(grade) from sc group by cno;

建立视图成功。

将视图V_JSJ中赵顺的年龄改为21岁.

update V_JSJ set sage=sage+1

where sname='赵顺';

查询成功.

50