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 = '葉平');
oracle——SQL複習02
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.