华工数据库实验题.docx

上传人:b****3 文档编号:11150747 上传时间:2023-05-29 格式:DOCX 页数:14 大小:58.83KB
下载 相关 举报
华工数据库实验题.docx_第1页
第1页 / 共14页
华工数据库实验题.docx_第2页
第2页 / 共14页
华工数据库实验题.docx_第3页
第3页 / 共14页
华工数据库实验题.docx_第4页
第4页 / 共14页
华工数据库实验题.docx_第5页
第5页 / 共14页
华工数据库实验题.docx_第6页
第6页 / 共14页
华工数据库实验题.docx_第7页
第7页 / 共14页
华工数据库实验题.docx_第8页
第8页 / 共14页
华工数据库实验题.docx_第9页
第9页 / 共14页
华工数据库实验题.docx_第10页
第10页 / 共14页
华工数据库实验题.docx_第11页
第11页 / 共14页
华工数据库实验题.docx_第12页
第12页 / 共14页
华工数据库实验题.docx_第13页
第13页 / 共14页
华工数据库实验题.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

华工数据库实验题.docx

《华工数据库实验题.docx》由会员分享,可在线阅读,更多相关《华工数据库实验题.docx(14页珍藏版)》请在冰点文库上搜索。

华工数据库实验题.docx

华工数据库实验题

1,创建Student数据库,包括Students,Courses,SC表,表结构如下:

Students(SNO,SNAME,SEX,BDATE,HEIGHT,DEPARTMENT)

Courses(CNO,CNAME,LHOUR,CREDIT,SEMESTER)

SC(SNO,CNO,GRADE)

(注:

下划线表示主键,斜体表示外键),并插入一定数据。

答:

createtableStudents

SNOvarchar(100)primarykey,

SNAMEvarchar(100)null,

SEXvarchar(100)null,

BDATEdatetimenull,

HEIGHTdecimalnull,

DEPARTMENTvarchar(100)null

go

createtableCourses

CNOvarchar(100)primarykey,

CNAMEvarchar(100)null,

LHOURintnull,

CREDITintnull,

SEMESTERvarchar(100)null

go

CREATETABLE[dbo].[SC](

[SNO]varchar(100)NOTNULL,

[CNO]varchar(100)NOTNULL,

[GRADE][int]NULL,

CONSTRAINT[PK_SC]PRIMARYKEYCLUSTERED

[SNO]ASC,

[CNO]ASC

)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]

)ON[PRIMARY]

GO

ALTERTABLE[dbo].[SC]WITHCHECKADDCONSTRAINT[FK_SC_Courses]FOREIGNKEY([CNO])

REFERENCES[dbo].[Courses]([CNO])

GO

ALTERTABLE[dbo].[SC]CHECKCONSTRAINT[FK_SC_Courses]

GO

ALTERTABLE[dbo].[SC]WITHCHECKADDCONSTRAINT[FK_SC_Students]FOREIGNKEY([SNO])

REFERENCES[dbo].[Students]([SNO])

GO

ALTERTABLE[dbo].[SC]CHECKCONSTRAINT[FK_SC_Students]

2.完成如下的查询要求及更新的要求。

(1)查询身高大于1.80m的男生的学号和姓名;

答:

selectSNO,SNAMEfromStudentswhereHEIGHT>1.8

(2)查询计算机系秋季所开课程的课程号和学分数;

答:

selectCNO,CREDITfromCourseswhereSEMESTER='秋季'

(3)查询选修计算机系秋季所开课程的男生的姓名、课程号、学分数、成绩;

答:

selects.SNAME,SC.CNO,c.CREDIT,SC.GRADEfromstudentss

innerjoinSConsc.SNO=s.SNO

innerjoinCoursesconsc.CNO=c.CNO

wheres.DEPARTMENT='计算机系'ands.SEX='男'andc.SEMESTER='秋季'

(4)查询至少选修一门电机系课程的女生的姓名(假设电机系课程的课程号以EE开头);

答:

selectdistincts.snamefromStudentss,scwheres.sno=sc.snoands.sex='女'andolike'EE%'

(1)统计各系的男生和女生的人数。

答:

selectdepartment,

sum(casewgensex='男'then1else0end),

sum(casewgensex='女'then1else0end),

count(sno)fromstudentsgroupbydepartmentorderbydepartment;

(2)列出学习过‘编译原理’,‘数据库’或‘体系结构’课程,且这些课程的成绩之一在90分以上的学生的名字。

答:

selectsname

fromstudentsnaturaljoinscnaturaljoincourses

wherecname='编译原理'orcname='数据库'orcname='体系结构'andgrade>90;

(3)列出未修选‘电子技术’课程,但选修了‘数字电路’或‘数字逻辑’课程的学生数。

答:

selectcount(distincisc.sno)fromcourses,sc.snonotin

(selectsc.snofromo=oandcname='电子技术')

