已知有如下4张表:
学生表:STUDENT(S#,SNAME,SAGE,SSEX)
课程表:COURSE(C#,CNAME,T#)
成绩表:SC(S#,C#,SCORE)
教师表:TEACHER(T#,TNAME)
其中,S#代表学号,SNAME代表学生姓名,SAGE代表学生年龄,SSEX代表学生性别,C#代表课程编号,CNAME代表课程名字,T#代表教师编号,TNAME代表教师名字,SCORE代表成绩。
根据以上信息按照下面要求写出对应的SQL语句。
1、查询课程编号为“001”的课程比“002”的课程成绩高的所有学生的学号
2、查询平均成绩大于60分的学生的学号和平均成绩
3、查询所有学生的学号、姓名、选课数、总成绩
4、查询姓“李”的老师的个数
5、查询没学过“李美玲”老师课的学生的学号、姓名
6、查询学过编号为“001”的课程并且也学过编号为“002”的课程的学生的学号、姓名
7、查询学过“李多多”老师所教的所有课的学生的学号、姓名
8、查询课程编号为“002”的总成绩
9、查询所有课程成绩小于60分的学生的学号、姓名
10、查询没有学全所有课的学生的学号、姓名
11、查询至少有一门课与学号为“1001”的学生所学课程相同的学生的学号和姓名
12、查询所学课程和学号为“001”的学生所有课程一样的其他学生的学号和姓名
13、把“SC”表中“李多多”老师教的课的成绩都更改为此课程的平均成绩
14、查询没有学习过“1002”号课程的的学生的学号和姓名
15、删除学习“李多多”老师课的SC表记录
16、向SC表中插入一些记录这些记录要求符合以下条件:没有上过编号为“003”课程的学生的学号、编号为002的课程的平均成绩
17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,其中数据库的c#为004,企业管理的c#为001,英语的c#为006,按如下形式显示:
学生ID数据库企业管理英语有效课程数有效平均成绩
18、查询各科成绩最高和最低的分,以如下形式显示课程ID最高分最低分
19、按各科平均成绩从低到高和及格率的百分数从高到低排列,以如下形式显示:
课程号课程名平均成绩及格百分数
20、查询如下课程平均成绩和及格率的百分数(用1行显示),其中企业管理为001,马克思为002,UML为003,数据库为004
21、查询不同老师所教不同课程平均分从高到低显示
22、查询如下课程成绩第3名到第6名的学生成绩单,其中企业管理为001,马克思为002,UML为003,数据库为004,以如下形式显示:
学生ID学生姓名企业管理马克思UML数据库平均成绩
23、使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分数段人数:课程ID和课程名称
24、查询学生平均成绩及其名次
25、查询各科成绩前三名的记录(不考虑成绩并列情况)
26、查询每门课程被选修的学生数
27、查询出只选修了一门课程的全部学生的学号和姓名
28、查询男生、女生人数
29、查询姓“张”的学生名单
30、查询同名同性学生名单并统计同名人数
31、1981年出生的学生名单(注:STUDENT表中SAGE列的类型是DATE)
32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时按课程号降序排列
33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
34、查询课程名称为“数据库”且分数低于60的学生姓名和分数
35、查询所有学生的选课情况
36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数
37、查询不及格的课程并按课程号从大到小排列
38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名
39、查询选了课程的学生人数
40、查询选修“李多多”老师所授课程的学生中成绩最高的学生姓名及其成绩
41、查询各个课程及相应的选修人数
42、查询有2门不同课程成绩相同的学生的学号、课程号、学生成绩
43、查询每门课程成绩最好的前两名
44、查询每门课程的学生选修人数,超过10人的课程才统计。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同按课程号升序排列
45、查询至少选修两门课程的学生学号
46、查询全部学生都选修的课程的课程号和课程名
47、查询没学过“李多多”老师讲授的任一门课程的学生姓名
48、查询两门以上不及格课程的同学的学号及其平均成绩
49、检索课程编号为“004”且分数小于60的学生学号,结果按按分数降序排列
50、删除学生编号为“002”的课程编号为“001”的课程的成绩
本题考察SQL的编写能力,对于这类型的题目,只要把4张表之间的关联关系搞清楚了,编写对应的SQL语句就比较容易了,本题给出的四张表之间的关系如下图所示:
1、答案:首先查询课程编号分别为001和002的所有学生的学号及其分数作为内嵌视图A和B,然后将A和B通过学号关联,过滤条件就是A的分数大于B的分数,最终SQL如下:
SELECTA.S#
FROM(SELECTS#,SCOREFROMSCWHEREC#='001')A,
(SELECTS#,SCOREFROMSCWHEREC#='002')B
WHEREA.SCORE>B.SCORE
ANDA.S#=B.S#;
2、答案:该内容通过SC表即可获取,按照SC表的S#分组后即可求出平均成绩,最后通过HAVING子句来过滤平均分大于60的学生,最终SQL如下:
SELECTS#,AVG(SCORE)
FROMSC
GROUPBYS#
HAVINGAVG(SCORE)>60;
3、答案:学生姓名通过STUDENT表获取,成绩通过SC表获取,考察的是COUNT和GROUPBY函数,最终SQL如下:
SELECTSTUDENT.S#,STUDENT.SNAME,COUNT(SC.C#),SUM(SCORE)
FROMSTUDENT
LEFTOUTERJOINSC
ONSTUDENT.S#=SC.S#
GROUPBYSTUDENT.S#,SNAME;
4、答案:老师通过TEACHER表即可查询,考察模糊查询,最终SQL如下:
SELECTCOUNT(DISTINCT(TNAME))
FROMTEACHER
WHERETNAMELIKE'李%';
5、答案:首先查询学习过“李美玲”老师课的学生的学号作为子查询,而“李美玲”老师涉及到TEACHER表,TEACHER表要和学生有关联必须通过课程和成绩表,最终SQL如下:
SELECTSTUDENT.S#,STUDENT.SNAME
WHERES#NOTIN(SELECTDISTINCT(SC.S#)
FROMSC,COURSE,TEACHER
WHERESC.C#=COURSE.C#
ANDTEACHER.T#=COURSE.T#
ANDTEACHER.TNAME='李美玲');
6、答案:这道题需要注意的是“且”这个关键词,说明查询出来的学生即学习过001也学习过002的课程,最终SQL如下:
FROMSTUDENT,SC
WHERESTUDENT.S#=SC.S#
ANDSC.C#='001'
ANDEXISTS(SELECT*
FROMSCASSC_2
WHERESC_2.S#=SC.S#
ANDSC_2.C#='002');
错误答案:
ANDSC.C#IN('001','002');
7、答案:这道题和第6题比较相似,需要理解题意,题目说的是查询学过“李多多”老师所教的所有课的同学的学号、姓名,举个例子,比如“李多多”老师教过语文和数学,那么就得找出哪些同学同时学习了语文和数学这2门课程,最终SQL如下:
SELECTS#,SNAME
WHERES#IN(SELECTS#
ANDTEACHER.TNAME='李多多'
HAVINGCOUNT(SC.C#)=(SELECTCOUNT(C#)
FROMCOURSE,TEACHER
WHERETEACHER.T#=COURSE.T#
ANDTNAME='李多多'));
WHERES#IN(SELECTS#FROMSC,COURSE,TEACHER
WHERESC.C#=COURSE.C#
ANDTEACHER.TNAME='李多多');
8、答案:本题考查SUM函数,最终SQL如下所示:
SELECTSUM(SCORE)FROMSCSC_2WHERESC_2.C#='002';
9、答案:涉及到学生表和成绩表,比较简单,最终SQL如下:
WHERES#NOTIN(SELECTSTUDENT.S#
WHERESCORE>=60);
10、答案:没有学全所有课,翻译一下就是学生学习的课程数小于总的课程数,最终SQL如下:
GROUPBYSTUDENT.S#,STUDENT.SNAME
HAVINGCOUNT(C#)<(SELECTCOUNT(C#)FROMCOURSE);
11、答案:首先找出学号为1001的学生学习过的课程,然后根据这些课程号就可以找到有哪些学生学习过部分1001学生学习过的课程,最终SQL如下:
ANDC#IN(SELECTC#FROMSCWHERES#='1001');
SELECTSC.S#,SNAME;
12、答案:首先找出学号为1001的学生学习过的课程,然后根据这些课程号和所学课程总数就可以找到有哪些同学学习过和他一样的课程,最终SQL如下:
ANDC#IN(SELECTC#FROMSCWHERES#='001')
HAVINGCOUNT(C#)=(SELECTCOUNT(C#)FROMSCWHERES#='001');
13、答案:首先找到李多多老师教过哪些课程及其课程的平均成绩,然后根据课程号关联成绩表进行更新,最终SQL如下:
UPDATESC
SETSCORE=
(SELECTAVG(SC_2.SCORE)
FROMCOURSE,TEACHER,SCSC_2
WHERECOURSE.T#=TEACHER.T#
ANDCOURSE.C#=SC_2.C#
ANDSC_2.C#=SC.C#
GROUPBYCOURSE.C#)
WHEREEXISTS(SELEC1FROMCOURSE,
TEACHER,
SCSC_2WHERECOURSE.T#=TEACHER.T#
GROUPBYCOURSE.C#
);
14、答案:本题比较简答,最终SQL如下:
ANDC#NOTIN(SELECTC#FROMSCWHERES#='1002');
15、答案:本题比较简答,最终SQL如下:
DELETEFROMSC
WHERESC.C#IN
(SELECTCOURSE.C#FROMCOURSEC,TEACHERTWHEREC.T#=T.T#ANDT.TNAME='李多多');
16、答案:2个点,002课程的平均成绩和没有学习过003课程的学生,最终SQL如下:
INSERTINTOSC(S#,C#,SCORE)
SELECTS#,'002',(SELECTAVG(SCORE)FROMSCWHEREC#='002')
WHERES#NOTIN(SELECTS#FROMSCWHEREC#='003');
17、答案:查看标量子查询,最终SQL如下:
SELECTS#AS学生ID,
(SELECTSCOREFROMSCWHERESC.S#=T.S#ANDC#='004')AS数据库,
(SELECTSCOREFROMSCWHERESC.S#=T.S#ANDC#='001')AS企业管理,
(SELECTSCOREFROMSCWHERESC.S#=T.S#ANDC#='006')AS英语,
COUNT(*)AS有效课程数,
AVG(T.SCORE)AS平均成绩
FROMSCAST
ORDERBYAVG(T.SCORE)DESC;
18、答案:最终SQL如下:
SELECTC#AS课程ID,MAX(SCORE)AS最高分,MIN(SCORE)AS最低分
GROUPBYC#;
19、答案:最终SQL如下:
SELECTT.C#AS课程号,
MAX(COURSE.CNAME)AS课程名,
NVL(AVG(SCORE),0)AS平均成绩,
((100*SUM(CASE
WHENNVL(SCORE,0)>=60THEN
1
ELSE
0
END))/COUNT(*))AS及格百分数
FROMSCT,COURSEC
WHERET.C#=C.C#
GROUPBYT.C#
ORDERBY平均成绩,
END))/COUNT(*));
20、答案:最终SQL如下:
SELECTSUM(CASEWHENC#='001'THENSCOREELSE0END)/SUM(CASEC#WHEN'001'THEN1ELSE0END)AS企业管理平均分,
100*SUM(CASEWHENC#='001'ANDSCORE>=60THEN1ELSE0END)/SUM(CASEWHENC#='001'THEN1ELSE0END)AS企业管理及格百分数,
SUM(CASEWHENC#='002'THENSCOREELSE0END)/SUM(CASEC#WHEN'002'THEN1ELSE0END)AS马克思平均分,
100*SUM(CASEWHENC#='002'ANDSCORE>=60THEN1ELSE0END)/SUM(CASEWHENC#='002'THEN1ELSE0END)AS马克思及格百分数,
SUM(CASEWHENC#='003'THENSCOREELSE0END)/SUM(CASEC#WHEN'003'THEN1ELSE0END)ASUML平均分,
100*SUM(CASEWHENC#='003'ANDSCORE>=60THEN1ELSE0END)/SUM(CASEWHENC#='003'THEN1ELSE0END)ASUML及格百分数,
SUM(CASEWHENC#='004'THENSCOREELSE0END)/SUM(CASEC#WHEN'004'THEN1ELSE0END)AS数据库平均分,
100*SUM(CASEWHENC#='004'ANDSCORE>=60THEN1ELSE0END)/SUM(CASEWHENC#='004'THEN1ELSE0END)AS数据库及格百分数
FROMSC;
21、答案:最终SQL如下:
SELECTZ.T#AS教师ID,
Z.TNAMEAS教师姓名,
C.C#AS课程,
C.CNAMEAS课程名称,
AVG(SCORE)AS平均成绩
FROMSCAST,COURSEASC,TEACHERASZ
ANDC.T#=Z.T#
GROUPBYC.C#,Z.T#,Z.TNAME,C.CNAME
ORDERBYAVG(SCORE)DESC;
22、答案:最终SQL如下:
SELECTSC.S#AS学生学号,
STUDENT.SNAMEAS学生姓名,
T1.SCOREAS企业管理,
T2.SCOREAS马克思,
T3.SCOREASUML,
T4.SCOREAS数据库,
NVL(T1.SCORE,0)+NVL(T2.SCORE,0)+NVL(T3.SCORE,0)+
NVL(T4.SCORE,0)AS总分
LEFTJOIN(SELECT*
FROM(SELECTNB.S#,
NB.SCORE,
(RANK()OVER(PARTITIONBYNB.S#ORDERBYNB.SCORE))RK
FROMSCNB
WHERENB.C#='001')
WHERERK<=6
ANDRK>=3)AST1
ONSC.S#=T1.S#
WHERENB.C#='002')
ANDRK>=3)AST2
ONSC.S#=T2.S#
(RANK()OVER(PARTITIONBYNB.S#ORDERBYNB.SCORE))RK
WHERENB.C#='003')
ANDRK>=3)AST3
ONSC.S#=T3.S#
WHERENB.C#='004')
ANDRK>=3)AST4
ONSC.S#=T4.S#
WHERESTUDENT.S#=SC.S#;
23、答案:最终SQL如下:
SELECTSC.C#AS课程ID,
CNAMEAS课程名称,
SUM(CASEWHENSCOREBETWEEN85AND100THEN1ELSE0END)AS"[100-85]",
SUM(CASEWHENSCOREBETWEEN70AND85THEN1ELSE0END)AS"[85-70]",
SUM(CASEWHENSCOREBETWEEN60AND70THEN1ELSE0END)AS"[70-60]",
SUM(CASEWHENSCORE<60THEN1ELSE0END)AS"[60-]"
FROMSC,COURSE
WHERESC.C#=COURSE.C#
GROUPBYSC.C#,CNAME;
24、答案:最终SQL如下:
SELECTS#AS学生学号,RKAS名次,平均成绩
FROM(SELECTS#,
AVG(SCORE)平均成绩,
SUM(SCORE)总成绩,
(RANK()OVER(PARTITIONBYS#ORDERBYSUM(SCORE)DESC))RK
GROUPBYS#)AST2
ORDERBY名次DESC;
25、答案:最终SQL如下:
SELECTT1.S#AS学生ID,T1.C#AS课程ID,SCOREAS分数
FROMSCT1
WHERESCOREIN
(SELECTTOP3SCOREFROMSCWHERET1.C#=C#ORDERBYSCOREDESC)
ORDERBYT1.C#;
26、答案:最终SQL如下:
SELECTC#,COUNT(S#)FROMSCGROUPBYC#;
27、答案:最终SQL如下:
SELECTSC.S#,STUDENT.SNAME
FROMSC,STUDENT
WHERESC.S#=STUDENT.S#
GROUPBYSC.S#,STUDENT.SNAME
HAVINGCOUNT(C#)=1;
28、答案:最终SQL如下:
SELECTSUM(CASEWHENSSEX='男'THEN1ELSE0)AS男生人数,
SUM(CASEWHENSSEX='女'THEN1ELSE0)AS女生人数
GROUPBYSSEX;
29、答案:最终SQL如下:
SELECTSNAMEFROMSTUDENTWHERESNAMELIKE'张%';
30、答案:最终SQL如下:
SELECTSNAME,COUNT(*)FROMSTUDENTGROUPBYSNAMEHAVINGCOUNT(*)>1;
31、答案:最终SQL如下:
SELECTSNAME
WHERETO_CHAR(STUDENT.SAGE,'YYYY')='1981';
32、答案:最终SQL如下:
SELECTC#,AVG(SCORE)FROMSCGROUPBYC#ORDERBYAVG(SCORE),C#DESC;
33、答案:最终SQL如下:
SELECTSNAME,SC.S#,AVG(SCORE)
GROUPBYSC.S#,SNAME
HAVINGAVG(SCORE)>85;
34、答案:最终SQL如下:
SELECTSNAME,NVL(SCORE,0)
FROMSTUDENT,SC,COURSE
ANDSC.C#=COURSE.C#
ANDCOURSE.CNAME='数据库'
ANDSCORE<60;
35、答案:最终SQL如下:
SELECTSC.S#,SC.C#,SNAME,CNAME
FROMSC,STUDENT,COURSE
ANDSC.C#=COURSE.C#;
36、答案:最终SQL如下:
SELECTDISTINCTSTUDENT.S#,STUDENT.SNAME,SC.C#,SC.SCORE
WHERESC.SCORE>=70
ANDSC.S#=STUDENT.S#;
37、答案:最终SQL如下:
SELECTC#FROMSCWHERESCORE<60ORDERBYC#;
38、答案:最终SQL如下:
ANDSCORE>80
ANDC#='003';
39、答案:最终SQL如下:
SELECTCOUNT(DISTINCTS#)FROMSCGROUPBYS#;
40、答案:最终SQL如下:
SELECTSTUDENT.SNAME,SCORE
FROMSTUDENT,SC,COURSEC,TEACHER
ANDSC.C#=C.C#
ANDC.T#=TEACHER.T#
ANDSC.SCORE=(SELECTMAX(SCORE)FROMSCWHEREC#=C.C#);
41、答案:最终SQL如下:
SELECTC#,COUNT(*)FROMSCGROUPBYC#;
42、答案:最终SQL如下:
SELECTDISTINCTA.S#,A.C#,B.SCORE
FROMSCA,SCB
WHEREA.SCORE=B.SCORE
ANDA.S#=B.S#
ANDA.C#<>B.C#;
43、答案:最终SQL如下:
FROM(SELECTS#,C#,(RANK()OVER(PARTITIONBYC#ORDERBYSCOREDESC))RK
FROMSC)T1
WHERERK<=2;
44、答案:最终SQL如下:
SELECTC#AS课程号,COUNT(*)AS人数
GROUPBYC#
HAVINGCOUNT(*)>10
ORDERBYCOUNT(*)DESC,C#;
45、答案:最终SQL如下:
SELECTS#FROMSCGROUPBYS#HAVINGCOUNT(*)>=2;
46、答案:最终SQL如下:
SELECTC#,CNAME
FROMCOURSE
WHEREC#IN(SELECTC#
FROM(SELECTC#,COUNT(DISTINCTS#)CS#FROMSCGROUPBYC#)
WHERECS#=(SELECTCOUNT(*)FROMSTUDENT));
47、答案:最终SQL如下:
WHERES#NOTIN(SELECTS#
FROMCOURSE,TEACHER,SC
ANDTNAME='李多多');
48、答案:最终SQL如下:
SELECTS#,AVG(NVL(SCORE,0))
WHERES#IN
(SELECTS#FROMSCWHERESCORE<60GROUPBYS#HAVINGCOUNT(*)>2)
GROUPBYS#;
49、答案:最终SQL如下:
SELECTS#
WHEREC#='004'
ANDSCORE<60
ORDERBYSCOREDESC;
50、答案:最终SQL如下:
WHERES#='002'
ANDC#='001';