第一篇:上海應用技術(shù)學院實驗報告(數(shù)據(jù)庫原理及應用)參考
上海應用技術(shù)學院
《數(shù)據(jù)庫原理及應用》課程實驗報告
計算機科學與信息工程系·2007年編制
計算機科學與信息工程系·2007年編制
注:空間不夠,可以增加頁碼。計算機科學與信息工程系·2007年編制
第二篇:數(shù)據(jù)庫原理及應用實驗報告 6
實驗成績
《數(shù)據(jù)庫系統(tǒng)原理及應用》
實 驗 報 告 六
專業(yè)班級:
計算機科學與技術(shù)
學
號:
201116910233
姓
名:
范曉曈
指導教師:
蘇小玲
2013年
月
日 實驗六名稱:
SQL Server存儲過程
一、實驗內(nèi)容及要求
1.使用輸入?yún)?shù)存儲過程的創(chuàng)建和執(zhí)行
任務(wù)1:查詢學生的學號、姓名、選修的課程號、課程名、課程學分,將學生所在系作為輸入?yún)?shù),默認值為“軟件工程系”。執(zhí)行此存儲過程,并分別指定一些不同的輸入?yún)?shù)值,查看執(zhí)行過程。
2.修改視圖
任務(wù)1:查詢指定系的男生人數(shù),其中系為輸入?yún)?shù),人數(shù)為輸出參數(shù)。執(zhí)行此存儲過程,并分別指定一些不同的輸入?yún)?shù)值,查看執(zhí)行過程。
任務(wù)2:查詢指定學生(姓名)在指定學期的選課門數(shù)和考試平均成績,要求姓名和學期為輸入?yún)?shù),選課門數(shù)和平均成績用輸出參數(shù)返回,平均成績保留到小數(shù)點后兩位。
3.使用返回代碼存儲過程的創(chuàng)建和執(zhí)行
任務(wù)1:查詢指定學生(學號)的選課門數(shù)。如果指定學生不存在,則返回代碼1;如果指定的學生沒有選課,則返回代碼2;如果指定學生有選課,則返回代碼0,并用輸出參數(shù)返回該學生的選課門數(shù)。
4.使用實現(xiàn)對數(shù)據(jù)庫修改、刪除和插入操作的存儲過程創(chuàng)建和執(zhí)行
任務(wù)1:刪除指定學生(學號)的修課,如果指定的學生不存在,則顯示提示信息“沒有指定學生”;如果指定的學生沒有選課,則顯示提示信息“該學生沒有選課”。學號為輸入?yún)?shù)。
任務(wù)2:修改指定課程的開課學期。輸入?yún)?shù)為:課程號和修改后的開課學期。
任務(wù)3:在course表中插入一行數(shù)據(jù),課程號、課程名、學分、開課學期均為輸入?yún)?shù)。課程號為C100、課程名為操作系統(tǒng)、學分為
4、開課學期為4,開課學期的默認值為3。如果學分大于10或者小于1,則不插入數(shù)據(jù),并顯示提示信息“學分為1~10之間的整數(shù)”。
二、實驗目的
掌握存儲過程的創(chuàng)建和執(zhí)行;掌握存儲過程中輸入?yún)?shù)和輸出參數(shù)的設(shè)置和使用方法。
三、實驗步驟及運行結(jié)果
1.使用輸入?yún)?shù)存儲過程的創(chuàng)建和執(zhí)行
任務(wù)1:查詢學生的學號、姓名、選修的課程號、課程名、課程學分,將學生所在系作為輸入?yún)?shù),默認值為“軟件工程系”。執(zhí)行此存儲過程,并分別指定一些不同的輸入?yún)?shù)值,查看執(zhí)行過程。
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.修改視圖
任務(wù)1:查詢指定系的男生人數(shù),其中系為輸入?yún)?shù),人數(shù)為輸出參數(shù)。執(zhí)行此存儲過程,并分別指定一些不同的輸入?yún)?shù)值,查看執(zhí)行過程。
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
任務(wù)2:查詢指定學生(姓名)在指定學期的選課門數(shù)和考試平均成績,要求姓名和學期為輸入?yún)?shù),選課門數(shù)和平均成績用輸出參數(shù)返回,平均成績保留到小數(shù)點后兩位。
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 選課門數(shù),@avg_sscore as平均成績
3.使用返回代碼存儲過程的創(chuàng)建和執(zhí)行
任務(wù)1:查詢指定學生(學號)的選課門數(shù)。如果指定學生不存在,則返回代碼1;如果指定的學生沒有選課,則返回代碼2;如果指定學生有選課,則返回代碼0,并用輸出參數(shù)返回該學生的選課門數(shù)。
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.使用實現(xiàn)對數(shù)據(jù)庫修改、刪除和插入操作的存儲過程創(chuàng)建和執(zhí)行
任務(wù)1:刪除指定學生(學號)的修課,如果指定的學生不存在,則顯示提示信息“沒有指定學生”;如果指定的學生沒有選課,則顯示提示信息“該學生沒有選課”。學號為輸入?yún)?shù)。
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
任務(wù)2:修改指定課程的開課學期。輸入?yún)?shù)為:課程號和修改后的開課學期。
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
修改前:
修改后:
任務(wù)3:在course表中插入一行數(shù)據(jù),課程號、課程名、學分、開課學期均為輸入?yún)?shù)。課程號為C100、課程名為操作系統(tǒng)、學分為
4、開課學期為4,開課學期的默認值為3。如果學分大于10或者小于1,則不插入數(shù)據(jù),并顯示提示信息“學分為1~10之間的整數(shù)”。
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','操作系統(tǒng)',3.0,6
declare @kc_id char(20),@kc_name char(20),@xf decimal,@xq int exec p_insert 'C007','毛概',11.0,4
四、實驗心得
在這次實驗中,我明白了,存儲過程只在創(chuàng)造時進行編譯即可,以后每次執(zhí)行存儲過程都不需再重新編譯,而我們通常使用的SQL語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度,存儲過程一般用來完成數(shù)據(jù)查詢和數(shù)據(jù)處理操作。
無論什么時候執(zhí)行存儲過程,總要返回一個結(jié)果碼,用以指示存儲過程的執(zhí)行狀態(tài)。如果存儲過程執(zhí)行成功,返回的結(jié)果碼是0;如果存儲過程執(zhí)行失敗,返回的結(jié)果碼一般是一個負數(shù),它和失敗的類型有關(guān)。我們在創(chuàng)建存儲過程時,也可以定義自己的狀態(tài)碼和錯誤信息。
通過這次實驗,讓我深刻了解了數(shù)據(jù)庫的功能,覺得它功能非常的強大,掌握存儲過程的創(chuàng)建與執(zhí)行,熟悉存儲過程與批處理的區(qū)別。掌握帶參數(shù)的存儲過程的創(chuàng)建與執(zhí)行。
第三篇:數(shù)據(jù)庫應用基礎(chǔ)實驗報告
電子科技大學計算機學院實驗中心
電 子 科 技 大 學
實
驗
報
告
一、實驗一: 名稱 創(chuàng)建數(shù)據(jù)庫
二、實驗學時:4
三、實驗內(nèi)容和目的:
實驗要求學生掌握創(chuàng)建數(shù)據(jù)庫的方法及相關(guān)操作,并且創(chuàng)建一個包含五個表的數(shù)據(jù)庫STUD:系別代碼表 表名dep,教師表 表名teacher,學生表 表名stud,課程表 表名course,選課表 表名sc。
四、實驗原理:
本實驗主要是“ create table 表名
(列名1 類型1(not)null,列名2 類型2(not)null,……,primary key(列名));”語句的應用,來實現(xiàn)表的建立。同時還可能用到 “drop table 表名”,“alter table 表名 drop column 列名”等語句。
五、實驗器材(設(shè)備、元器件)
操作系統(tǒng):Windows 2000/XP 編程環(huán)境:SQL Server Management Studio
六、實驗步驟:
具體步驟見實驗指導書。
七、實驗數(shù)據(jù)及結(jié)果分析:
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));
八、實驗結(jié)論:
心得體會和改進建議:確實可以用create table語句實現(xiàn)數(shù)據(jù)庫表的創(chuàng)建,一開始就要想好各個表的分配和各種定義的合理性,避免以后大幅度的改動表。
一、實驗二: 名稱 備份和恢復
二、實驗學時:4
三、實驗內(nèi)容和目的:
向數(shù)據(jù)庫中添加樣本數(shù)據(jù),學習DB2數(shù)據(jù)庫的恢復和備份。
四、實驗原理:
利用分離與附加實現(xiàn)數(shù)據(jù)的備份與恢復。用“insert into 表名 values(列名1 類型1(not)null,列名2 類型2(not)null,……)”語句實現(xiàn)向表中添加數(shù)據(jù)。
電子科技大學計算機學院實驗中心
五、實驗器材(設(shè)備、元器件)
操作系統(tǒng):Windows 2000/XP 編程環(huán)境:SQL Server Management Studio
六、實驗步驟:
用附加命令載入數(shù)據(jù)庫,然后在相應新建查詢中用insert語句輸入準備的數(shù)據(jù)。
七、實驗數(shù)據(jù)及結(jié)果分析:
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','操作系統(tǒng)','6001',3);insert into course values('6003','數(shù)據(jù)結(jié)構(gòu)',null,3);insert into course values('6004','數(shù)據(jù)庫原理',null,3);insert into course values('6011','數(shù)據(jù)庫應用開發(fā)',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);
八、實驗結(jié)論、心得體會和改進建議:
插入數(shù)據(jù)要仔細,以免不必要的麻煩。
一、實驗三:
名稱
數(shù)據(jù)庫的完整性
二、實驗學時:4
三、實驗內(nèi)容和目的:
通過設(shè)置表的檢查約束、外鍵約束體會數(shù)據(jù)庫完整性的含義,約束條件下數(shù)據(jù)修改操作的限制,以及實現(xiàn)修改操作的技巧。
四、實驗原理:
用“alter table 表名 add constraint 約束名 check 條件”,“alter table 表名1 add constraint 外鍵名 foreign key(列名)references 表名2(列名)”分別實現(xiàn)檢查約束與設(shè)置外鍵約束的功能。以及用“delete from 表名 where 條件”,“update 表名 set 列名=()where 條件”來刪除和修改滿足條件的數(shù)據(jù)。
五、實驗器材(設(shè)備、元器件)
操作系統(tǒng):Windows 2000/XP 編程環(huán)境:
電子科技大學計算機學院實驗中心
SQL Server Management Studio
六、實驗步驟:
用附加命令載入數(shù)據(jù)庫,然后在相應新建查詢中輸入相應代碼。
七、實驗數(shù)據(jù)及結(jié)果分析:
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);
八、實驗結(jié)論、心得體會和改進建議:
注意按一定的習慣來書寫約束名和鍵名,以便利于修改和刪除。
一、實驗四: 名稱 數(shù)據(jù)的修改
二、實驗學時:4
三、實驗內(nèi)容和目的:
練習UPDATEV、DELETE命令的使用,實現(xiàn)對數(shù)據(jù)的修改和刪除。
四、實驗原理:
用“delete from 表名 where 條件”,“update 表名 set 列名=()where 條件”來刪除和修改滿足條件的數(shù)據(jù)。
五、實驗器材(設(shè)備、元器件)
操作系統(tǒng):Windows 2000/XP 編程環(huán)境:SQL Server Management Studio
六、實驗步驟:
用附加命令載入數(shù)據(jù)庫,然后在相應新建查詢中輸入相應代碼。
七、實驗數(shù)據(jù)及結(jié)果分析:
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);
八、實驗結(jié)論、心得體會和改進建議:
對于要修改和刪除的數(shù)據(jù)需要注意主外鍵。比如對于要修改被引用外鍵的數(shù)據(jù),需要先刪除被引用外鍵的數(shù)據(jù),才能順利修改或刪除。
電子科技大學計算機學院實驗中心
一、實驗五: 名稱 簡單查詢、多表查詢
二、實驗學時:4
三、實驗內(nèi)容和目的:
練習用SELECT查詢語句,設(shè)置查詢條件,實現(xiàn)單表查詢。練習使用SELECT語句從多個表中查詢數(shù)據(jù),表的內(nèi)連接、左外連接、右外連接的使用以及設(shè)置連接條件,理解連接條件和查詢條件的目的和功能上的區(qū)別。
四、實驗原理:
用“select 列名1(as 列名),列名2…… from 表名 where 查詢條件”來實現(xiàn)有條件的簡單查詢。用“select * from 表名1 join 表名2 on 連接條件 having(where)查詢條件”語句來實現(xiàn)多表連接查詢。以及用union,except,intersect來實現(xiàn)查找結(jié)果的并、差、交操作。還有用“datediff(year,生日,現(xiàn)在日期)”語句實現(xiàn)年齡的計算。
五、實驗器材(設(shè)備、元器件)
操作系統(tǒng):Windows 2000/XP 編程環(huán)境:SQL Server Management Studio
六、實驗步驟:
用附加命令載入數(shù)據(jù)庫,然后在相應新建查詢中輸入相應代碼。
七、實驗數(shù)據(jù)及結(jié)果分析:
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');
八、實驗結(jié)論、心得體會和改進建議:
用union,except,intersect實現(xiàn)查詢結(jié)果的并、差、交時,表的列數(shù)必須一樣,結(jié)果列名顯示前一個表的。查詢時,是根據(jù)引用的表及算法得出的一個集合,原來的表沒有任何變化。并且可以用“as 新列名”為查詢結(jié)果的列重新命名。多表連接查詢時,因為會有兩行的連接條件,不要用它作查詢條件。還有查詢項可以是引用表的表達式或函數(shù),查詢條件一樣可以。
一、實驗六: 名稱 分組統(tǒng)計查詢
二、實驗學時:4
三、實驗內(nèi)容和目的:
練習使用聚集函數(shù)count(),max(),min(),avg(),sum()等在SQL命令中實現(xiàn)統(tǒng)計功能。使用GROUP BY
電子科技大學計算機學院實驗中心
子句實現(xiàn)分組查詢,以及聚集函數(shù)在分組查詢中的應用。體會分組查詢的功能特點。
四、實驗原理:
用“select 列名,聚集函數(shù) from 表名 group by having查詢條件”或“select 列名,聚集函數(shù) from 表名 where 包含‘列名’的的查詢條件”來實現(xiàn)分組查詢。
五、實驗器材(設(shè)備、元器件)
操作系統(tǒng):Windows 2000/XP 編程環(huán)境:SQL Server Management Studio
六、實驗步驟:
用附加命令載入數(shù)據(jù)庫,然后在相應新建查詢中輸入相應代碼。
七、實驗數(shù)據(jù)及結(jié)果分析:
select count(*)as '選修數(shù)據(jù)庫課程的人數(shù)' from sc where cid='6003';select sid as '學號',count(cid)as '選課門數(shù)' from sc group by sid;select sid as '學號',sum(score)as '總成績' from sc group by sid;select count(sid)as '選修數(shù)據(jù)庫課且成績分以上人數(shù)' from sc where sid in(select sid from sc where cid='6003' and score>=60);select score as '數(shù)據(jù)庫課最高成績',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 '選課人數(shù)' 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);
八、實驗結(jié)論、心得體會和改進建議:
分組查詢作為查詢主體時,只能顯現(xiàn)分組列名和聚集函數(shù)部分。把他放在條件位置,作為查詢條件集合時,能夠?qū)崿F(xiàn)多列甚至是多表連接的多列的顯示。另外聚集函數(shù)可以不顯示,而作為查
詢條件出現(xiàn),跟在having后。
一、實驗七: 名稱 集合操作、子查詢
二、實驗學時:4
三、實驗內(nèi)容和目的:
IN、EXISTS、NOT EXISTS 運算在WHERE子句中的應用;靜態(tài)集合和由SELECT命令產(chǎn)生的動態(tài)結(jié)果集運算。
四、實驗原理:
子查詢即把查詢的結(jié)果當做另一個查詢的條件,通過嵌套語句來實現(xiàn)復雜的查詢。因為子查詢的結(jié)果很可能是一個集合,需要運用集合之間的運算,比如in、exists、not exists的運用。
五、實驗器材(設(shè)備、元器件)
操作系統(tǒng):Windows 2000/XP 編程環(huán)境:SQL Server Management Studio
六、實驗步驟:
用附加命令載入數(shù)據(jù)庫,然后在相應新建查詢中輸入相應代碼。
七、實驗數(shù)據(jù)及結(jié)果分析:
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');
八、實驗結(jié)論、心得體會和改進建議:
對于子查詢是集合的情況,是不能跟在=,>,<>等條件運算符后面的。對于聚集函數(shù)本身是查詢結(jié)果時,where和having后面只能定義與聚合函數(shù)有關(guān)的條件。可以通過添加子查詢的方式,來實現(xiàn)多條件查詢條件。
第四篇:河北工業(yè)大學數(shù)據(jù)庫原理及應用實驗實驗報告
《數(shù)據(jù)庫原理及應用實驗》
姓名:徐毅民學號: 153299
實驗報告
班級:網(wǎng)絡(luò)151 實驗1數(shù)據(jù)庫定義與操作語言實驗
實驗1.4數(shù)據(jù)更新實驗
1、實驗目的
熟悉數(shù)據(jù)庫的數(shù)據(jù)更新操作,能夠使用SQL語句對數(shù)據(jù)庫進行數(shù)據(jù)的插入、刪除、修改操作。
2、實驗內(nèi)容和要求
針對TPC-H數(shù)據(jù)庫設(shè)計數(shù)據(jù)單元組插入、批量數(shù)據(jù)插入、修改數(shù)據(jù)和刪除數(shù)據(jù)等SQL語句。理解和掌握INSERTT、UPDATE、和DELETE語法結(jié)構(gòu)的各個組成成分,結(jié)合嵌套SQL子查詢,分別設(shè)計幾種不同形式的插入、修改和刪除數(shù)據(jù)的語句,并調(diào)試成功。
3、實驗重點和難點
實驗重點:插入、修改和刪除數(shù)據(jù)的SQL 實驗難點:與嵌套SQL子查詢相結(jié)合的插入、修改和刪除數(shù)據(jù)的SQL語句;利用一個表的數(shù)據(jù)來插入、修改和刪除另一個表的數(shù)據(jù)。
4、實驗報告示例
(1)INSERT基本語句(插入全部列的數(shù)據(jù))插入一條顧客記錄,要求每列都給一個合理的值。
INSERT INTO Customer VALUES(30,'張三','北京市',40,'010-51001199',0.00,'Northeast','VIP Customer');(2)INSERT基本語句(插入部分列的數(shù)據(jù))插入一條訂單記錄,給出必要的幾個字段值。
INSERT INTO Lineitem(orderkey,Linenumber,partkey,suppkey,quantity,shipdate)VALUES(862,ROUND(RANDOM()*100,0,479,1,10,'2012-3-6');/*RANDOM()函數(shù)為隨機小數(shù)生成函數(shù),ROUND()為四舍五入函數(shù)*/(3)批量數(shù)據(jù)INSERT語句
① 創(chuàng)建一個新的顧客表,把所有中國籍顧客插入到新的顧客表中。
INSERT INTO NewCustomer/*批量插入SELECT 語句查詢結(jié)果到NewCustomer表中*/ SELECT C.* FROM Costomer C,Nation N WHERE C.nationkey=N.nationkey AND N.name='中國';②創(chuàng)建一個顧客購物統(tǒng)計表,記錄每個顧客及其購物總數(shù)和總價等信息。
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 ③倍增零件表的數(shù)據(jù),多次重復執(zhí)行,直到總記錄數(shù)達到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語句(利用一個表中的數(shù)據(jù)修改另外一個表中的數(shù)據(jù))
利用Part表中的零售價格來修改
Lineitem
中的extendedprice,其中
/*找出要修改的那些記錄*/
/*對分組后的數(shù)據(jù)求總和*/ 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語言有關(guān)視圖的操作,能夠熟練使用SQL語句來創(chuàng)建需要的視圖,定義數(shù)據(jù)庫外模式,并能使用所創(chuàng)建的視圖實現(xiàn)數(shù)據(jù)管理。
2、實驗內(nèi)容和要求
針對給定的數(shù)據(jù)庫模式,以及相應的應用需求,創(chuàng)建視圖和帶WITH CHECK OPTION的視圖,并驗證視圖WITH CHECK OPTION選項的有效性。理解和掌握視圖消除執(zhí)行原理,掌握可更新視圖和不可更新視圖的區(qū)別。
3、實驗重點和難點 實驗重點:創(chuàng)建視圖。
實驗難點:可更新的視圖和不可更新的視圖之區(qū)別,WITH CHECK OPTION的驗證。
4、實驗報告示例
(1)創(chuàng)建視圖(省略視圖列名)
創(chuàng)建一個“海大汽配”供應商供應的零件視圖V_DLMU_PartSupp1,要求列出供應零件的編號、零件名稱、可用數(shù)量、零售價格、供應價格和備注等信息。
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)創(chuàng)建視圖(不能省略列名的情況)
創(chuàng)建一個視圖V_CustAvgOrder,按顧客統(tǒng)計平均每個訂單的購買金額和零件數(shù)量,要求輸出 顧客編號、姓名,平均購買金額和平均購買零件數(shù)量。
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)創(chuàng)建視圖(WITH CHECK OPTION)
使用WITH CHECK OPTION,創(chuàng)建一個“海大汽配”供應商供應的零件視圖V_DLMU_PartSupp2,要求列出供應零件的編號、可用數(shù)量和供應價格等信息。然后通過該視圖分別增加、刪除和修改一條“海大汽配”零件供應記錄,驗證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,創(chuàng)建一個“海大汽配”供應商供應的零件視圖V_DLMU_PartSupp4,要求列出供應零件的編號、可用數(shù)量和供應價格等信息。然后通過該視圖分別增加、刪除和修改一條“海大汽配”零件供應記錄,驗證該視圖是否是可更新的,并比較上述“(3)創(chuàng)建視圖”實驗任務(wù)與本任務(wù)結(jié)果有何異同。
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)
創(chuàng)建顧客訂購零件明細視圖V_CustOrd,要求列出顧客編號、姓名、購買零件數(shù)、金額,然后在該視圖的基礎(chǔ)上,在創(chuàng)建(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、實驗目的
掌握索引設(shè)計原則和技巧,能夠創(chuàng)建合適的索引以提高數(shù)據(jù)庫查詢、統(tǒng)計分析效率。
2、實驗內(nèi)容和要求
針對給定的數(shù)據(jù)庫模式和具體應用要求,創(chuàng)建唯一索引、函數(shù)索引、復合索引等;修改索引;刪除索引。設(shè)計相應的SQL查詢驗證索引有效性。學習利用EXPLAIN命令分析SQL查詢是否使用了所創(chuàng)建的索引,并能夠分析其原因,執(zhí)行SQL查詢并估算索引提高查詢效率的百分比。要求實驗數(shù)據(jù)集達到10萬條記錄以上的數(shù)據(jù)量,以便驗證索引效果。
3、實驗重點和難點 實驗重點:創(chuàng)建索引。
實驗難點:設(shè)計SQL查詢驗證索引有效性。
4、實驗報告示例
/*在視圖V_CustOrd上再創(chuàng)建視圖*/(1)創(chuàng)建唯一索引
在零件表的零件名稱字段上創(chuàng)建唯一索引。
CREATE UNIQUE INDEX Idx_part_nameON Part(name);(3)創(chuàng)建復合索引(對兩個及兩個以上的屬性創(chuàng)建索引,稱為復合索引)
在零件表的制造商和品牌兩個字段上創(chuàng)建一個復合索引。
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)*驗證索引效率
創(chuàng)建一個函數(shù)TestIndex,自動計算sql查詢執(zhí)行的時間。
CREATE FUNCTION TestIndex(p_part_name CHAR(55))RETURN INTEGER AS /*自定義函數(shù)TestIndex():輸入?yún)?shù)為零件名稱,返回SQL查詢的執(zhí)行時間*/ DECLARE begintime TIMESTAMP;endtime TIMESTAMP;durationtime INTEGER;BEGN SELECT CLOCK_TIMESTAMP()INTO begintime;/*記錄查詢執(zhí)行的開始時間*/ PERFORM *FROM Part WHERE name=p_partname;/*執(zhí)行SQL查詢,不保存查詢結(jié)果*/ SELECT CLOCK_TIMESTAMP()INTO endtime;SELECT DATEDIFF(?ms?,begintime,endtime)INTO durationtime;
RETURN durationtime;
END;/*查看當零件表Part數(shù)據(jù)模型比較小,并且無索引時的執(zhí)行時間*/ SELECT TestIndex(?零件名稱?);
INSERT INTO Part
/*不斷倍增零件表的數(shù)據(jù),直到50萬條記錄*/
/*計算并返回查詢執(zhí)行時間,時間單位為毫秒ms*/ SELECT partkey+(SELECT COUNT(*)FROM Part), Name,mfgr,brand,type,size,container,retailprice,comment FRPM Part;/*查看當零件表Part數(shù)據(jù)模型比較大,但無索引時的執(zhí)行時間*/ SELECT TestIndex(?零件名稱?);
CREATE INDEX part_name ON Part(name);索引*/ /*查看零件表Part數(shù)據(jù)規(guī)模比較大,有索引時的執(zhí)行時間*/ SELECT TestIndex();
/*在零件表的零件名稱字段上創(chuàng)建
實驗2 安全性語言實驗
實驗2.1
自主存取控制實驗
1、實驗目的
掌握自主存取控制缺陷的定義和維護方法。
2、實驗內(nèi)容和要求
定義用戶、角色,分配權(quán)限給用戶、角色,回收權(quán)限,以相應的用戶名登錄數(shù)據(jù)庫驗證權(quán)限分配是否正確。選擇一個應用場景,使用自主存取控制機制設(shè)置權(quán)限分配??梢圆捎脙煞N方案。
方案一:采用SYSTEM超級用戶登錄數(shù)據(jù)庫,完成所有權(quán)限分配工作,然后用相應用戶名登錄數(shù)據(jù)庫已驗證權(quán)限分配正確性;
方案二:采用SYSTEM用戶登錄數(shù)據(jù)庫創(chuàng)建3個部門經(jīng)理用戶,并分配相應的權(quán)限,然后分別用3個經(jīng)理用戶名登錄數(shù)據(jù)庫,創(chuàng)建相應部門的USER、ROLE,并分配相應權(quán)限。
下面的實驗報告示例采用了實驗方案一。驗證權(quán)限分配之前,請備份好數(shù)據(jù)庫,針對不同的用戶所具有的權(quán)限,分別設(shè)計相應的SQL語句加以驗證。
3、實驗重點和難點
實驗重點:定義角色,分配權(quán)限和回收權(quán)限。實驗難點:實驗方案二實現(xiàn)權(quán)限的再分配和回收。
4、實驗報告示例(1)創(chuàng)建用戶 為采購、銷售和客戶管理等3個部門的經(jīng)理創(chuàng)建用戶標識,要求具有創(chuàng)建用戶或角色的○權(quán)利。
CREATE USER David WITH CREATEROLE PASSWORD '123456';CREATE USER Tom WITH CREATEROLE PASSWORD '123456';CREATE USER Kathy WITH CREATEROLE PASSWORD '123456';2為采購、銷售和客戶管理等3個部門的職員創(chuàng)建用戶標識和用戶口令?!餋REATE USER Jeffery WITH PASSWORD '123456';CREATE USER Jane WITH PASSWORD '123456';CREATE USER Mike WITH PASSWORD '123456';(2)創(chuàng)建角色并分配權(quán)限
1為各個部門分別創(chuàng)建一個查詢角色,并分配相應的查詢權(quán)限?!餋REATE 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為各個部門分別創(chuàng)建一個職員角色,對本部門信息具有查看、插入權(quán)限?!餋REATE 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為各個部門創(chuàng)建一個經(jīng)理角色,相應角色對本部門的信息具有完全控制權(quán)限,對其他部門○的信息具有查詢權(quán)。經(jīng)理有權(quán)給本部門資源分配權(quán)限。
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)給用戶分配權(quán)限 1給部門經(jīng)理分配權(quán)限?!餑RANT PurchaseManagerRole TO David WITH ADMIN OPTION;GRANT SaleManagerRole TO Tom WITH ADMIN OPTION;GRANT CustomerManagerRole TO Kathy WITH ADMIN OPTION;2給各部門職員分配權(quán)限 ○GRANT PurchaseEmployeeRole TO Jeffery;GRANT SaleEmployeeRole TO Jane;GRANT CustomerEmployeeRole TO Mike;(4)回收角色或用戶權(quán)限
1收回客戶經(jīng)理角色的銷售信息查看權(quán)限?!餜EVOKE SaleQueryRole FROM CustomerManagerRole;2回收MIKE的客戶部門職員權(quán)限?!餜EVOKE CustomerEmployeeRole FROM Mike;(5)驗證權(quán)限分配正確性
1以David用戶名登錄數(shù)據(jù)庫,驗證采購部門經(jīng)理的權(quán)限 ○SELECT * FROM Part;DELETE * FROM Order;2回收MIKE的客戶部門職員權(quán)限 ○SELECT * FROM Customer;SELECT * FROM Part;實驗2.2
審計實驗
1、實驗目的
掌握數(shù)據(jù)庫審計的設(shè)置和管理方法,以便監(jiān)控數(shù)據(jù)庫操作,維護數(shù)據(jù)庫安全。
2、實驗內(nèi)容和要求
打開數(shù)據(jù)庫審計開關(guān)。以具有審計權(quán)限的用戶登錄數(shù)據(jù)庫,設(shè)置審計權(quán)限,然后以普通用戶登錄數(shù)據(jù)庫,執(zhí)行相應的數(shù)據(jù)操縱sql語句,驗證相應審計設(shè)置是否生效,最后在一具有審計權(quán)限的用戶登錄數(shù)據(jù)庫,查看是否存在相應的審計信息。
3、實驗重點和難點
實驗重點:數(shù)據(jù)庫對象級審計,數(shù)據(jù)庫語句級審計。
實驗難點:合理地設(shè)置各種審計信息。一方面,為了保護系統(tǒng)重要的敏感數(shù)據(jù),需要系統(tǒng)地設(shè)置各種審計信息,不能留有各種漏洞,以便隨時監(jiān)督系統(tǒng)使用情況,一旦出現(xiàn)問題也便于追查;另一方面,審計信息設(shè)置過多會嚴重影響數(shù)據(jù)庫的使用性能,因此需要合理配置。
4、實驗報告示例(1)審計開關(guān)
1顯示當前審計開關(guān)狀態(tài) ○SHOW AUDIT_TRAIL;2打開審計開關(guān) ○SET AUDIT_TRAIL TO ON;(2)數(shù)據(jù)庫操作審計
1對客戶信息表上的刪除操作設(shè)置審計?!餉UDIT DELETE ON Sales.Customer BY ACCESS;2以普通用戶登錄,執(zhí)行sql語句?!餌ELETE Sales.Customer WHERE custkey=1011;3查看數(shù)據(jù)庫對象審計信息,驗證審計設(shè)置是否生效?!餝ELECT * FROM SYS_AUDIT_OBJECT;(3)語句級審計
1對表定義的更改語句ALTER設(shè)置審計 ○AUDIT ALTER TABLE BY ACCESS;2查看所有數(shù)據(jù)庫所有語句級審計設(shè)置,驗證審計設(shè)置是否生效 ○SELECT * FROM SYS_STMT_AUDIT_OPTS;3以普通用戶登錄,執(zhí)行sql語句,驗證審計設(shè)置是否生效 ○ALTER TABLE Customer ADD COLUMN tt INT;4查看所有審計信息 ○SELECT * FROM SYS_AUDIT_TRAIL;
四、實驗心得
通過本次實驗,知道了定義用戶、角色,分配權(quán)限給用戶、角色,回收權(quán)限,并以相應的用戶名登陸數(shù)據(jù)庫驗證權(quán)限分配是否正確的方法。并且知道了數(shù)據(jù)庫審計的目的和方法。做實驗的同時,對sql語句有了更熟練的運用。
實驗3 完整性語言實驗
實驗3.1 實體完整性實驗
1、實驗目的
掌握實體完整性的定義和維護方法。
2、實驗內(nèi)容和要求
定義實體完整性,刪除實體完整性。能夠?qū)懗鰞煞N方式定義實體完整性的SQL語句:創(chuàng)建表時定義實體完整性、創(chuàng)建表后定義實體完整性。設(shè)計SQL語句驗證完整性約束是否起作用。
3、實驗重點和難點
實驗重點:創(chuàng)建表時定義實體完整性。實驗難點:有多個候選碼時實體完整性的定義。
4、實驗報告示例
(1)創(chuàng)建表時定義實體完整性(列級實體完整性)
定義供應商表的實體完整性。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)創(chuàng)建表時定義實體完整性(表級實體完整性)
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)創(chuàng)建表后定義實體完整性 定義供應商表。
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)定義實體完整性(主碼由多個屬性組成)定義供應關(guān)系表的實體完整性。
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.主碼的各個屬性有空。
違約處理:拒絕執(zhí)行、級聯(lián)執(zhí)行等操作。
實驗3.2 參照完整性實驗
1、實驗目的
掌握參照完整性的定義和維護方法。
2、實驗內(nèi)容和要求
定義參照完整性,定義參照完整性的違約處理,刪除參照完整性。寫出兩種方式定義參照完整性的SQL語句:創(chuàng)建表時定義參照完整性、創(chuàng)建表后定義參照完整性。
3、實驗重點和難點
實驗重點:創(chuàng)建表時定義參照完整性。實驗難點:參照完整性的違約處理定義。
4、實驗報告示例
(1)創(chuàng)建表時定義參照完整性
先定義地區(qū)表的實體完整性,再定義國家表的參照完整性。
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)創(chuàng)建表后定義參照完整性
定義國家表的參照完整性。
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),F(xiàn)OREIGN KEY(partkey,suppkey)REFERENCES PartSupp(partkey,suppkey));(4)定義參照完整性的違約處理
定義國家表的參照完整性,當刪除或修改被參照表記錄時,設(shè)置參照表中相應記錄的值為空。
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’號地區(qū)記錄不存在,違反參照完整性約束*/ INSERT INTO nation(nationkey,name,regionkey,comment)VALUES(1001,?nation1?,1001,?comment1?);
實驗3.3用戶自定義完整性實驗
1、實驗目的
掌握用戶自定義完整性的定義和維護方法。
2、實驗內(nèi)容和要求
針對具體應用語義,選擇NULL/NOT NULL、DEFAULT、UNIQUE、CHECK等,定義屬性上的約束條件。
3、實驗重點和難點
實驗重點:NULL/NOT NULL、DEFAULT。實驗難點:CHECK。
4、實驗報告示例
(1)定義屬性NULL/NOT NULL約束 定義地區(qū)表各屬性的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值,表示其他地區(qū)。
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;
第五篇:數(shù)據(jù)庫基礎(chǔ)與應用實驗報告
《數(shù)據(jù)庫基礎(chǔ)與應用》實驗報告
實驗名稱 《ACCESS 之 窗體的操作》
一、實驗目的:
1、掌握使用“窗體向?qū)А?創(chuàng)建基于一個表或查詢的“窗體”的方法。
2、掌握使用“窗體向?qū)А眲?chuàng)建“數(shù)據(jù)透視表窗體”的方法。
3、掌握使用“窗體向?qū)А眲?chuàng)建“圖表窗體”的方法。
4、掌握“自動創(chuàng)建窗體:縱欄式”和“自動創(chuàng)建窗體:表格式”的方法。
5、掌握用“圖表向?qū)А焙汀皵?shù)據(jù)透視表向?qū)А眲?chuàng)建窗體的方法。
6、掌握在窗體中輸入和編輯數(shù)據(jù)的方法。
7、掌握窗體美化的方法和常用控件的使用。
8、掌握同時創(chuàng)建“主/子窗體”的方法。
二、實驗要求:
1、閱讀主教材中與本實驗有關(guān)的知識以及本實驗的內(nèi)容和操作步驟。
2、任選一種方法在計算機上創(chuàng)建“窗體”。
3、任選一種方法在計算機上創(chuàng)建“主/子窗體”。
4、用“設(shè)計視圖”創(chuàng)建一個主菜單窗體。
5、設(shè)置窗體外觀(包括字體、背景、聲音和添加控件等)。
6、對于有余力的同學,可以在計算機上用多種方法創(chuàng)建和設(shè)計“窗體”,并進行分析比較。
注意:此實驗不需要書寫實驗報告,只需上機實際操作練習。
三、實驗內(nèi)容:
1、以 “教師情況一覽表”為數(shù)據(jù)源,創(chuàng)建縱欄式“教師情況一覽表窗體1”,并在該窗體中添加一條記錄。
2、以“教師情況一覽表”為數(shù)據(jù)源,創(chuàng)建表格式“教師情況一覽表窗體2”。
3、以“教師任課表”為數(shù)據(jù)源,使用“窗體向?qū)А眲?chuàng)建“教師任課表窗體1”,并將窗體布局設(shè)為“數(shù)據(jù)表”,窗體樣式設(shè)為“國際”。
4、以“教師任課表”為數(shù)據(jù)源,使用“圖表向?qū)А眲?chuàng)建“教師任課表拼圖”,并用“拼圖”方式顯示各系開課情況。
5、以“教師任課表”為數(shù)據(jù)源,使用“數(shù)據(jù)透視表向?qū)А眲?chuàng)建“各系教師任課數(shù)據(jù)透視表”,要求能統(tǒng)計每個系每個教師任課總學時數(shù)。
6、創(chuàng)建帶有子窗體的窗體,其中主窗體以“教師情況一覽表”為數(shù)據(jù)源,用于顯示教師情況(顯示“教師姓名”、“性別”、“職稱”和“系(部門)ID”字段),子窗體包含在主窗體中,用于顯示相應的教師任課情況(顯
示“課程名稱”、“學時”和“考試類型”字段);使用主窗體上的“記錄定位器”可以在不同教師記錄之間移動,此時子窗體中的教師任課情況隨之發(fā)生變化。
7、設(shè)計“教師教學信息管理系統(tǒng)”主菜單窗體,該系統(tǒng)包括查詢、更新和退出三個功能。當點擊“查詢”按鈕時,進入“查詢”子菜單;點擊“更新”按鈕時,進入“更新”子菜單;當點擊“退出”按鈕時,關(guān)閉主菜單“窗體”,返回到數(shù)據(jù)庫窗口下。
注意:具體的實驗報告內(nèi)容請參看上機實驗指導書。