oracle——SQL複習02

select * from t_score order by sid,cid;


--1./** 查詢“001”課程比“002”課程成績高的所有學生的學號 */
select t1.sid
  from (select t1.sid, t1.grade from t_score t1 where t1.cid = '001') t1
 inner join (select t2.sid, t2.grade from t_score t2 where t2.cid = '002') t2
    on t1.sid = t2.sid
   and t1.grade > t2.grade;


--考慮到t_score中的cid只有001沒有002的數據,將其歸0處理  
select t1.sid
  from (select t.sid,
               --case when t1.cid is null then '001' else t1.cid end cid, 
               nvl(t1.cid, '001') cid,
               nvl(t1.grade, 0) grade
          from t_student t
          left join (select t1.sid, t1.cid, t1.grade
                      from t_score t1
                     where t1.cid = '001') t1
                        on t.sid = t1.sid
          ) t1
 inner join (select t.sid, nvl(t2.cid, '002') cid, nvl(t2.grade, 0) grade
               from t_student t
               left join (select t2.sid, t2.cid, t2.grade
                           from t_score t2
                          where t2.cid = '002') t2
                             on t.sid = t2.sid
          ) t2
    on t1.sid = t2.sid
   and t1.grade > t2.grade;


 
--/**查詢所有同學的學號、姓名、選課數、總成績*/
select * from t_score;


select t.sid, t1.num, t1.sum_grade
  from t_student t
  left join (select t.sid, count(1) num, sum(t.grade) sum_grade
               from t_score t
              group by t.sid) t1
    on t.sid = t1.sid 



-- 查詢每門功成績最好的前兩名  
select t.sid, t.cid, t.grade
  from (select t.sid,
               t.cid,
               t.grade,
               row_number() over(partition by cid order by grade desc) rn
          from t_score t) 
          t
 where rn <= 2


--/** 查詢兩門以上不及格課程的同學的學號及其平均成績 */
select * from t_score t order by sid;

-- 這條語句算出來的是59分以下的平均成績
select t1.sid, nvl(t2.cmt,0) cmt, nvl(t2.avg_grade,0) avg_grade
  from t_student t1
  inner join (select t.sid, count(1) cmt, round(avg(t.grade) ,2) avg_grade
               from t_score t
              where t.grade <= 59
              group by t.sid) t2
    on t1.sid = t2.sid 
    and cmt > = 2 ;
 -- 這條纔是按sid計算的平均成績
select t1.sid, round(avg(nvl(t1.grade, 0)), 2) avg_grade
  from t_score t1
 where t1.sid in ( 
        select t.sid from ( 
               select t.sid, count(1) cmt
                      from t_score t
               where t.grade <= 59
               group by t.sid) t
                   where t.cmt > = 2
                ) 
 group by t1.sid ;

select t1.sid, round(avg(nvl(t1.grade, 0)), 2) avg_grade
  from t_score t1
 where t1.sid in (  
               select t.sid   from t_score t
               where t.grade <= 59
               group by t.sid 
               having  count(1)  >= 2 
                ) 
 group by t1.sid ;



---、查詢平均成績大於60分的同學的學號和平均成績;
select t.sid,avg(t.grade)  from t_score t group by t.sid having avg(t.grade) > 60;

--查詢沒學過“葉平”老師課的同學的學號、姓名
 
-- 1 獲取tid 2 獲取cid  3獲取sid 4取差集
select t.sid, t.sname
  from t_student t
 where t.sid not in
       (select distinct t.sid
          from t_score t
         where t.cid in
               (select t.cid
                  from t_course t
                 where t.tid =
                       (select t.tid from t_teacher t where t.tname = '葉平')));

select sid, sname
  from t_student
 where sid not in (select distinct t1.sid
                     from t_score t1, t_course t2, t_teacher t3
                    where t1.cid = t2.cid
                      and t3.tid = t2.tid
                      and t3.tname = '葉平');

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章