有三个表:
学生表:student(sno,sname,sage,ssex)【sno:学生号;sname:学生姓名;】
课程表:course(cno,cname,cteacher)【cno:课程号;cname:课程名称;】
学生选课表:sc(sno,con,grade)【sno:学生号;cno:课程号;grade:课程成绩】
问题是:
1.查询选修了001和002而没有选修003课程的学生学号;
2.计算平均成绩最高的学生学号;
3. 查询选修了两门课以上的学生学号;
1.
select distinct t.sno
from sc t,sc t1
where t.sno=t1.sno
and t.cno='001'
and t1.cno='002'
and t.sno not in
(select distinct t2.sno from sc t2 where t2.cno='003')
2.
select sno
from sc
group by sno
having avg(grade)=
(SELECT max(a.aaa)
FROM (select avg(grade)as aaa from sc GROUP BY Sno) a)
3.
select sno
from sc
group by sno
having count(cn)>=2
ERROR:
SELECT MAX(AVG(Grade)) FROM Sc GROUP BY Sno
OK:
SELECT max(a.aaa) FROM (select avg(grade)as aaa from sc GROUP BY Sno) a
1. 注意如果要让一个使用 GROUP BY 和聚集操作符的查询的结果有意义, 那么
用于分组的属性也必须出现在目标列表中。 所有没有在 GROUP BY 子句里面
出现的属性都只能通过使用聚集函数来选择。 否则就不会有唯一的数值与其
它字段关联.
2. 注意的是在聚集上聚集是没有意义的,比如MAX(AVG(Grade)), 因为 SELECT
只做一个回合的分组和聚集.你可以获得这样的结果, 方法是使用临时表或
者在 FROM 子句中使用一个子 SELECT 做第一个层次的聚集.

被折叠的 条评论
为什么被折叠?



