第一篇:上海应用技术学院实验报告(数据库原理及应用)参考
上海应用技术学院
《数据库原理及应用》课程实验报告
计算机科学与信息工程系·2007年编制
计算机科学与信息工程系·2007年编制
注:空间不够,可以增加页码。计算机科学与信息工程系·2007年编制
第二篇:数据库原理及应用实验报告 6
实验成绩
《数据库系统原理及应用》
实 验 报 告 六
专业班级:
计算机科学与技术
学
号:
201116910233
姓
名:
范晓曈
指导教师:
苏小玲
2013年
月
日 实验六名称:
SQL Server存储过程
一、实验内容及要求
1.使用输入参数存储过程的创建和执行
任务1:查询学生的学号、姓名、选修的课程号、课程名、课程学分,将学生所在系作为输入参数,默认值为“软件工程系”。执行此存储过程,并分别指定一些不同的输入参数值,查看执行过程。
2.修改视图
任务1:查询指定系的男生人数,其中系为输入参数,人数为输出参数。执行此存储过程,并分别指定一些不同的输入参数值,查看执行过程。
任务2:查询指定学生(姓名)在指定学期的选课门数和考试平均成绩,要求姓名和学期为输入参数,选课门数和平均成绩用输出参数返回,平均成绩保留到小数点后两位。
3.使用返回代码存储过程的创建和执行
任务1:查询指定学生(学号)的选课门数。如果指定学生不存在,则返回代码1;如果指定的学生没有选课,则返回代码2;如果指定学生有选课,则返回代码0,并用输出参数返回该学生的选课门数。
4.使用实现对数据库修改、删除和插入操作的存储过程创建和执行
任务1:删除指定学生(学号)的修课,如果指定的学生不存在,则显示提示信息“没有指定学生”;如果指定的学生没有选课,则显示提示信息“该学生没有选课”。学号为输入参数。
任务2:修改指定课程的开课学期。输入参数为:课程号和修改后的开课学期。
任务3:在course表中插入一行数据,课程号、课程名、学分、开课学期均为输入参数。课程号为C100、课程名为操作系统、学分为
4、开课学期为4,开课学期的默认值为3。如果学分大于10或者小于1,则不插入数据,并显示提示信息“学分为1~10之间的整数”。
二、实验目的
掌握存储过程的创建和执行;掌握存储过程中输入参数和输出参数的设置和使用方法。
三、实验步骤及运行结果
1.使用输入参数存储过程的创建和执行
任务1:查询学生的学号、姓名、选修的课程号、课程名、课程学分,将学生所在系作为输入参数,默认值为“软件工程系”。执行此存储过程,并分别指定一些不同的输入参数值,查看执行过程。
create procedure p_studentdept @dept char(20)='计科' as select s.sno,s.sname,c.cno,cname,s.credit from student s inner join sc on s.sno=sc.sno inner join Course c
on c.cno=sc.cno where sdept=@dept
2.修改视图
任务1:查询指定系的男生人数,其中系为输入参数,人数为输出参数。执行此存储过程,并分别指定一些不同的输入参数值,查看执行过程。
create procedure p_numberofBoy @dept char(20),@boynumber int output as select @boynumber=COUNT(*)from Student
where Ssex='男' and sdept=@dept
declare @boynumber int exec p_numberofBoy '计科' ,@boynumber output print @boynumber
declare @boynumber int exec p_numberofBoy '电信' ,@boynumber output print @boynumber
任务2:查询指定学生(姓名)在指定学期的选课门数和考试平均成绩,要求姓名和学期为输入参数,选课门数和平均成绩用输出参数返回,平均成绩保留到小数点后两位。
create proc p_studentInfo @name char(20),@semester int,@count_xk int output,@avg_sscore float output as select @count_xk=count(c.cno),@avg_sscore=Avg(sscore)from Student s join SC
on s.Sno =SC.Sno join Course c
on SC.Cno =c.Cno where s.Sname=@name and c.Semester =@semester
declare @count_xk int,@avg_grade float,@avg_sscore decimal exec p_studentInfo '范晓曈',2,@count_xk output,@avg_sscore output select @count_xk as 选课门数,@avg_sscore as平均成绩
3.使用返回代码存储过程的创建和执行
任务1:查询指定学生(学号)的选课门数。如果指定学生不存在,则返回代码1;如果指定的学生没有选课,则返回代码2;如果指定学生有选课,则返回代码0,并用输出参数返回该学生的选课门数。
create proc p_countxk @number decimal,@xk_number decimal output as if not exists(select Sno from Student where Sno=@number)return 1 else if not exists(select Sno from SC where Sno=@number)return 2 else begin select @xk_number=COUNT(sc.cno)from SC where Sno =@number return 0 End
declare @xk_number1 int exec p_countxk 201116910233,@xk_number1 output print @xk_number1
4.使用实现对数据库修改、删除和插入操作的存储过程创建和执行
任务1:删除指定学生(学号)的修课,如果指定的学生不存在,则显示提示信息“没有指定学生”;如果指定的学生没有选课,则显示提示信息“该学生没有选课”。学号为输入参数。
create proc p_delete @id numeric as if not exists(select * from Student where Sno=@id)return 1 if not exists(select * from SC where SC.Sno=@id)return 2 else return 0
declare @id numeric,@ret int exec @ret=p_delete 201116910232 if @ret =1 print '没有该学生!' if @ret =2 print '该学生没有选课!' if @ret =0 delete from SC where Sno=201116910232
declare @id numeric,@ret int exec @ret=p_delete 201116910222 if @ret =1 print '没有该学生!' if @ret =2 print '该学生没有选课!' if @ret =0 delete from SC where Sno=201116910222
declare @id numeric,@ret int exec @ret=p_delete 201116910211 if @ret =1 print '没有该学生!' if @ret =2 print '该学生没有选课!' if @ret =0 delete from SC where Sno=201116910211
任务2:修改指定课程的开课学期。输入参数为:课程号和修改后的开课学期。
create proc p_alter @kc char(20),@xq int as update course set semester=@xq where cno=@kc declare @kc char(20),@xq int exec p_alter 'C003',3
修改前:
修改后:
任务3:在course表中插入一行数据,课程号、课程名、学分、开课学期均为输入参数。课程号为C100、课程名为操作系统、学分为
4、开课学期为4,开课学期的默认值为3。如果学分大于10或者小于1,则不插入数据,并显示提示信息“学分为1~10之间的整数”。
create proc p_insert @kc_id varchar(20),@kc_name varchar(20),@xf decimal , @xq int as if(@xf >= 1 and @xf <=10)begin insert course(cno,cname,credit,semester)values(@kc_id,@kc_name,@xf,@xq)
end else print
'学分要在1~10之间!!'
declare @kc_id varchar(20),@kc_name varchar(20),@xf decimal,@xq int exec p_insert 'C006','操作系统',3.0,6
declare @kc_id char(20),@kc_name char(20),@xf decimal,@xq int exec p_insert 'C007','毛概',11.0,4
四、实验心得
在这次实验中,我明白了,存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度,存储过程一般用来完成数据查询和数据处理操作。
无论什么时候执行存储过程,总要返回一个结果码,用以指示存储过程的执行状态。如果存储过程执行成功,返回的结果码是0;如果存储过程执行失败,返回的结果码一般是一个负数,它和失败的类型有关。我们在创建存储过程时,也可以定义自己的状态码和错误信息。
通过这次实验,让我深刻了解了数据库的功能,觉得它功能非常的强大,掌握存储过程的创建与执行,熟悉存储过程与批处理的区别。掌握带参数的存储过程的创建与执行。
第三篇:数据库应用基础实验报告
电子科技大学计算机学院实验中心
电 子 科 技 大 学
实
验
报
告
一、实验一: 名称 创建数据库
二、实验学时:4
三、实验内容和目的:
实验要求学生掌握创建数据库的方法及相关操作,并且创建一个包含五个表的数据库STUD:系别代码表 表名dep,教师表 表名teacher,学生表 表名stud,课程表 表名course,选课表 表名sc。
四、实验原理:
本实验主要是“ create table 表名
(列名1 类型1(not)null,列名2 类型2(not)null,……,primary key(列名));”语句的应用,来实现表的建立。同时还可能用到 “drop table 表名”,“alter table 表名 drop column 列名”等语句。
五、实验器材(设备、元器件)
操作系统:Windows 2000/XP 编程环境:SQL Server Management Studio
六、实验步骤:
具体步骤见实验指导书。
七、实验数据及结果分析:
create table COURSE(CID VARCHAR(8)not null,CNAME VARCHAR(30)not null,CID_PRE VARCHAR(8),CREDITS NUMERIC(3,1)not null,primary key(CID));
create table DEP(DEPID VARCHAR(8)not null,DEPNAME VARCHAR(20)not null,primary key(DEPID));create table SC(SID VARCHAR(11)not null,CID VARCHAR(8)not null,TID varchar(8)not null,SCORE INTEGER,primary key(sid,cid,tid));create table STUDENT(SID VARCHAR(11)not null,SNAME VARCHAR(8)not null,sex char(2)not null,DEPID VARCHAR(20),BIRTHD DATETIME,SEMAIL VARCHAR(20),HOMEADDR VARCHAR(40),primary key(SID));create table TEACHER(TID varchar(8)not null,TNAME varchar(8)not null,TITLE VARCHAR(10),DEPID VARCHAR(20),primary key(TID));
八、实验结论:
心得体会和改进建议:确实可以用create table语句实现数据库表的创建,一开始就要想好各个表的分配和各种定义的合理性,避免以后大幅度的改动表。
一、实验二: 名称 备份和恢复
二、实验学时:4
三、实验内容和目的:
向数据库中添加样本数据,学习DB2数据库的恢复和备份。
四、实验原理:
利用分离与附加实现数据的备份与恢复。用“insert into 表名 values(列名1 类型1(not)null,列名2 类型2(not)null,……)”语句实现向表中添加数据。
电子科技大学计算机学院实验中心
五、实验器材(设备、元器件)
操作系统:Windows 2000/XP 编程环境:SQL Server Management Studio
六、实验步骤:
用附加命令载入数据库,然后在相应新建查询中用insert语句输入准备的数据。
七、实验数据及结果分析:
insert into dep values('601','计算机科学与工程');insert into dep values('602','软件工程');insert into dep values('603','信息安全');insert into dep values('604','IS');
insert into teacher values('T01','教师1','教授','601');insert into teacher values('T02','教师2','工程师','601');insert into teacher values('T03','教师3','副教授','602');insert into teacher values('T04','教师4','讲师','602');insert into teacher values('T05','教师5','高工','603');insert into teacher values('T06','教师6','高工','603');
insert into course values('6001','计算机组成原理',null,3);insert into course values('6002','操作系统','6001',3);insert into course values('6003','数据结构',null,3);insert into course values('6004','数据库原理',null,3);insert into course values('6011','数据库应用开发',null,2);insert into course values('6005','Computer Network',null,2);insert into course values('6006','Objected JAVA',null,2);insert into course values('6007','Software Engeneering','6006',2);insert into course values('6008','UNIX Basic',null,2);insert into course values('6009','UNIX OS Design','6008',2);
insert into student values('601','张1','男','602','1990-10-20','587627416@qq.com','四川');insert into student values('2406010103','张2','女','601','1991-06-10','123627416@qq.com','湖南');insert into student values('2406030101','王1','男','603','1990-05-06','4827416@qq.com','新疆');insert into student values('2406020105','王2','女','602','1990-07-15','90627416@qq.com','云南');insert into student values('2406030110','吴1','女','603','1991-08-14','367627416@qq.com','广西');
insert into sc values('601','6002','T03',50);insert into sc values('2406010103','6002','T02',60);insert into sc values('2406030101','6001','T01',70);insert into sc values('2406020105','6004','T04',80);
insert into sc values('2406030110','6006','T06',90);
八、实验结论、心得体会和改进建议:
插入数据要仔细,以免不必要的麻烦。
一、实验三:
名称
数据库的完整性
二、实验学时:4
三、实验内容和目的:
通过设置表的检查约束、外键约束体会数据库完整性的含义,约束条件下数据修改操作的限制,以及实现修改操作的技巧。
四、实验原理:
用“alter table 表名 add constraint 约束名 check 条件”,“alter table 表名1 add constraint 外键名 foreign key(列名)references 表名2(列名)”分别实现检查约束与设置外键约束的功能。以及用“delete from 表名 where 条件”,“update 表名 set 列名=()where 条件”来删除和修改满足条件的数据。
五、实验器材(设备、元器件)
操作系统:Windows 2000/XP 编程环境:
电子科技大学计算机学院实验中心
SQL Server Management Studio
六、实验步骤:
用附加命令载入数据库,然后在相应新建查询中输入相应代码。
七、实验数据及结果分析:
alter table sc add constraint fk_sc_student_sid foreign key(sid)references student(sid);alter table sc add constraint fk_sc_teacher_tid foreign key(tid)references teacher(tid);alter table sc add constraint fk_sc_course_cid foreign key(cid)references course(cid);
alter table student add constraint check_student_sname check(sname is not null);alter table sc add constraint check_sc_course check(score>=0 and score<=100);alter table student add constraint check_student_sex check(sex='男' or sex='女');alter table student add constraint check_student_semail check(semail like '%@%');
delete from sc where(sid='601');update student set sid='20060601' where(sid='601');insert into sc values('20060601','6002','T03',50);
八、实验结论、心得体会和改进建议:
注意按一定的习惯来书写约束名和键名,以便利于修改和删除。
一、实验四: 名称 数据的修改
二、实验学时:4
三、实验内容和目的:
练习UPDATEV、DELETE命令的使用,实现对数据的修改和删除。
四、实验原理:
用“delete from 表名 where 条件”,“update 表名 set 列名=()where 条件”来删除和修改满足条件的数据。
五、实验器材(设备、元器件)
操作系统:Windows 2000/XP 编程环境:SQL Server Management Studio
六、实验步骤:
用附加命令载入数据库,然后在相应新建查询中输入相应代码。
七、实验数据及结果分析:
update dep set depname='Information' where(depname='IS');delete from sc where(sid like '%601%' and cid='6002');delete from sc where(sid like '%603%' and cid='6001');delete from sc where(sid='2406010103');update student set sid='2406030102' where(sid='2406010103');insert into sc values('2406030102','6002','T02',60);
八、实验结论、心得体会和改进建议:
对于要修改和删除的数据需要注意主外键。比如对于要修改被引用外键的数据,需要先删除被引用外键的数据,才能顺利修改或删除。
电子科技大学计算机学院实验中心
一、实验五: 名称 简单查询、多表查询
二、实验学时:4
三、实验内容和目的:
练习用SELECT查询语句,设置查询条件,实现单表查询。练习使用SELECT语句从多个表中查询数据,表的内连接、左外连接、右外连接的使用以及设置连接条件,理解连接条件和查询条件的目的和功能上的区别。
四、实验原理:
用“select 列名1(as 列名),列名2…… from 表名 where 查询条件”来实现有条件的简单查询。用“select * from 表名1 join 表名2 on 连接条件 having(where)查询条件”语句来实现多表连接查询。以及用union,except,intersect来实现查找结果的并、差、交操作。还有用“datediff(year,生日,现在日期)”语句实现年龄的计算。
五、实验器材(设备、元器件)
操作系统:Windows 2000/XP 编程环境:SQL Server Management Studio
六、实验步骤:
用附加命令载入数据库,然后在相应新建查询中输入相应代码。
七、实验数据及结果分析:
select sname from student where(datediff(year,birthd,'2011-10-7')between 20 and 22);select sname,datediff(year,birthd,'2011-10-7')as year,depname from student join dep on student.depid=dep.depid where datediff(year,birthd,'2011-10-7')between 20 and 22;select * from teacher where title='副教授';select sid,sname,semail from student where sname like '张%';select sid,cid from sc where score is not null;select student.*,sc.cid,sc.tid,sc.score from student join sc on student.sid=sc.sid;select student.*,cname,tname,score from((sc join student on student.sid=sc.sid)join teacher on teacher.tid=sc.tid)join course on course.cid=sc.cid where score<60;(select sid from sc where cid='6001')intersect(select sid from sc where cid='6002');
八、实验结论、心得体会和改进建议:
用union,except,intersect实现查询结果的并、差、交时,表的列数必须一样,结果列名显示前一个表的。查询时,是根据引用的表及算法得出的一个集合,原来的表没有任何变化。并且可以用“as 新列名”为查询结果的列重新命名。多表连接查询时,因为会有两行的连接条件,不要用它作查询条件。还有查询项可以是引用表的表达式或函数,查询条件一样可以。
一、实验六: 名称 分组统计查询
二、实验学时:4
三、实验内容和目的:
练习使用聚集函数count(),max(),min(),avg(),sum()等在SQL命令中实现统计功能。使用GROUP BY
电子科技大学计算机学院实验中心
子句实现分组查询,以及聚集函数在分组查询中的应用。体会分组查询的功能特点。
四、实验原理:
用“select 列名,聚集函数 from 表名 group by having查询条件”或“select 列名,聚集函数 from 表名 where 包含‘列名’的的查询条件”来实现分组查询。
五、实验器材(设备、元器件)
操作系统:Windows 2000/XP 编程环境:SQL Server Management Studio
六、实验步骤:
用附加命令载入数据库,然后在相应新建查询中输入相应代码。
七、实验数据及结果分析:
select count(*)as '选修数据库课程的人数' from sc where cid='6003';select sid as '学号',count(cid)as '选课门数' from sc group by sid;select sid as '学号',sum(score)as '总成绩' from sc group by sid;select count(sid)as '选修数据库课且成绩分以上人数' from sc where sid in(select sid from sc where cid='6003' and score>=60);select score as '数据库课最高成绩',sname as '姓名'from sc join student on sc.sid=student.sid where score=(select max(score)from sc group by cid having cid='6003');select cname as '课程名',avg(score)as '平均成绩' from sc join course on sc.cid=course.cid group by cname;select cname as '课程名',count(sid)as '选课人数' from sc join course on sc.cid=course.cid group by cname;select sname as '选修5门课以上学生姓名',semail from student where sid in(select sid from sc group by sid having count(cid)>=5);
八、实验结论、心得体会和改进建议:
分组查询作为查询主体时,只能显现分组列名和聚集函数部分。把他放在条件位置,作为查询条件集合时,能够实现多列甚至是多表连接的多列的显示。另外聚集函数可以不显示,而作为查
询条件出现,跟在having后。
一、实验七: 名称 集合操作、子查询
二、实验学时:4
三、实验内容和目的:
IN、EXISTS、NOT EXISTS 运算在WHERE子句中的应用;静态集合和由SELECT命令产生的动态结果集运算。
四、实验原理:
子查询即把查询的结果当做另一个查询的条件,通过嵌套语句来实现复杂的查询。因为子查询的结果很可能是一个集合,需要运用集合之间的运算,比如in、exists、not exists的运用。
五、实验器材(设备、元器件)
操作系统:Windows 2000/XP 编程环境:SQL Server Management Studio
六、实验步骤:
用附加命令载入数据库,然后在相应新建查询中输入相应代码。
七、实验数据及结果分析:
select sname as '姓名',datediff(year,birthd,'2011-10-7')as '年龄' from student where birthd>(select birthd from student where depid='603' and sid='2406030101');
电子科技大学计算机学院实验中心
select sname,depname,semail from student join dep on student.depid=dep.depid where sid in((select sid from student)except(select sid from sc));select sname from student where sid in(select sid from sc group by sid having count(cid)=(select count(cid)from course));select sname from student where sid in(select sid from sc where cid='6002' intersect select sid from sc where cid='6001');
八、实验结论、心得体会和改进建议:
对于子查询是集合的情况,是不能跟在=,>,<>等条件运算符后面的。对于聚集函数本身是查询结果时,where和having后面只能定义与聚合函数有关的条件。可以通过添加子查询的方式,来实现多条件查询条件。
第四篇:河北工业大学数据库原理及应用实验实验报告
《数据库原理及应用实验》
姓名:徐毅民学号: 153299
实验报告
班级:网络151 实验1数据库定义与操作语言实验
实验1.4数据更新实验
1、实验目的
熟悉数据库的数据更新操作,能够使用SQL语句对数据库进行数据的插入、删除、修改操作。
2、实验内容和要求
针对TPC-H数据库设计数据单元组插入、批量数据插入、修改数据和删除数据等SQL语句。理解和掌握INSERTT、UPDATE、和DELETE语法结构的各个组成成分,结合嵌套SQL子查询,分别设计几种不同形式的插入、修改和删除数据的语句,并调试成功。
3、实验重点和难点
实验重点:插入、修改和删除数据的SQL 实验难点:与嵌套SQL子查询相结合的插入、修改和删除数据的SQL语句;利用一个表的数据来插入、修改和删除另一个表的数据。
4、实验报告示例
(1)INSERT基本语句(插入全部列的数据)插入一条顾客记录,要求每列都给一个合理的值。
INSERT INTO Customer VALUES(30,'张三','北京市',40,'010-51001199',0.00,'Northeast','VIP Customer');(2)INSERT基本语句(插入部分列的数据)插入一条订单记录,给出必要的几个字段值。
INSERT INTO Lineitem(orderkey,Linenumber,partkey,suppkey,quantity,shipdate)VALUES(862,ROUND(RANDOM()*100,0,479,1,10,'2012-3-6');/*RANDOM()函数为随机小数生成函数,ROUND()为四舍五入函数*/(3)批量数据INSERT语句
① 创建一个新的顾客表,把所有中国籍顾客插入到新的顾客表中。
INSERT INTO NewCustomer/*批量插入SELECT 语句查询结果到NewCustomer表中*/ SELECT C.* FROM Costomer C,Nation N WHERE C.nationkey=N.nationkey AND N.name='中国';②创建一个顾客购物统计表,记录每个顾客及其购物总数和总价等信息。
CREATE TABLE ShoppingStat(custkey INTEGER, quantity REAL, totalprice REAL);INSERT INTO ShoppingStat SELECT C.custkey,Sum(L.quantity),Sum(O.totalprice)FROM Customer C,Order O,Lineitem L WHERE C.custkey=O.custkey AND O.orderkey=L.orderkey GROUP BY C.custkey ③倍增零件表的数据,多次重复执行,直到总记录数达到50万为止。
INSERT INTO Part SELECT partkey+(SELECT COUNT(*)FROM Part), name,mfgr,brand,type,size,container,retailprice,comment FROM Part;(4)UPDATE语句(插入部分记录的部分列值)
“金仓集团”供应的所有零件的供应成本价下降10%。
UPDATE PartSupp SET supplycost=supplycost*0.9 WHERE suppkey=(SELECT suppkey
FROM Supplier WHERE name='金仓集团');(5)UPDATE语句(利用一个表中的数据修改另外一个表中的数据)
利用Part表中的零售价格来修改
Lineitem
中的extendedprice,其中
/*找出要修改的那些记录*/
/*对分组后的数据求总和*/ extendedprice=Part.retailprice*quantity。
UPDATE Lineitem L SET L.extendedprice=P.retailprice*L.quantity FROM Part P WHERE L.partkey=P.partkey;/*Lineitem表也可以直接与Part表相连接,而不需通过PartSupp连接*/(6)DELETE基本语句(删除给定条件的所有记录)
删除顾客张三的所有订单记录。
DELECT FROM Lineitem WHERE orderkey IN(SELECT orderkey
FROM Order O,Customer C
WHERE O.custkey=C.custkey AND C.name='张三');DELECT FROM Order WHERE custkey=(SELECT custkey FROM Customer WHERE name='张三');实验1.5 视图实验
1、实验目的
熟悉SQL语言有关视图的操作,能够熟练使用SQL语句来创建需要的视图,定义数据库外模式,并能使用所创建的视图实现数据管理。
2、实验内容和要求
针对给定的数据库模式,以及相应的应用需求,创建视图和带WITH CHECK OPTION的视图,并验证视图WITH CHECK OPTION选项的有效性。理解和掌握视图消除执行原理,掌握可更新视图和不可更新视图的区别。
3、实验重点和难点 实验重点:创建视图。
实验难点:可更新的视图和不可更新的视图之区别,WITH CHECK OPTION的验证。
4、实验报告示例
(1)创建视图(省略视图列名)
创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp1,要求列出供应零件的编号、零件名称、可用数量、零售价格、供应价格和备注等信息。
CREATE VIEW V_DLMU_PARTSUPP1 AS /*由SELECT子句目标列组成视图属性*/
/*再删除张三的订单记录*/
/*先删除张三的订单明细记录*/ SELECT P.partkey,P.name,PS.availqty,P.retailprice,PS.supplycost,P.comment FROM Part P,PartSupp PS,Supplier S WHERE P.partkey=PS.partkey AND S.suppkey=PS.suppkey AND S.name='海大汽配';(2)创建视图(不能省略列名的情况)
创建一个视图V_CustAvgOrder,按顾客统计平均每个订单的购买金额和零件数量,要求输出 顾客编号、姓名,平均购买金额和平均购买零件数量。
CREATE VIEW V_CustAvgOrder(custkey,cname,avgprice,avgquantity)AS SELECT C.custkey,MAX(C.name),AVG(O.totalprice),AVG(L.quantity)FROM Customer C,Orders O,Lineitem L WHERE C.custkey=O.custkey AND L.orderkey=O.orderkey GROUP BY C.custkey;(3)创建视图(WITH CHECK OPTION)
使用WITH CHECK OPTION,创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp2,要求列出供应零件的编号、可用数量和供应价格等信息。然后通过该视图分别增加、删除和修改一条“海大汽配”零件供应记录,验证WITH CHECK OPTION是否起作用。
CREATE VIEW V_DLMU_PartSupp2 AS SELECT partkey,suppkey,availqty,supplycost FROM PartSupp WHERE suppkey=(SELECT suppkey FROM Supplier WHERE name='海大汽配')WITH CHECK OPTION;INSERT INTO V_DLMU_PartSupp2 VALUES(58889,5048,704,77760);UPADTE V_DLMU_PartSupp2 SET supplycost=12 WHERE suppkey=58889;DELETE FROM V_DLMU_PartSupp2 WHERE suppkey=58889;(4)可更新的视图(行列子集视图)
使用WITH CHECK OPTION,创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp4,要求列出供应零件的编号、可用数量和供应价格等信息。然后通过该视图分别增加、删除和修改一条“海大汽配”零件供应记录,验证该视图是否是可更新的,并比较上述“(3)创建视图”实验任务与本任务结果有何异同。
CREATE VIEW V_DLMU_PartSupp3 AS
SELECT partkey,suppkey,availqty,supplycost FROM PartSupp WHERE suppkey=(SELECT suppkey FROM Supplier WHERE name='海大汽配');
INSERT INTO V_DLUM_PartSupp3 VALUES(58889,5048,704,77760);
UPDATE V_DLMU_PartSupp3 SET supplycost=12 WHERE suppkey=58889;
DELETE FROM V_DLMU_PartSupp3 WHERE suppkey=58889;(5)可更新的视图
INSERT INTO V_CustAvgOrder VALUES(100000,NULL,20,2000);(6)删除视图(RESTRICT/CASCADE)
创建顾客订购零件明细视图V_CustOrd,要求列出顾客编号、姓名、购买零件数、金额,然后在该视图的基础上,在创建(2)的视图V_CustAvgOrder,然后使用RESTRICT选项和CASCADE选项删除视图V_CustOrd。
CREATE VIEW V_CustOrd(custkey,cname,qty,extprice)AS SELECT C.custkey,C.name,L.quantity,L.extendedprice FROM Customer C,Order O,Lineitem L WHERE C.custkey=O.custkey AND O.orderkey=L.orderkey;
CREATE VIEW V_CustAvgOrder(custkey,cname,avgqty,avgprice)AS SELECT custkey,MAX(cname),AVG(qty),AVG(extprice)FROM V_CustOrd GROUP BY custkey;
DROP VIEW V_CustOrd RESTRICT;
DROP VIEW V_CustOrd CASCADE;实验1.6 索引实验
1、实验目的
掌握索引设计原则和技巧,能够创建合适的索引以提高数据库查询、统计分析效率。
2、实验内容和要求
针对给定的数据库模式和具体应用要求,创建唯一索引、函数索引、复合索引等;修改索引;删除索引。设计相应的SQL查询验证索引有效性。学习利用EXPLAIN命令分析SQL查询是否使用了所创建的索引,并能够分析其原因,执行SQL查询并估算索引提高查询效率的百分比。要求实验数据集达到10万条记录以上的数据量,以便验证索引效果。
3、实验重点和难点 实验重点:创建索引。
实验难点:设计SQL查询验证索引有效性。
4、实验报告示例
/*在视图V_CustOrd上再创建视图*/(1)创建唯一索引
在零件表的零件名称字段上创建唯一索引。
CREATE UNIQUE INDEX Idx_part_nameON Part(name);(3)创建复合索引(对两个及两个以上的属性创建索引,称为复合索引)
在零件表的制造商和品牌两个字段上创建一个复合索引。
CREATE UNIQUE INDEX Idx_part_mfgr_brand ON Part(mfgr,brand);(4)修改索引名称
修改零件表的名称字段上的索引名。
ALTER INDEX Idx_part_name_hash RENAME TO Idx_part_name_hash_new;(5)*验证索引效率
创建一个函数TestIndex,自动计算sql查询执行的时间。
CREATE FUNCTION TestIndex(p_part_name CHAR(55))RETURN INTEGER AS /*自定义函数TestIndex():输入参数为零件名称,返回SQL查询的执行时间*/ DECLARE begintime TIMESTAMP;endtime TIMESTAMP;durationtime INTEGER;BEGN SELECT CLOCK_TIMESTAMP()INTO begintime;/*记录查询执行的开始时间*/ PERFORM *FROM Part WHERE name=p_partname;/*执行SQL查询,不保存查询结果*/ SELECT CLOCK_TIMESTAMP()INTO endtime;SELECT DATEDIFF(„ms‟,begintime,endtime)INTO durationtime;
RETURN durationtime;
END;/*查看当零件表Part数据模型比较小,并且无索引时的执行时间*/ SELECT TestIndex(„零件名称‟);
INSERT INTO Part
/*不断倍增零件表的数据,直到50万条记录*/
/*计算并返回查询执行时间,时间单位为毫秒ms*/ SELECT partkey+(SELECT COUNT(*)FROM Part), Name,mfgr,brand,type,size,container,retailprice,comment FRPM Part;/*查看当零件表Part数据模型比较大,但无索引时的执行时间*/ SELECT TestIndex(„零件名称‟);
CREATE INDEX part_name ON Part(name);索引*/ /*查看零件表Part数据规模比较大,有索引时的执行时间*/ SELECT TestIndex();
/*在零件表的零件名称字段上创建
实验2 安全性语言实验
实验2.1
自主存取控制实验
1、实验目的
掌握自主存取控制缺陷的定义和维护方法。
2、实验内容和要求
定义用户、角色,分配权限给用户、角色,回收权限,以相应的用户名登录数据库验证权限分配是否正确。选择一个应用场景,使用自主存取控制机制设置权限分配。可以采用两种方案。
方案一:采用SYSTEM超级用户登录数据库,完成所有权限分配工作,然后用相应用户名登录数据库已验证权限分配正确性;
方案二:采用SYSTEM用户登录数据库创建3个部门经理用户,并分配相应的权限,然后分别用3个经理用户名登录数据库,创建相应部门的USER、ROLE,并分配相应权限。
下面的实验报告示例采用了实验方案一。验证权限分配之前,请备份好数据库,针对不同的用户所具有的权限,分别设计相应的SQL语句加以验证。
3、实验重点和难点
实验重点:定义角色,分配权限和回收权限。实验难点:实验方案二实现权限的再分配和回收。
4、实验报告示例(1)创建用户 为采购、销售和客户管理等3个部门的经理创建用户标识,要求具有创建用户或角色的○权利。
CREATE USER David WITH CREATEROLE PASSWORD '123456';CREATE USER Tom WITH CREATEROLE PASSWORD '123456';CREATE USER Kathy WITH CREATEROLE PASSWORD '123456';2为采购、销售和客户管理等3个部门的职员创建用户标识和用户口令。○CREATE USER Jeffery WITH PASSWORD '123456';CREATE USER Jane WITH PASSWORD '123456';CREATE USER Mike WITH PASSWORD '123456';(2)创建角色并分配权限
1为各个部门分别创建一个查询角色,并分配相应的查询权限。○CREATE ROLE PurchaseQueryRole;GRANT SELECT ON Part TO PurchaseQueryRole;GRANT SELECT ON Supplier TO PurchaseQueryRole;GRANT SELECT ON PartSupp TO PurchaseQueryRole;
CREATE ROLE SaleQueryRole;GRANT SELECT ON Order TO SaleQueryRole;GRANT SELECT ON Lineitem TO SaleQueryRole;
CREATE ROLE CustomerQueryRole;GRANT SELECT ON Customer TO CustomerQueryRole;GRANT SELECT ON Nation TO CustomerQueryRole;GRANT SELECT ON Region TO CustomerQueryRole;2为各个部门分别创建一个职员角色,对本部门信息具有查看、插入权限。○CREATE ROLE PurchaseEmployeeRole;GRANT SELECT,INSERT ON Part TO PurchaseEmployeeRole;GRANT SELECT,INSERT ON Supplier TO PurchaseEmployeeRole;GRANT SELECT,INSERT ON TABLE PartSupp TO PurchaseEmployeeRole;
CREATE ROLE SaleEmployeeRole;GRANT SELECT,INSERT ON Order TO SaleEmployeeRole;GRANT SELECT,INSERT ON Lineitem TO SaleEmployeeRole;
CREATE ROLE CustomerEmployeeRole;GRANT SELECT,INSERT ON Customer TO CustomerEmployeeRole;GRANT SELECT,INSERT ON Nation TO CustomerEmployeeRole;GRANT SELECT,INSERT ON Region TO CustomerEmployeeRole;3为各个部门创建一个经理角色,相应角色对本部门的信息具有完全控制权限,对其他部门○的信息具有查询权。经理有权给本部门资源分配权限。
CREATE ROLE PurchaseManagerRole WITH CREATEROLE; GRANT ALL ON Part TO PurchaseManagerRole; GRANT ALL ON Supplier TO PurchaseManagerRole; GRANT ALL ON PartSupp TO PurchaseManagerRole; GRANT SaleQueryRole TO PurchaseManagerRole; GRANT CustomerQueryRole TO PurchaseManagerRole;
CREATE ROLE SaleManagerRole WITH CREATEROLE; GRANT ALL ON Order TO SaleManagerRole GRANT ALL ON Lineitem TO SaleManagerRole GRANT SaleQueryRole TO SaleManagerRole GRANT PurchaseQueryRole TO SaleManagerRole
CREATE ROLE CustomerManagerRole WITH CREATEROLE; GRANT ALL ON Customer TO CustomerManagerRole GRANT ALL ON Nation TO CustomerManagerRole GRANT ALL ON Region TO CustomerManagerRole GRANT SaleQueryRole TO CustomerManagerRole GRANT PurchaseQueryRole TO CustomerManagerRole(3)给用户分配权限 1给部门经理分配权限。○GRANT PurchaseManagerRole TO David WITH ADMIN OPTION;GRANT SaleManagerRole TO Tom WITH ADMIN OPTION;GRANT CustomerManagerRole TO Kathy WITH ADMIN OPTION;2给各部门职员分配权限 ○GRANT PurchaseEmployeeRole TO Jeffery;GRANT SaleEmployeeRole TO Jane;GRANT CustomerEmployeeRole TO Mike;(4)回收角色或用户权限
1收回客户经理角色的销售信息查看权限。○REVOKE SaleQueryRole FROM CustomerManagerRole;2回收MIKE的客户部门职员权限。○REVOKE CustomerEmployeeRole FROM Mike;(5)验证权限分配正确性
1以David用户名登录数据库,验证采购部门经理的权限 ○SELECT * FROM Part;DELETE * FROM Order;2回收MIKE的客户部门职员权限 ○SELECT * FROM Customer;SELECT * FROM Part;实验2.2
审计实验
1、实验目的
掌握数据库审计的设置和管理方法,以便监控数据库操作,维护数据库安全。
2、实验内容和要求
打开数据库审计开关。以具有审计权限的用户登录数据库,设置审计权限,然后以普通用户登录数据库,执行相应的数据操纵sql语句,验证相应审计设置是否生效,最后在一具有审计权限的用户登录数据库,查看是否存在相应的审计信息。
3、实验重点和难点
实验重点:数据库对象级审计,数据库语句级审计。
实验难点:合理地设置各种审计信息。一方面,为了保护系统重要的敏感数据,需要系统地设置各种审计信息,不能留有各种漏洞,以便随时监督系统使用情况,一旦出现问题也便于追查;另一方面,审计信息设置过多会严重影响数据库的使用性能,因此需要合理配置。
4、实验报告示例(1)审计开关
1显示当前审计开关状态 ○SHOW AUDIT_TRAIL;2打开审计开关 ○SET AUDIT_TRAIL TO ON;(2)数据库操作审计
1对客户信息表上的删除操作设置审计。○AUDIT DELETE ON Sales.Customer BY ACCESS;2以普通用户登录,执行sql语句。○DELETE Sales.Customer WHERE custkey=1011;3查看数据库对象审计信息,验证审计设置是否生效。○SELECT * FROM SYS_AUDIT_OBJECT;(3)语句级审计
1对表定义的更改语句ALTER设置审计 ○AUDIT ALTER TABLE BY ACCESS;2查看所有数据库所有语句级审计设置,验证审计设置是否生效 ○SELECT * FROM SYS_STMT_AUDIT_OPTS;3以普通用户登录,执行sql语句,验证审计设置是否生效 ○ALTER TABLE Customer ADD COLUMN tt INT;4查看所有审计信息 ○SELECT * FROM SYS_AUDIT_TRAIL;
四、实验心得
通过本次实验,知道了定义用户、角色,分配权限给用户、角色,回收权限,并以相应的用户名登陆数据库验证权限分配是否正确的方法。并且知道了数据库审计的目的和方法。做实验的同时,对sql语句有了更熟练的运用。
实验3 完整性语言实验
实验3.1 实体完整性实验
1、实验目的
掌握实体完整性的定义和维护方法。
2、实验内容和要求
定义实体完整性,删除实体完整性。能够写出两种方式定义实体完整性的SQL语句:创建表时定义实体完整性、创建表后定义实体完整性。设计SQL语句验证完整性约束是否起作用。
3、实验重点和难点
实验重点:创建表时定义实体完整性。实验难点:有多个候选码时实体完整性的定义。
4、实验报告示例
(1)创建表时定义实体完整性(列级实体完整性)
定义供应商表的实体完整性。CREATE TABLE Supplier(suppkey INTEGER CONSTRAINT c1 PRIMARY KEY,name CHAR(25),address VARCHAR(40),nationkey INTEGER,phone CHAR(15),acctbal REAL, comment VARCHAR(101));(2)创建表时定义实体完整性(表级实体完整性)
CREATE TABLE Supplier(suppkey INTEGER,name CHAR(25),address VARCHAR(40),nationkey INTEGER,phone CHAR(15),acctbal REAL,comment VARCHAR(101),CONSTRAINT c1 PRIMARY KEY(suppkey));(3)创建表后定义实体完整性 定义供应商表。
CREATE TABLE Supplier(suppkey INTEGER,name CHAR(25),address VARCHAR(40),nationkey INTEGER,phone CHAR(15),acctbal REAL,comment VARCHAR(101));ALTER TABLE Supplier ADD CONSTRAINT c1 PRIMARY KEY(suppkey);(4)定义实体完整性(主码由多个属性组成)定义供应关系表的实体完整性。
CREATE TABLE PartSupp(partkey INTEGER,suppkey INTEGER,availqty INTEGER,supplycost REAL,comment VARCHAR(199),PRIMARY KEY(partkey,suppkey));(5)有多个候选码时定义实体完整性
定义国家表的实体完整性,其中nationkey和name都是候选码,选择nationkey作为主码,name上定义唯一性约束。
CREATE TABLE nation(nationey INTEGER CONSTRAINT c1 PRIMARY KEY,name CHAR(25)UNIQUE,regionkey INTEGER,comment VARCHAR(152));(6)删除实体完整性
删除国家实体的主码。
ALTER TABLE nation DROP CONSTRAINT c1;
(7)增加两条相同记录,验证实体完整性是否起作用
/*插入两条主码相同的记录就会违反实体完整性约束*/ INSERT INTO Supplier(suppkey,name,address,nationkey,phone,acctbal,comment)VALUES(11,‟test1‟,‟test1‟,‟101‟,‟12345678‟,0.0,‟test1‟);INSERT INTO Supplier(suppkey,name,address,nationkey,phone,acctbal,comment)
VALUES(11,‟test2‟,‟test2‟,‟102‟,‟12345‟,0.0,‟test2‟);5.思考题
(1)所有列级完整性约束都可以改写成表级完整性约束,而表级完整性约束不一定能改写成列级完整性约束。请举例说明。
答:当主码由多个属性组成时,只能定义表级完整性约束。(2)什么情况下会违反实体完整性约束,DBMS将做何种违约处理?
答:1.主码值不唯一 2.主码的各个属性有空。
违约处理:拒绝执行、级联执行等操作。
实验3.2 参照完整性实验
1、实验目的
掌握参照完整性的定义和维护方法。
2、实验内容和要求
定义参照完整性,定义参照完整性的违约处理,删除参照完整性。写出两种方式定义参照完整性的SQL语句:创建表时定义参照完整性、创建表后定义参照完整性。
3、实验重点和难点
实验重点:创建表时定义参照完整性。实验难点:参照完整性的违约处理定义。
4、实验报告示例
(1)创建表时定义参照完整性
先定义地区表的实体完整性,再定义国家表的参照完整性。
CREATE TABLE region(regionkey INTEGER PRIMARY KEY,name CHAR(25),comment VARCHAR(152));
CREATE TABLE nation(nationkey INTEGER PTIMARY KEY,name CHAR(25),regionkey INTEGER REFERENCES region(regionkey), /*列级参照完整性*/
comment VARCHAR(152));
或者:
CREATE TABLE nation(nationkey INTEGER PTIMARY KEY,name CHAR(25),regionkey INTEGER,comment VARCHAR(152),CONSTRAINT c1 FOREIGN KEY(regionkey)REFERENCES region(regionkey));
/*表级参照完整性*/(2)创建表后定义参照完整性
定义国家表的参照完整性。
CREATE TABLE nation(nationkey INTEGER PTIMARY KEY,name CHAR(25),regionkey INTEGER,comment VARCHAR(152));ALTER TABLE nation ADD CONSTRAINT c1 FOREIGN KEY(regionkey)REFERENCES region(regionkey);(3)定义参照完整性(外码由多个属性组成)定义订单项目表的参照完整性。
CREATE TABLE PartSupp(partkey INTEGER,suppkey INTEGER,availqty INTEGER,supplycost REAL,comment VARCHAR(199),PRIMARY KEY(partkey,suppkey));CREATE TABLE Lineitem(orderkey INTEGER REFERENCES Orders(orderkey),partkey INTEGER REFERENCES Part(partkey),suppkey INTEGER REFERENCES Supplier(suppkey),linenumber INTEGER,quantity REAL,PRIMARY KEY(orderkey,linenumber),FOREIGN KEY(partkey,suppkey)REFERENCES PartSupp(partkey,suppkey));(4)定义参照完整性的违约处理
定义国家表的参照完整性,当删除或修改被参照表记录时,设置参照表中相应记录的值为空。
CREATE TABLE nation(nationkey INTEGER PRIMARY KEY,name CHAR(25),regionkey INTEGER,comment VARCHAR(152), CONSTRAINT c1 FOREIGN KEY(regionkey)REFERENCES Region(regionkey)ON DELETE SET NULL ON UPDATE SET NULL);(5)删除参照完整性 删除国家表的外码。ALTER TABLE nation DROP CONSTRING c1;(6)插入一条国家记录,验证参照完整性是否起作用
/*插入一条国家记录,如果‘1001’号地区记录不存在,违反参照完整性约束*/ INSERT INTO nation(nationkey,name,regionkey,comment)VALUES(1001,‟nation1‟,1001,‟comment1‟);
实验3.3用户自定义完整性实验
1、实验目的
掌握用户自定义完整性的定义和维护方法。
2、实验内容和要求
针对具体应用语义,选择NULL/NOT NULL、DEFAULT、UNIQUE、CHECK等,定义属性上的约束条件。
3、实验重点和难点
实验重点:NULL/NOT NULL、DEFAULT。实验难点:CHECK。
4、实验报告示例
(1)定义属性NULL/NOT NULL约束 定义地区表各属性的NULL/NOT NULL属性。CREATE TABLE region(regionkey INTEGER NOT NULL PRIMARY KEY,name CHAR(25)NOT NULL,comment VARCHAR(152)NULL);(2)定义属性DEFAULT约束
定义国家表的regionkey的缺省属性值为0值,表示其他地区。
CREATE TABLE nation(nationkey INTEGER PRIMARY KEY, name CHAR(25),regionkey INTEGER DEFAULT 0, comment VARCHAR(152), CONSTRAINT c1 FOREIGN KEY(regionkey)REFERENCES Region(region));(3)定义属性UNIQUE约束
定义国家表的名称属性必须唯一的完整性约束。CREATE TABLE nation(nationkey INTEGER PRIMARY KEY, name CHAR(25)UNIQUE, regionkey INTEGER, comment VARCHAR(152));(4)使用CHECK 使用CHECK定义订单项目表中某些属性应该满足的约束。CREATE TABLE Lineitem(orderkey INTEGER REFERENCES Orders(orderkey), partkey INTEGER REFERENCES Part(partkey), suppkey INTEGER REFERENCES Supplier(suppkey),linenumber INTEGER, quantity REAL, extendedprice REAL, discount REAL, tax REAL, returnflag CHAR(1), linestatus CHAR(1), shipdate DATE, commitdate DATE,receiptdate DATE, shipinstruct CHAR(25), shipmode CHAR(10), comment VARCHAR(44),PRIMARY KEY(orderkey,linenumber), FOREIGN KEY(partkey,suppkey)REFERENCES PartSupp(partkey,suppkey), CHECK(shipdate < receiptdate),/*装运日期<签收日期*/ CHECK(returnflag IN('A','R','N')));/*退货标记为A或R或N*/(5)修改Lineitem的一条记录验证是否违反CHECK约束
UPDATE sales.Lineitem
SET shipdate='2015-01-05',receiptdate='2015-01-01' WHERE orderkey=5005 AND linenumber=1;
第五篇:数据库基础与应用实验报告
《数据库基础与应用》实验报告
实验名称 《ACCESS 之 窗体的操作》
一、实验目的:
1、掌握使用“窗体向导” 创建基于一个表或查询的“窗体”的方法。
2、掌握使用“窗体向导”创建“数据透视表窗体”的方法。
3、掌握使用“窗体向导”创建“图表窗体”的方法。
4、掌握“自动创建窗体:纵栏式”和“自动创建窗体:表格式”的方法。
5、掌握用“图表向导”和“数据透视表向导”创建窗体的方法。
6、掌握在窗体中输入和编辑数据的方法。
7、掌握窗体美化的方法和常用控件的使用。
8、掌握同时创建“主/子窗体”的方法。
二、实验要求:
1、阅读主教材中与本实验有关的知识以及本实验的内容和操作步骤。
2、任选一种方法在计算机上创建“窗体”。
3、任选一种方法在计算机上创建“主/子窗体”。
4、用“设计视图”创建一个主菜单窗体。
5、设置窗体外观(包括字体、背景、声音和添加控件等)。
6、对于有余力的同学,可以在计算机上用多种方法创建和设计“窗体”,并进行分析比较。
注意:此实验不需要书写实验报告,只需上机实际操作练习。
三、实验内容:
1、以 “教师情况一览表”为数据源,创建纵栏式“教师情况一览表窗体1”,并在该窗体中添加一条记录。
2、以“教师情况一览表”为数据源,创建表格式“教师情况一览表窗体2”。
3、以“教师任课表”为数据源,使用“窗体向导”创建“教师任课表窗体1”,并将窗体布局设为“数据表”,窗体样式设为“国际”。
4、以“教师任课表”为数据源,使用“图表向导”创建“教师任课表拼图”,并用“拼图”方式显示各系开课情况。
5、以“教师任课表”为数据源,使用“数据透视表向导”创建“各系教师任课数据透视表”,要求能统计每个系每个教师任课总学时数。
6、创建带有子窗体的窗体,其中主窗体以“教师情况一览表”为数据源,用于显示教师情况(显示“教师姓名”、“性别”、“职称”和“系(部门)ID”字段),子窗体包含在主窗体中,用于显示相应的教师任课情况(显
示“课程名称”、“学时”和“考试类型”字段);使用主窗体上的“记录定位器”可以在不同教师记录之间移动,此时子窗体中的教师任课情况随之发生变化。
7、设计“教师教学信息管理系统”主菜单窗体,该系统包括查询、更新和退出三个功能。当点击“查询”按钮时,进入“查询”子菜单;点击“更新”按钮时,进入“更新”子菜单;当点击“退出”按钮时,关闭主菜单“窗体”,返回到数据库窗口下。
注意:具体的实验报告内容请参看上机实验指导书。