数据库wzm一、设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。表1-1数据库的表结构表(一)Student属性名数据类型可否为空含义SnoChar(3)否学号(主键)SnameChar(8)否学生姓名SsexChar(2)否学生性别Sbirthdaydatetime可学生出生年月ClassChar(5)可学生所在班级表(二)Course属性名数据类型可否为空含义CnoChar(5)否课程号(主键)CnameVarchar(10)否课程名称TnoChar(3)否教师编号(外键)表(三)Score属性名数据类型可否为空含义SnoChar(3)否学号(外键)CnoChar(5)否课程号(外数据库wzm键)DegreeDecimal(4,1)可成绩主码:Sno+Cno表(四)Teacher属性名数据类型可否为空含义TnoChar(3)否教师编号(主键)TnameChar(4)否教师姓名TsexChar(2)否教师性别Tbirthdaydatetime可教师出生年月ProfChar(6)可职称DepartVarchar(10)否教师所在部门表1-2数据库中的数据表(一)StudentSnoSnameSsexSbirthdayclass108曾华男1977-09-0195033105匡明男1975-10-0295031107王丽女1976-01-2395033101李军男1976-02-2095033109王芳女1975-02-1095031103陆君男1974-06-0395031表(二)Course数据库wzmCnoCnameTno3-105计算机导论8253-245操作系统8046-166数字电路8569-888高等数学831表(三)ScoreSnoCnoDegree1033-245861053-245751093-245681033-105921053-105881093-105761013-105641073-105911083-105781016-166851076-166791086-16681表(四)TeacherTnoTnameTsexTbirthdayProfDepart804李诚男1958-12-02副教授计算机系856张旭男1969-03-12讲师电子工程系825王萍女1972-05-05助教计算机系831刘冰女1977-08-14助教电子工程系--1、查询Student表中的所有记录的Sname、Ssex和Class列。selectsname,ssex,classfromstudent;数据库wzm--2、查询教师所有的单位即不重复的Depart列。selectdistinctdepartfromTeacher;--3、查询Student表的所有记录。select*fromstudent;--4、查询Score表中成绩在60到80之间的所有记录。select*fromscorewheredegreebetween60and80;--5、查询Score表中成绩为85,86或88的记录。select*fromscorewheredegreein(85,86,88);--6、查询Student表中“95031”班或性别为“女”的同学记录。select*fromstudentwhereclass='95031'orssex='女';--7、以Class降序查询Student表的所有记录。select*fromstudentorderbyclassdesc;--8、以Cno升序、Degree降序查询Score表的所有记录。select*fromscoreorderbycno,degreedesc;数据库wzm--9、查询“95031”班的学生人数。selectclass,count(*)as学生人数fromstudentgroupbyclasshavingclass='95031';--10、查询Score表中的最高分的学生学号和课程号。(子查询或者排序)selectsno,cno,degree,(selectmax(degree)fromscore)asmaxscore--计算最高分fromscorewheredegree=(selectmax(degree)fromscore);--11、查询‘3-105’号课程的平均分。selectavg(degree)asavgdegreefromscoregroupbycnohavingcno='3-105';--12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。selectavg(degree)asavgdegreefromscoregroupbycno--按照课程分组取平均值havingcno=(selectcnofromscoregroupbycnohavingcount(*)=5)--至少有5名学生选修的课程andcnolike'3%';--以3开头的课程--13、查询最低分大于70,最高分小于90的Sno列。数据库wzmselectsno,max(degree)asmaxdegree,min(degree)asmindegreefromScoregroupbysnohavingmax(degree)90andmin(degree)70--14、查询所有学生的Sname、Cno和Degree列。selectsname,cno,degreefromstudentjoinscoreonstudent.sno=score.sno;--15、查询所有学生的Sno、Cname和Degree列。selectsno,cname,degreefromScorejoincourseonScore.cno=course.cno;--16、查询所有学生的Sname、Cname和Degree列。selectsname,cname,degreefromstudentjoinscoreonstudent.sno=score.snojoincourseonScore.cno=course.cno;--17、查询“95033”班所选课程的平均分。selectavg(degree)asavgdegreefromscorewheresnoin(selectsnofromstudentwhereclass='95033')18、假设使用如下命令建立了一个grade表:createtablegrade(lowint(3),uppint(3),rankchar(1))insertintogradevalues(90,100,’A’)insertintogradevalues(80,89,’B’)数据库wzminsertintogradevalues(70,79,’C’)insertintogradevalues(60,69,’D’)insertintogradevalues(0,59,’E’)--现查询所有同学的Sno、Cno和rank列。selectsno,cno,(casewhendegreebetween90and100then'A'whendegreebetween80and89then'B'whendegreebetween70and79then'C'whendegreebetween60and69then'D'whendegreebetween0and59then'E'END)asrankfromscore;--19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。select*fromscorewherecno='3-105'anddegree(selectdegreefromscorewheresno='109'andcno='3-105');--20、查询score中选学多门课程的同学中分数为非最高分成绩的记录。select*fromscorewheresnoin--选学多门课程的同学中分数为非最高分成绩的同学的全记录(selectsnofromscoregroupbysnohavingcount(cno)1--选学多门课程的同学intersect--取交集为选学多门课程的同学中分数为非最高分成绩的同学。数据库wzmselectdistinctsnofromscorewheresnonotin(--分数为非最高分成绩的同学selectsnofromscorewheredegree=(selectmax(degree)fromscore)))--分数最高成绩的同学--21、查询score中选学多门课程的同学中分数为非同课程最高分成绩的记录。方法1:select*fromscorewheresnoin--选学多门课程的同学中分数为非同课程最高分成绩的同学的全记录(selectsnofromscoregroupbysnohavingcount(cno)1--选学多门课程的同学intersect--取交集为选学多门课程的同学中分数为非同课程最高分成绩的同学。selectdistinctsnofromscorewheresnonotin(--非同课程分数最高成绩的同学selectdistinctsnofromscorewheredegreein(--同课程分数最高成绩的同学selectmax(degree)fromscoregroupbycno)))--同课程分数最高成绩方法2:select*fromscorewheresnoin--选学多门课程的同学中分数为非同课程最高分成绩的同学的全记录(selectsnofromscoregroupbysnohavingcount(cno)1--选学多门课程的同学intersect--取交集为选学多门课程的同学中分数为同课程非最高分成绩的同学selectdistinctsnofromscorewheresnonotin--选出非同课程最高分成绩的同学数据库wzm(selectdistinctsnofromscoreass1wheredegree=(selectmax(degree)fromscoreass2wheres1.cno=s2.cnogroupbycno)));--使用关联子查询选出同课程最高分成绩的同学--22、查询1975年之后出生的学生的所学课程以及成绩。selectsname,Cname,degreefromstudentjoinscoreonstudent.sno=score.snojoincourseonscore.cno=course.cnowheresbirthday='1975-01-01';--23、查询和学号为107的同学同年出生的所有学生的Sno、Sname和Sbirthday列。selectsno,sname,sbirthdayfromstudentwheredatepart(year,sbirthday)=(selectdatepart(year,sbirthday)fromstudentwheresno='107')--学号为107的同学的出生年份andsnonotin('107');--排除学号为107的同学--24、查询“张旭”教师任课的学生成绩。selectdegreefromscorewherecno=(selectcnofromcoursejointeacheronteacher.tno=course.tnowheretname='张旭');--张旭老师所任课程数据库wzm--25、查询选修某课程的同学人数多于5人的教师姓名。selecttnamefromteacherjoincourseonteacher.tno=course.tnowherecnoin(selectcnofromscoregroupbycnohavingco