andoin(selectcnofromcourseswherecname='数字逻辑'orcname='数字电路')

(4)按课程排序列出所有学生的成绩,尚无学生选修的课程,也需要列出,相关的学生成绩用NULL表示。

答:

selectdistincto,ame,sno,gradefromcoursesleftjoinscon(o-o)

groupbyo,ame,sno,grade

orderbyo,ame,sno,grade;

(5)列出平均成绩最高的学生名字和成绩。

(SELECT句中不得使用TOPn子句)

答:

selectsname,r

from(selectsname,avg(grade)asfromstudents,scwherestudents.sno=sc.snogroupbysname,students.snoorderbyrdesc)

whererownum=1;

4.选做题:

对每门课增加“先修课程”的属性,用来表示某一门课程的先修课程,每门课程应可记录多于一门的先修课程。

要求:

1)修改表结构的定义,应尽量避免数据冗余,建立必要的主键,外键。

2)设计并插入必要的测试数据,完成以下查询:

列出有资格选修数据库课程的所有学生。

(该学生已经选修过数据库课程的所有先修课,并达到合格成绩。

注意:

须设计每个查询的测试数据,并在查询之前用INSERT语句插入表中。

 

实验二:

数据库的安全和完整性约束

实验要求:

1.采用实验一的建库脚本和数据插入脚本创建Student数据库,并完成以下操作:

1)新增表Credits(SNO,SumCredit,NoPass),表示每学生已通过选修课程的合计学分数,以及不及格的课程数。

答:

createtableCredits

(SNOvarchar(100),

SumCreditint,

NoPassint)

2)创建视图Student_Grade(Sname,Cname,Grade),表示学生选修课程及成绩的详细信息。

答:

createviewStudent_Grade

as

selects.SNAME,c.CNAME,SC.GRADEfromstudentss

innerjoinSConsc.SNO=s.SNO

innerjoinCoursesconsc.CNO=c.CNO

2.在数据库中创建以下触发器:

1)Upd_Credit

要求:

当在SC表中插入一条选课成绩,自动触发Upd_Credit,完成在Credits表中修改该学生的合计学分数和不及格的课程数。

答:

createtriggerUpd_CreditonSCforinsert

as

declare@SNOvarchar(100),@CNOvarchar(100),@GRADEint,@NoPassint,@CREDITint

select@SNO=SNO,@CNO=CNO,@GRADE=GRADE,@NoPass=(casewhenGRADE<60then1else0end)frominserted

select@CREDIT=CREDITfromCourseswhereCNO=@CNO

updateCredits

setSumCredit=SumCredit+@CREDIT,

NoPass=NoPass+@NoPass

whereSNO=@SNO

2)Upd_StuView (Insteadof触发器)

要求:

当对视图Student_Grade作插入数据项操作时,自动触发Upd_StuView,完成对SC表的插入操作。

如:

当执行InsertintoStudent_Gradevalues(‘王刚’,’数据库’,54)

则触发器完成另一插入操作:

InsertintoSCvalues(‘980201’,’CS-110’,54)

另外,需要检查当前插入的学生和课程是否已在Students,和Courses表中存在,如不存在,不执行任何操作,并提示用户错误信息。

答:

createtriggerUpd_StuViewonStudent_Gradeforinsert

as

declare@SNAMEvarchar(100),@CNAMEvarchar(100),@GRADEint

select@SNAME=SNAME,@CNAME=CNAME,@GRADE=GRADEfrominserted

IF(EXISTS(SELECT*FROMStudentsWHERESNAME=@SNAME)AND

EXISTS(SELECT*FROMCoursesWHERECNAME=@CNAME))

BEGIN

InsertintoSC

select(SELECTTOP1SNOFROMStudentsWHERESNAME=@SNAME),

(SELECTTOP1CNOFROMCoursesWHERECNAME=@CNAME),

@GRADE

END

3)PK_SC,FK_SC_SNO,FK_SC_CNO)  (选做)

要求:

首先删除SC中所有主键和外键定义,用触发器实现表SC上的主键(SNO,CNO)和外键SNO,CNO的约束定义。

3.为Student数据库设计安全机制。

要求:

在该数据库系统中,有三类用户:

1)学生,权限包括:

查询所有的课程信息,根据学号和课程号来查询成绩。

但不允许修改任何数据。

(必做)

只能查询自己的成绩,不能查询别人的成绩。

(选做)

2)老师:

权限包括:

查询有关学生及成绩的所有信息,有关课程的所有信息,但不允许修改任何数据。

答:

CREATE TRIGGER secure_student  

BEFORE UPDATE OR DELETE ON database

BEGIN  

IF((selectuserfromdual)='老师')  

THEN  

RAISE_APPLICATION_ERROR(-20506,  

'您没有权限对学生表进行修改.') 

3)教务员:

权限包括:

查询和修改任何有关学生和课程的信息,但不允许查询和修改数据库中其它任何表,视图等数据库对象。

