您好,欢迎访问三七文档
当前位置:首页 > 幼儿/小学教育 > 小学教育 > 数据库-张-上机实验点评及参考答案2014
上机实验三——基本表的建立和修改三、实习内容:1.启动MSSQLServer服务,打开EnterpriseManager和QueryAnalyzer。2.在QueryAnalyzer中用CREATETABLE命令在实验二创建的GradeManager数据库中定义基本表:学生表(Student)、课程表(Course),利用EnterpriseManager的图形化功能建立班级表(Class)以及成绩表(Grade)。createtableStudent(Snochar(7)primarykey,Snamevarchar(20)notnull,Ssexchar(2)notnull,SageSmallint,Clnochar(5)notnull);createtableClass(Clnochar(5)primarykey,Specialityvarchar(20)notnull,Inyearchar(4)notnull,Numberinteger,Monitorchar(7));createtableCourse(Cnochar(1)primarykey,Cnamevarchar(20)notnull,CreditSmallint);createtableGrade(Snochar(7)referencesstudent(sno),Cnochar(1)referencescourse(cno),Gmarknumeric,Primarykey(sno,cno));四、针对以上四个表,用SQL语言完成以下各项操作。①给学生表增加一属性Nation(民族),数据类型为Varchar(20);②删除学生表中新增的属性Nation;③向成绩表中插入记录(”2001110”,”3”,80);④修改学号为”2001110”的学生的成绩为70分;⑤删除学号为”2001110”的学生的成绩记录;⑥为学生表创建一个名为IX_Class的索引。1.ALTERTABLEStudentADDNationvarchar(20);2.ALTERTABLEStudentDROPCOLUMNNation;3.Insertintograde(sno,cno,gmark)values(‘2001110’,’3’,80)点评:该语句没有语法错误,但好多同学在执行时出现了问题,是对的。但同学们要知道为什么会出现这个问题。4.UPDATEGradeSETGmark=70WHERESno='2001110';5.DELETEFROMGradeWHERESno='2001110';6.CREATEINDEXIX_ClassONStudent(ClnoAsc);7.DROPINDEXStudent.IX_Class;五、思考题在定义基本表语句时,NOTNULL参数的使用有何作用?答:NotNull参数,可以保证在插入数据时,该属性列的取值不为空。上机实验四——SELECT语句的使用(一)三、实习内容:完成以下各项操作的SQL语句:①找出所有被学生选修了的课程号;selectdistinctcnofromgrade;该语句实现的路径应该是Grade表,Course表中可能有某门课,一个学生都没有选修的。所以不能是查询Course表的Cno。②找出01311班女学生的个人信息;select*fromstudentwhereSsex='女'andclno='01311';③找出01311班、01312班的学生姓名、性别、出生年份;selectSname,Ssex,2012-Sageasbirthfromstudentwhereclno='01311'orclno='01312';OR:selectSname,Ssex,2012-Sageasbirthfromstudentwhereclnoin('01311','01312');OR:(在T-SQL中,超大纲了,呵呵)Selectsname,sex,year(getdate())-sageFromstudentWhereclnoin(‘01311’,’01312’);④找出所有姓李的学生的个人信息;select*fromstudentwhereSnamelike'李%';⑤找出学生李勇所在班级的学生人数;Selectcount(*)fromstudentWhereclnoin(SelectclnofromstudentWheresname=”李勇”);Or:SelectnumberfromclassWhereclnoin(SelectclnofromstudentWheresname=”李勇”);Or:Selectnumberfromclass,studentWheresname=’李勇’andclass.clno=student.clno;⑥找出课程名为操作系统的平均成绩、最高分、最低分;Selectavg(gmark),Max(gmark),Min(gmark)Fromgrade,courseWherecname=”操作系统”andgrade.cno=course.cno;Or:Selectavg(gmark),Max(gmark),Min(gmark)FromgradeWherecno=(Selectcnofromcoursewherecname=”操作系统”);⑦找出选修了课程的学生人数;selectcount(distinctSno)fromgrade;⑧找出选修了课程操作系统的学生人数。Selectcount(sno)FromgradeWherecno=(SelectcnofromcourseWherecname=”操作系统”);Or:Selectcount(sno)Fromgrade,courseWheregrade.cno=course.cnoandcname=”操作系统”;(9)找出2000级计算机软件班的成绩为空的学生姓名。selectSnamefromStudentwhereClnoin(selectClnofromClasswhereSpeciality='计算机软件'andInyear=2000)andSnoin(selectSnofromGradewheregmarkisnull);四、思考题:什么情况下需要使用关系的别名?别名的作用范围是什么?答:一般几种两种情况下使用别名:1.关系名太长,为了简化;2.为了做自身连接查询。3.在同一个SQL语句中,为了对某个表进行2次扫描。别名的作用范围是当前该SQL语句,离开当前SQL语句,别名就不在存在。上机实验五——SELECT语句的使用(二)三、实习内容:完成以下各项操作的SQL语句:①找出与李勇在同一个班级的学生信息;②找出所有与李勇有相同选修课的学生信息;③找出年龄介于学生李勇和25岁之间的学生信息;(已知李勇年龄小于25岁)④找出选修了课程操作系统的学生学号和姓名⑤找出没有选修1号课程的学生姓名⑥找出选修了全部课程的学生姓名;①找出与李勇在同一个班级的学生信息;Select*fromstudentWhereclno=(Selectclnofromstudentwheresname=’李勇’);②找出所有与学生李勇有相同选修课程的学生信息select*fromStudentwhereSnoin(selectSnofromGradewhereCnoin(selectCnofromGradewhereSnoin(selectSnofromStudentwhereSname='李勇')))andSname'李勇';③找出年龄介于学生李勇和25岁之间的学生信息;Select*fromstudentWheresagebetween(SelectsagefromstudentWheresname=’李勇’)And25;④找出选修了课程操作系统的学生学号和姓名;Selectsno,snamefromstudentWheresnoin(SelectsnofromgradeWherecno=(SelectcnofromcourseWherecname=’操作系统’));⑤找出所有没有选修1号课程的学生姓名;SelectsnamefromstudentWherenotexist(Selectsnofromgradewherecno=’1’andsno=student.sno);OR:SelectsnamefromstudentWheresnonotin(SelectsnofromgradeWherecno=’1’);⑥找出选修了全部课程的学生姓名(提示:可找出这样的学生,没有一门课程是他不选修的。)下面这个编程的思路有问题,是错误的哦:SELECTSnameFROMStudentWHERESnoIN(SELECTSnoFROMGradeWHERECno=1)ANDSnoIN(SELECTSnoFROMGradeWHERECno=2)ANDSnoIN(SELECTSnoFROMGradeWHERECno=3)ANDSnoIN(SELECTSnoFROMGradeWHERECno=4)ANDSnoIN(SELECTSnoFROMGradeWHERECno=5)ANDSnoIN(SELECTSnoFROMGradeWHERECno=6)ANDSnoIN(SELECTSnoFROMGradeWHERECno=7)解一:SelectsnamefromstudentWherenotexists(Select*fromcoursewherenotexists(Select*fromgradeWheresno=student.snoandcno=course.cno);解二:SelectsnamefromstudentWheresnoin(SelectsnofromgradeGroupbysnoHavingcount(*)=Selectcount(*)fromcourse);OR:SelectsnamefromstudentWhere(Selectcount(cno)fromgradeGroupbysno)=(Selectcount(*)fromcourse);解法三:SelectSnameFromStudentWHEREnotexists(SelectCnoFromCourseexceptSelectCnoFromGradeWHEREStudent.Sno=Grade.Sno);类似表达的还有:--1.SELECTSnameFROMStudentWHERE(selectcount(cno)fromcourse)=(SELECTcount(sno)FROMGradeGROUPBYSno)--2.SELECTSnameFROMStudentWHERESno=ANY(SELECTSnoFROMGradeGROUPBYSnoHAVING(COUNT(*)=(SELECTCOUNT(*)FROMCourse)))ORDERBYSname;(1)查询选修了3号课程的学生学号及成绩,并按成绩的降序排列selectSno,GmarkfromGradewhereCno='3'orderbyGmarkdesc;(2)查询全体学生信息,要求查询结果按班级号升序排列,同一班级学生按年龄降序排列select*fromStudentorderbyClno,Sagedesc;(3)求每个课程号及其相应的选课人数selectCno,count(Sno)as选课人数fromGradegroupbyCno;(4)查询选修了3门以上课程的学生学号selectSno,count(Cno)as选课门数fromGradegroupbySnohavingcount(Cno)3;selectsnofromGradegwhere(selectCOUNT(cno)fromGradewhereSno=g.Sno)3;五、思考题:1.用UNION或UNIONALL将两个SELECT命令结合为一个时,结果有何不同?2.当既
本文标题:数据库-张-上机实验点评及参考答案2014
链接地址:https://www.777doc.com/doc-4728949 .html