现有三个自由表:
学生信息表:myStudent,由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在院系(Sdept)五个属性组成,其中为Sno主码。
课程信息表:myCourse,由课程号(Cno)、课程名(Cname)、选修课号(Cpno)、学分(Ccredit)四个属性组成,其中Cno为主码。
学生选课表:mySc,由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成,主码为(Sno, Cno),有外键约束。
我想得到的是个人平均分高于所有人平局分的个人所有信息
我的语句是:
select a.sno , a.sname , a.ssex , a.sage , a.sdept , b.cno , b.cname , b.cpno , b.ccredit , c. grade from 
mystudent a left join mysc c on a.sno = c.sno left join mycourse b on c.cno = b.cno ,
(select avg(to_number(grade)) grade1 from mysc c) d , (select sno,avg(to_number(grade)) grade2 from mysc c group by c.sno ) e
where a.sno in e.sno and e.grade2 > d.grade1能查到想要的结果,就是感觉太长
有没有比较方便快捷的方式?

解决方案 »

  1.   

    我认为课程信息表是没有用的,可以不用。你参考下我写的
    SELECT A.SNO,
           A.SNAME,
           A.SSEX,
           A.SAGE,
           A.SDEPT,
           B.CNO,
           B.CNAME,
           B.CPNO,
           B.CCREDIT,
           C. GRADE
      FROM MYSTUDENT A  --学生信息表
      LEFT JOIN 
     (SELECT SNO, AVG(TO_NUMBER(GRADE)) GRADE2 FROM MYSC C GROUP BY C.SNO) E
     ON A.SNO = E.SNO
       WHERE  E.GRADE2 > (SELECT AVG(TO_NUMBER(GRADE)) GRADE1 FROM MYSC C)
      

  2.   

    select Sno,Cno from (
        select  Sno,Cno,
        avg(Grade) over(partition by Sno) savg,
        avg(Grade) over() allavg from mysc
        ) where savg > allavg ;这里只有编号,想要学生信息再连接一次,在里面连接也可以。