链接:https://www.nowcoder.com/questionTerminal/a9889965d6fd40aebe8f1865b965f072
来源:牛客网
S 表保存着学生关系,有两列,其中SNO 为学号,SNAME 为姓名
C 表保存着课程关系,有三列,其中CNO 为课程号,CNAME 为课程名,CTEACHER 为老师
SC表保存着选课关系,有三列,其中SNO为学号,CNO为课程号,SCORE 为成绩
1. 找出没有选“小易”老师课程的所有学生姓名
2. 列出有三门(包括三门)以上课程分数>90的学生姓名及其平均成绩
解题思路:问题倒过来看,从结果出发
问题一
首先,看清楚问题是要选出所有的学生姓名,因此可以先找出所有学生的姓名,只在S表中有,如下
SELECT S.SNAME FROM S
接下来就是条件删选:WHERE
其次,找出所有课程,可以看到课程号集中在C表和SC表中,因此我们可以用
SELECT C.CNO FROM C
SELECT SC.CNO FROM SC
然后,找出“小易”老师,也就是在C中,因此可以用
SELECT C.CTEACHER FROM C
再次返回来看问题,有三个限制条件:一个学生对应一个学号,一个课程号对应一个老师,一个老师对应一个姓名
也就是条件删选:三个表中找出选小易老师所有的学生名字
WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO AND C.TEACHER ='小易'
最后,找出没有选“小易”老师课程的所有学生姓名,用NOT IN.
完整:
SELECT S.SNAME FROM S,C,SC,
WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO AND ;
S.SNAME NOT IN (WHERE S.SNO=SC.SNO AND C.CNO=SC.CNO AND C.TEACHER ='小易');
问题二:列出有三门(包括三门)以上课程分数>90的学生姓名及其平均成绩
SELECT S.SNAME,AVG(SC.SCORE) FROM S,SC,C
WHERE S.SNO=SC.SNO C.CNO = SC.CNO
GROUP BY S.SNAME HAVING COUNT(SC.SCORE>90)>=3;
总结:组内分组用HAVING过滤