班级表(CLASS):班级编号classid(NUMBER),班级名称classname(varchar2(30));
学生表(Student):班级编号classID(NUMBER),学号sno(varchar2(15)),姓名sname(varchar2(10)),性别sex (varchar2(6)),年龄age(NUMBER),出生日期birth(date);学号是主键。课程表(Course):课程号cid(NUMBER),课程名cname(varchar2(30));课程号是主键。
成绩表(Grade):学号sno(varchar2(15)),课程号cid(NUMBER),成绩score(NUMBER(5,2));学号和课程号是组合主键。
其中:学生表和成绩表是主外键约束关系,课程表和成绩表是主外键约束关系1 ,  查询每个学生的班级编号、学号、姓名、平均分,结果按平均分降序排列,平均分相同的按班级排序。
2 ,  查询有三门以上不及格学生的基本信息
3、  查询赵云各门课程的成绩(显示的字段为:学生的基本信息和成绩信息) --3
select * from student a join grade b on a.sno=b.sno
--还可以加其他表,比如成绩信息中的课程名,就要连course表,因为grade表没有课程名,只有课程号cid
where a.sname='赵云'
--2
select * from student s where exists(
select 1 from grade where sno=s.sno
where score<60
group by cid having count(1)>=3
)
--1
select a.classid,b.sno,avg(score) as avgscore
from class a join student b on a.classid=b.classid
join grade c on b.sno=c.sno
group by a.clssid,b.sno
order by avg(score) desc,classid

解决方案 »

  1.   

    楼上已说,不过第二个好像写错了,第二个我提供另外一种写法-- 楼上的写法
    --2
    select * from student s where exists(
    select 1 from grade where sno=s.sno
    --where score<60 这里应该是and吧
    and score < 60 
    group by cid having count(1)>=3
    )--2 我的写法select s.* from student s inner join 
    (
      select sno from grade where score<60
      group by sno having count(1)>=3 
    )g on s.sno = g.sno -- 不知道那个性能更好,视情况而定