数据库实验报告.docx
《数据库实验报告.docx》由会员分享,可在线阅读,更多相关《数据库实验报告.docx(32页珍藏版)》请在冰点文库上搜索。
数据库实验报告
实验1.1
(1)
原因是percent好像是系统的关键字。
忘记了加主键网上查有这个,如果没设NOTnull,先设好
同样方法设置PRODUENTS表却有问题,提示
已经有PRODUENTS对象,无法添加完整性约束。
后上网发现原来,constraint后是完整性约束的名字,上面的成功因为打错字。
2)
(3)
(4)
(5)
1.2
实验1.2
1.2
(1)select*fromCOURSES
(2)selectsidfromCHOICES
wherecidisnotnull
(3)selectCIDfromCOURSES
wherehour<88
(4)selectsidfromCHOICES
groupbysid
havingsum(score)>400
selectscorefromCHOICES
wheresid=822863200
(5)
selectcount(DISTINCTCID)fromCOURSES
(6)selectCID,count(CID)fromCHOICES
GROUPBYCID
(7)selectsidfromCHOICES
wherescore>60
groupbysid
havingcount(*)>2
(8)selectsid,count(cid),avg(score)fromCHOICES
groupbysid
(9)
SELECTSNAME,STUDENTS.SID
FROMCOURSES,STUDENTS,CHOICES
WHERECOURSES.CID=CHOICES.CID
ANDCHOICES.SID=STUDENTS.SID
ANDCNAME='Java'
结果:
共6110条记录
(10)
使用等值连接:
SELECTCID,SCORE
FROMSTUDENTS,CHOICES
WHERECHOICES.SID=STUDENTS.SID
ANDSNAME='sssht'
使用谓词IN:
SELECTCID,SCORE
FROMCHOICES
WHERESIDIN
(SELECTSID
FROMSTUDENTS
WHERESNAME='sssht')
结果:
共5条记录
(11)
SELECTCNAME
FROMCOURSES
WHEREHOUR>
(SELECTHOUR
FROMCOURSES
WHERECNAME='C++')
结果:
共5条记录
(12)
SELECTCHOICES.SID,SNAME
FROMCOURSES,STUDENTS,CHOICES
WHERECHOICES.SID=STUDENTS.SID
ANDCHOICES.CID=COURSES.CID
ANDCNAME='C++'
ANDSCORE>
(SELECTSCORE
FROMCOURSES,STUDENTS,CHOICES
WHERECHOICES.SID=STUDENTS.SID
ANDCHOICES.CID=COURSES.CID
ANDCNAME='C++'
ANDSNAME='znkoo')
结果:
共2065条记录
(13)
SELECTSNAME
FROMSTUDENTS
WHEREGRADEIN
(SELECTGRADE
FROMSTUDENTS
WHERESID='883794999'ORSID='850955252')
结果:
共13372条记录
(14)
SELECTDISTINCTSNAME
FROMSTUDENTS,COURSES,CHOICES
WHERECHOICES.SID=STUDENTS.SID
ANDCHOICES.CID=COURSES.CID
ANDCNAMENOTIN('Java')
结果:
共99548条记录
(15)
SELECTCID,CNAME,HOUR
FROMCOURSES
WHEREHOUR<=ALL
(SELECTHOUR
FROMCOURSES)
结果:
共2条记录
(16)
SELECTTID,CID
FROMCHOICES
WHERETIDIN
(
SELECTTID
FROMTEACHERS
WHERESALARY=
(SELECTMAX(SALARY)
FROMTEACHERS)
)
GROUPBYTID,CID
结果:
共73条记录,共4名教师
(17)
SELECTSID
FROMCHOICES
WHERESCORE=
(SELECTMAX(SCORE)
FROMCHOICES
WHERECID=
(SELECTCID
FROMCOURSES
WHERECNAME='ERP'))
结果:
共5963条记录
(18)
SELECTCNAME
FROMCOURSES
WHERECIDNOTIN
(SELECTCID
FROMCHOICES)
结果:
无数据
(19)
SELECTDISTINCTCID
FROMCHOICES
WHERETIDIN
(SELECTTID
FROMCHOICES
WHERECID=(
SELECTCID
FROMCOURSES
WHERECNAME='UML'))
结果:
共50条记录
(20)
SELECTSNAMEFROMSTUDENTS
WHERENOTEXISTS
(SELECT*
FROMCHOICESASC1
WHERENOTEXISTS
(SELECT*
FROMCHOICESASC2
WHEREC2.SID=STUDENTS.SID
ANDC2.CID=C1.CID
ANDC2.TID='200102901'))
结果:
无数据
(21)
SELECTSID
FROMCHOICES,COURSES
WHERECHOICES.CID=COURSES.CID
ANDCOURSES.CNAME='database'
UNION
SELECTSID
FROMCHOICES,COURSES
WHERECHOICES.CID=COURSES.CID
ANDCOURSES.CNAME='UML'
结果:
共11297条记录
(22)
SELECTX.SID
FROMCHOICESASX,CHOICESASY
WHERE(X.CID=
(SELECTCID
FROMCOURSES
WHERECNAME='database')
ANDY.CID=
(SELECTCID
FROMCOURSES
WHERECNAME='UML'))
ANDX.SID=Y.SID
结果:
共317条记录
(23)
SELECTX.SID
FROMCHOICESASX,CHOICESASY
WHERE(X.CID=
(SELECTCID
FROMCOURSES
WHERECNAME='database'))
ANDX.SID=Y.SID
ANDNOT(Y.CID=
(SELECTCID
FROMCOURSES
WHERECNAME='UML'))
结果:
共21383条记录
实验1.3
(1)
INSERTINTOSTUDENTS(SID,SNAME)
VALUES('800022222','WangLan')
(2)
INSERTINTOTEACHERS
VALUES('200001000','LXL','s4zrck@','3024')
(3)
UPDATETEACHERS
SETSALARY=4000
WHERETID='200010493'
(4)
UPDATETEACHERS
SETSALARY=2500
WHERESALARY<2500
结果:
(5)
UPDATECHOICES
SETTID=
(SELECTTID
FROMTEACHERS
WHERETNAME='rnupx')
WHERETID='200016731'
结果:
(6)
UPDATESTUDENTS
SETGRADE=2001
WHERESID='800071780'
(7)
DELETEFROMCOURSES
WHERECIDNOTIN
(SELECTCID
FROMCHOICES
GROUPBYCID)
(8)
DELETEFROMSTUDENTS
WHEREGRADE<1998
这样执行会提示错误,因为CHOICES表中的SID外键参照STUDENTS表,要先去除外键约束,或者删除CHOICES表中的相关约束。
(9)
DELETEFROMSTUDENTS
WHERESIDNOTIN
(SELECTSID
FROMCHOICES
GROUPBYSID)
(10)
DELETEFROMCHOICES
WHERESCORE<60
结果:
实验1.4
(1)
CREATEVIEWVIEWCAS
SELECTCHOICES.NO,CHOICES.SID,CHOICES.TID,CHOICES.SCORE,COURSES.CNAME
FROMCHOICES,COURSES
WHERECHOICES.CID=COURSES.CID
(2)
CREATEVIEWVIEWSAS
SELECTCHOICES.NO,STUDENTS.SNAME,CHOICES.TID,CHOICES.CID,CHOICES.SCORE
FROMCHOICES,STUDENTS
WHERECHOICES.SID=STUDENTS.SID
(3)
CREATEVIEWS1(SID,SNAME,GRADE)AS
SELECTSTUDENTS.SID,STUDENTS.SNAME,STUDENTS.GRADE
FROMSTUDENTS
WHEREGRADE>1998
(4)
SELECT*
FROMVIEWS
WHERESNAME='uxjof'
结果:
(5)
SELECTSID,SCORE
FROMVIEWC
WHERECNAME='UML'
结果:
共5253条记录
(6)
INSERTINTOS1
VALUES('60000001','Lily',2001)
(7)
CREATEVIEWS2(SID,SNAME,GRADE)AS
SELECTSID,SNAME,GRADE
FROMSTUDENTS
WHEREGRADE>1998
WITHCHECKOPTION
插入:
INSERTINTOS2
VALUES('60000001','Lily',1997)
结果:
DELETEFROMS2
WHEREGRADE=1999
结果:
(8)
UPDATEVIEWS
SETSCORE=SCORE+5
WHERESNAME='uxjof'
结果:
(9)
DROPVIEWVIEWC
DROPVIEWVIEWS
DROPVIEWS1
DROPVIEWS2
实验1.5
(1)
GRANTSELECT
ONSTUDENTS
TOPUBLIC
(2)
GRANTSELECT,UPDATE
ONCOURSES
TOPUBLIC
(3)
GRANTSELECT,UPDATE(SALARY)
ONTEACHERS
TOUSER1
WITHGRANTOPTION
(4)
GRANTSELECT,UPDATE(SCORE)
ONCHOICES
TOUSER2
(5)
CREATEVIEWTVAS
SELECTTID,TNAME,EMAIL,SALARY
FROMTEACHERS
GRANTSELECT
ONTV
TOUSER2
(6)
GRANTSELECT
ONTEACHERS
TOUSER2
WITHGRANTOPTION
(7)
USER2的操作:
GRANTSELECT
ONTEACHERS
TOUSER3
WITHGRANTOPTION
USER3的操作:
GRANTSELECT
ONTEACHERS
TOUSER2
WITHGRANTOPTION
(8)
REVOKESELECT
ONTEACHERS
FROMUSER1CASCADE
(9)
REVOKESELECT,UPDATE
ONCOURSES
FROMUSER1,USER2
实验1.6
(1)
SELECTCID,HOUR*18
FROMCOURSES
对NULL做算术运算结果为NULL
结果:
共50条记录
(2)
选修C++课程的人数为5307人:
SELECTCOUNT(*)
FROMCHOICES
WHERECID=
(SELECTCID
FROMCOURSES
WHERECNAME='C++')
其中,合格人数为4817:
SELECTCOUNT(*)
FROMCHOICES
WHERECID=
(SELECTCID
FROMCOURSES
WHERECNAME='C++')
ANDSCORE>='60'
不合格人数为0人:
SELECTCOUNT(*)
FROMCHOICES
WHERECID=
(SELECTCID
FROMCOURSES
WHERECNAME='C++')
ANDSCORE<'60'
成绩为NULL的人数为490人:
SELECTCOUNT(*)
FROMCHOICES
WHERECID=
(SELECTCID
FROMCOURSES
WHERECNAME='C++')
ANDSCOREISNULL
总结:
在比较运算中,NULL不参与比较,因此会导致合格人数加上不合格人数不等于总人数的情况。
(3)
SELECTCHOICES.SID,SCORE
FROMCHOICES,COURSES
WHERECHOICES.CID=COURSES.CID
ANDCNAME='C++'
ORDERBYSCORE
NULL结果出现在结果集中,并且按照最小值处理
结果:
共5307条记录
(4)
SELECTDISTINCTCHOICES.SID,SCORE
FROMCHOICES,COURSES
WHERECHOICES.CID=COURSES.CID
ANDCNAME='C++'
ORDERBYSCORE
成绩为NULL排在最前面
结果:
共5301条记录
(5)
SELECTDISTINCTGRADE
FROMSTUDENTS
GROUPBYGRADE
结果:
得到15个组,实际有14个年纪,原因是,把NULL当做了一个分组。
(6)
SELECTAVG(SCORE),COUNT(*),MAX(SCORE),MIN(SCORE)
FROMCHOICES
GROUPBYCID
结果:
共50条记录
集合函数中,COUNT(*)会统计NULL值,而其余COUNT(列名)则会不计NULL值,其余聚合函数,则会忽略NULL的取值。
(7)
SELECTGRADE
FROMSTUDENTS
WHEREGRADE>=ALL
(SELECTGRADE
FROMSTUDENTS)
利用上面的查询语句不能查询出结果,可能因为存在NULL值,因此尝试了下面的语句:
SELECTGRADE
FROMSTUDENTS
WHEREGRADE>=ALL
(SELECTGRADE
FROMSTUDENTS
WHEREGRADEISNOTNULL)
得到结果为2004,果真因为在比较>=ALL的时候,因为存在NULL值,不能做比较。
(8)
SELECTCOUNT(*)
FROMS,T
WHERET.TID=S.SID
实验2.1
(1)
USESCHOOL
CreateTableClass
(
Class_idvarchar(4),namevarchar(10),Deparmentvarchar(20)
constraintPK_ClassPrimarykey(Class_id)
)
(2)
USESCHOOL
BeginTransactionT3
insertintoClassvalues('0001','01CSC','CS')
BeginTransactionT4
insertintoClassvalues('0001','01CSC','CS')
CommitTransactionT4
CommitTransactionT3
实验2.2
(1)
AltertableSC
dropconstraintFK__SC__cno__03F0984C;
AltertableSC
addconstraintFK__SC__cnoforeignkey(cno)
referencesCourse(cno)ondeleterestrict;
USESCHOOL
deletefromStu_Unionwheresno='10001';
select*fromSC;
USESCHOOL
deletefromCoursewherecno='0002';
select*fromSC;
(2)
AltertableSC
dropconstraintFK__SC__cno__03F0984C;
AltertableSC
addconstraintFK__SC__cnoforeignkey(cno)
referencesCourse(cno)ondeletesetnull;
USESCHOOL
deletefromStu_Unionwheresno='10001';
select*fromSC;
USESCHOOL
deletefromCoursewherecno='0002';
select*fromSC;
(3)
①
CREATETABLEhelp
(
sidchar(8),snamevarchar(20),help_idchar(8)NOTNULL
CONSTRAINTPK_helpprimarykey(sid)
)
②
altertablehelp
addconstraintFK_helpforeignkey(help_id)referenceshelp(sid)
(4)
①
CREATETABLEleader
(
sidchar(9),snamevarchar(20),myleaderchar(9)
CONSTRAINTPK_leaderprimarykey(sid)
)
②
CREATETABLEmonitor
(
sidchar(9),snamevarchar(20),mymonitorchar(9)
constraintPK_monitorprimarykey(sid)
constraintFK_monitorforeignkey(mymonitor)referencesleader(sid)
)
altertableleader
addconstraintFK_leaderforeignkey(myleader)referencesmonitor(sid)
实验2.3
(1)
useschool
altertableworker
addconstraintU3check(sage>=0);
(2)
useschool
Go
createrulerule_sageas@valuebetween1and100
Go
Execsp_bindrulerule_sage,'worker.[sage]';
实验2.4
(1)
useschool
go
createtriggerT4onworker
forinsert
as
if(selectsagefrominserted)<=(selectmax(sage)fromworker)
begin
print'Thesageofcouplemustbemorethantheexistedcouples’sage'
Rollbacktransaction
End
useschool
insertintoworkervalues('00003','李红','F',50,'开发部')
(2)
useschool
go
createtriggerT5onworker
forupdate
as
if(selectsagefrominserted)<=(selectsagefromdeleted)
begin
print'Thesageofnewcouplemustbemorethanthesageofoldcouple'
Rollbacktransaction
End
useschool
updateworkersetsage=10wherenumber='00001'