《数据库原理》课件上机实验点评及参考答案2017.docx
上机实验三一基本表的建立和修改三、实习内容,1 .启动MSSQ1.SerVer服务,打开ErnerPriSeManagerQueryAna1.yzer-,2 .f.QueryArui1.yzer中用CREATETAB1.E命令在实验二创建的GrtidoManager数据摩中定义基本表:学生表(Student)课程表(Course),利用EnterpriseMiIndger的图形化功能建立班级表(C1.iISS)以及成绩表(GnIdO).酎心往下«!哦,有点“清fcreatetab1.eStudent(Snochar(7)primarykey.SnameVarChar(20)notnu1.1.,Ssexchar(2)notnu1.1.,SageSma1.1.int,C1.nochar(5notnu1.1.);createtab1.eC1.ass(C1.noCharPrimarVkey.Specia1.ityvarchar(20)notnu1.1.,Inyearchar(4)notnu1.1.zNumberinteger,Monitorchar(7);createtab1.eCourse(Cnochar(1.)primarykey,CnameVarChar(20)notnu1.1.,CreditSma1.1.1.nt);createtab1.eGrade(Snochar7referencesStUdenUSno),Cnochar(1.)referencescourse(cno),Gmarknumeric,Primarykey(sno,cno);四、骨对以上四个表,用SQI语言完成以下各项操作,给学生表增加一属性NatiOn(民族),数据类型为Varehar(20>:IM除学生表中新增的属性Nation:向成绩表中插入记录(-200W1.(F,-3*80);修改学号为“20011Hr的学生的成绩为70分;删除学号为"00II1.(T的学生的成绩记录:©为学生表创建一个名为IX-C1.aSS的索引.A1.TERTAB1.EStudentADDNationvarchar(20);2.A1.TERTAB1.EStudentDROPCO1.UMNNation;3.Insertintogradesno,cno,gmark)va1.ues(,20011103r.80>点评:该语句没仃语法格误.但好多同学在执行时出现了问虺.是对的,但同学们要知道为什么会出现这个问题?请仔细乔卜.前面的创建表的语句:UPDATEGradeSETGmark=70WHERESno=,2001110,;5.DE1.ETEFROMGradeWHERESno=,2001110,;6.CREATEINDEXIX_C1.assONStudent1.CInoA$c);7.DROPINDEXStudent.1.X_C1.ass;五、思考三s在定义基本表语句时,NOTW1.1.参数的使用有何作用?答:NotNUu参数,可以保证在插入数据时.该属性列的取值不为空,上机实验四一SE1.ECT语句的使用(一)三、实习内容;完成以下各项操作的SQ1.语句:找出所有被学生选修了的课程号:se1.ectdistinctcofromgrade;该语句实现的路径应该是Grade衣,COUrSe我中可能有某门课,个学生都没有选他的.所以不能是S询Course的Cno.找出01311班女学生的个人信息:se1.ect*fromstudentwhereSSeX=女andc1.no='01311,;找出01311班、01312班的学生姓名、性别、出生年份:se1.ectSname,Ssex,2016-Sageasbirthfromstudentwherec1.no="01311'orc1.no='O1312,;OR;se1.ectSname,Ssex,2016Sageasbirthfromstudentwherec1.noin('01311','01312');OR:(在T-SQ1.中,超大纲了)Se1.ectsnae,sex,year(ge1.dateO)-SageFromStUdenttherec1.noinC013H,01312,):找出所有姓李的学生的个人信息;se1.ectfromstudentv/hereSname1.ike'李'找出学生李勇所在班级的学生人数:Se1.ectcount()fromstudentWherec1.noin(Se1.ectc1.nofromstudentWhereSname="李勇");Or:Se1.ectnumberfromc1.assBhercc1.noin(Se1.ectc1.nofro®studentWhereSna1.nC="李勇");Or:Se1.ectnumberfronc1.ass,studentBhereSnatte二'李勇'andc1.ass,c1.nostudent.c1.no:找IH课程名为操作系统的平均成锁、果高分、最低分;Se1.ectavg(gmark),Max(gmark),Min(gmark)Fromgrade,courseWhereCninnO二"操作系统"o-couo;Or:Se1.ectavR(11ark),Max(mark),Min(gaark)FromgradeWherecno=(Se1.ectcnofroncoursewhereCname="操作系统;找出选修了课程的学生人数:se1.ectcount(distinctSno)fromgrade;找出选修了课程操作系统的学生人数.Se1.ectcount(sno)FromgradeWherecno=(Se1.ectcnofromcourseWhereCnaBe="操作系统");Or:Se1.ectcount(sno)Fromgfade.courseWhereRo=oandCnamC="操作系统"<9)找出2000级计免机软件班的成绩为空的学生姓名。se1.ectSnamefromStudentwhereC1.noinIrhCreSPeCiaIity='计算机软件'andInyear=2000)andSnoin(se1.ectSnofronGradewheregmarkisnu1.1.):四、思考题:什么倘况卜需要使用关系的别名?别名的作用范围是什么?答:股几种两种怙况下使用别名:1.关系名太长,为了简化:2.为了喊自身连接杳询.3.在同一个SQ1.语句中,为了对某个表进行2次扫描.别名的作用范用是当前该SQ1.语句国开当前SQ1.谙句,别名就不在存在.上机实验五一一SE1.ECT语句的使用(二)三、实习内容:完成以下各项振作的W1.诏句:找出与李勇在同一个班级的学生信息:找出所有与李勇有相同选修课的学生信息:找出年龄介丁学生李勇和25岁之间的学生信总:(已知李勇年龄小于25岁)找出选修了课程操作系统的学生学号和姓名找出没有选修1号课程的学生姓名找出选修了全部课程的学生姓名:找出与李勇在同一个班级的学生信息:Se1.ectfromstudentWherec1.no=(Se1.ectc1.nofro三st<kntwhereSname='李勇');Or:本物还可以用(i身连接进行ft.找出所有与学生李勇有相同选修课程的学生信息se1.ectfromStudentwhereSnoin(se1.ectSnofromGradehereCnoin(se1.ectCnofronGradewhereSnoin(se1.ectSnofromStudentwhereSna三e='李勇)andSname<>'李勇;找HI年龄介于学生李勇和25岁之间的学生信息;Se1.ect*fromstudentWheresagebetween(Se1.ectsagefromstudentBhereSnamO=李安)And25;找出选修了课程操作系统的学生学号和姓名;Se1.ectsno,snamefro三studentWheresnoin(Se1.ectsnofrongradeWherecno=Se1.ectcnofroncourseBherecn<me='操作系统);找出所有没布.选修1号课程的学生姓名:Se1.ectsnamefromstudentWherenotexist(Se1.ectsnofromgradewhereCnO=TandSnO=S1.UdCn1.sno):OR:Se1.ectsnamefromstudentUheresnonotin(Se1.ectsnofromgradeherecno=,);Or:用集合运算se1.ectSnamefromStudentwereSnOin(se1.ectSnofromGradeexceptse1.ectSnofromGradewhereCr>=1);找出选修了全部课程的学生姓名(提示:可找出这样的学生,没有一门课程是他不选修的。)卜面这个编程的思路有间踽,是错误的哦:SE1.ECTSnameFROMStudentWHERI:SnoIN(SE1.ECTSnoFROMGrade叫ERECnoI)ANDSnoINtSE1.ECTSnoEROMGrade!HERECno=2)ANDSnoIN(SE1.ECTSnoFROMGradeIiHERECnO=3)ANDSnoIN(SE1,RCTSnoFROMGradeHHERECno=I)NDSnoIN(SE1.ECTSnoFROMGradeWiERECno=5)ANDSnoINSE1.ECTSnoFROMGradeWHERECM=6)ANDSnoINfSE1.ECTSno1.ROMGradeBHERECno=7)解一:Se1.ectSnan1.efromstudentBherenotexists(Se1.ect*fromcoursewherenotexists(Se1.ect*fromgradeWheresno=student.snoandcno=o);解二:Se1.ectsnamefronstudentBheresnoin(Se1.ectsnofrongradeGroupbysnoHavingcount()=Se1.ectcount()fromcourse);OR:Se1.ectsnamefromstudentBhere(Se1.ectcount(cno)fro三gradeGroupbysno)=(Se1.cctcount()fromcourse);解法三:Se1.ectSnaaeFromStudentWHEREnotexists(Se1.ectCnoFronCourseexceptSe1.ectC