排错SQL:列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩

来源:百度知道 编辑:UC知道 时间:2024/05/27 18:13:39
已知关系模式:
S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名
C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师
SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩

写一SQL,功能:列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩

我写为:
select s.sname,avg(sc.scgrade)
from s,sc
where s.sno=sc.sno and
s.sno in(
select sc1.sno
from sc sc1
where sc1.scgrade<60
group by sc1.sno
having count(sc1.sno)>=2
)
结果提示出错:
-- 服务器: 消息 8118,级别 16,状态 1,行 16
-- 列 's.SNAME' 在选择列表中无效,因为该列未包含在聚合函数中,并且没有 GROUP BY 子句:

另外,下面的SQL是可以的(但我想知道为什么上面的SQL 有问题)
select s.sno,s.sname,ave(scgrade)
from s,sc,(select cno from sc wherescgrade<60 group by sno having count(distinct cno)>=2) A
where s.sno=a.sno and sc.sno=a.sno
group by s.sno,s.sname

因为你按照s.sname分了组并且用了聚集函数avg(sc.scgrade),就必须用group by按照s.sname分组才行啊,如果select中没有s.sname,只有聚集函数avg(sc.scgrade)的话肯定就是对的,但是不符合你题目的要求了。下面这个就是对的了,因为除了聚集函数的选择项都被分组了,在上面那个后面加上group by s.sname应该就对了,不过不知道sname是不是唯一键。
唉,也不知道自己说清楚没,不清楚的可以发信问我。

你只在子查询用了分组,而主查询用到了聚合函数(avg),所以也要用分组(group by),将s.SNAME分组就正确了

所以记住一点就好,查询中出现了使用聚合函数以后,后面一定要用group by,而且group by 后接查询中除了聚合函数的所有列名

上面用了聚合函数但没有给其分组嘛!
比较下面的就看得出来了嘛!