答:

CREATE TRIGGER secure_student  

BEFORE UPDATE OR DELETE ON databaseEXCEPTStudents

BEGIN  

IF((selectuserfromdual)='教务员')  

THEN  

RAISE_APPLICATION_ERROR(-20506,  

'您没有权限进行修改.')

要求:

安全控制必须仅由数据库一端来实现,不考虑由应用程序来控制。

为此,需要创建三个用户,登录时密码验证;分别授予各类权限,并测试权限的控制是否有效。

实验三:

SQL编程

实验要求:

1.采用实验一的建库脚本和数据插入脚本创建Student数据库。

2.在数据库中创建以下存储过程:

1)Add_Student(SNO,SNAME,SEX,BIRTHDAY,HEIGHT,DEPT)

要求:

根据输入参数,插入一条学生记录。

答:

createprocedureAdd_Student

@SNOvarchar(100),

@SNAMEvarchar(100),

@SEXvarchar(10),

@BIRTHDAYdatetime,

@HEIGHTdecimal,

@DEPTvarchar(100)

as

insertintoStudents

values(

@SNO,

SNO,

@SNAME,

@SEX,

@BIRTHDAY,

@HEIGHT,

@DEPT

2)Upd_Grade(SNO,CNO,GRADE)

要求:

根据输入参数,修改某学生选课的成绩。

答:

createprocedureUpd_Grade

@SNOvarchar(100),

@CNOvarchar(100),

@GRADEINT

as

UPDATESC

setSNO=@SNO,

CNO=@CNO,

GRADE=@GRADE

whereSNO=@SNOandCNO=@CNO

3)Disp_Student(SNO,SUM_CREDIToutput,AVG_GRADEoutput)

要求:

根据SNO参数显示该学生的有关信息,包括:

a)学号,姓名,性别,年龄,身高,系别,所有选修的课程及成绩;

b)显示输出参数SUM_CREDIT(表示选修课程的总学分)及AVG_GRADE(表示3学分以上的课程的平均成绩)。

答:

createprocedureUpd_Grade

@SNOvarchar(100),

@SUM_CREDITINToutput,

@AVG_GRADEintoutput

as

select*fromStudentss

innerjoinSConsc.SNO=s.SNO

innerjoinCoursesconsc.CNO=c.CNO

wheres.SNO=@SNO

select@SUM_CREDIT=SumCreditfromCredits

whereSNO=@SNO

select@AVG_GRADE=avg(SC.GRADE)fromStudentss

innerjoinSConsc.SNO=s.SNO

wheres.SNO=@SNOandSC.GRADE>3

groupbys.SNO

4)CAL_GPA(SNO,GPAoutput)

要求:

根据SNO参数,输出并显示该学生的GPA值。

计算方法如下:

GRADE(G)GRADEPOINT(GP)

G>=854

85>G>=753

75>G>=602

60>G1

GPA=(∑GP*CREDIT)/∑CREDIT)

答:

createprocedureCAL_GPA

@SNOvarchar(100),

@GPAdecimaloutput

as

declare@SUM_CREDITint,@AVG_GRADEint,@All_CREDITint

select@SUM_CREDIT=SumCreditfromCredits

whereSNO=@SNO

select@AVG_GRADE=avg(casewhenSC.GRADE>=85then4when85>SC.GRADEandSC.GRADE>=75then3when75>SC.GRADEandSC.GRADE>=60then2when60>SC.GRADEthen1end)fromStudentss

innerjoinSConsc.SNO=s.SNO

wheres.SNO=@SNOandSC.GRADE>3

groupbys.SNO

select@GPA=(@AVG_GRADE*@SUM_CREDIT)/@All_CREDIT

3.选做题:

使用其它程序设计语言编程,连接数据库并提交SQL语句,显示查询结果。

要求:

实现上题中的第3)小题要求,设计一个图形界面来输入查询的参数SNO,及显示查询的结果。

(如采用VC++,VB等)

 

实验四:

事务的管理(选作)

实验要求:

1.采用实验一的建库脚本和数据插入脚本创建Student数据库。

2.测试事务隔离级别,要求:

分别设置不同的隔离级别,包括:

SETTRANSACTIONISOLATIONLEVELSERIALIZABLE;

SETTRANSACTIONISOLATIONLEVELREADCOMMITTED;

SETTRANSACTIONISOLATIONLEVELREADONLY;

两个并发事务交错执行的程序,能分别显示每种隔离级别下,是否出现丢失更新,脏读,读值不可复现以及幻象四种情况。

3.备份与恢复

Ø备份数据库

答:

BACKUPDATABASEtest

TOdisk='c:

\test'

Ø删除sc表

答:

DROPTABLESC

Ø恢复到删除之前

答:

USEmaster

GO

RESTOREDATABASEtest_wt

FROMdisk='c:

\test_wt'

GO

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2