Oracle练习2-习题及答案

本文精选了46道SQL查询题目及解答,涵盖了复杂查询、联表查询、子查询等多种技巧,帮助读者掌握SQL语言的核心应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在出处拿到的有答案,但是有的答案不正确,这里做了部分更改,通过验证是通过的
有两道没写答案的,是我不会^_^

– 1、查询“c001”课程比“c002”课程成绩高的所有学生的学号;

SELECT a.sno FROM 
(SELECT * FROM sc WHERE CNO='c001') a,
(SELECT * FROM sc WHERE CNO='c002') b 
WHERE a.sno=b.sno AND a.score >= b.score;

– 2、查询平均成绩大于60 分的同学的学号和平均成绩;

SELECT SNO AS xuehao,AVG(score) AS pingjunfen FROM sc GROUP BY SNO HAVING AVG(score) >60;

– 3、查询所有同学的学号、姓名、选课数、总成绩;
– SELECT a.SNO,a.SNAME,b.cnoc,b.ssc FROM student a,(SELECT b.SNO AS SNO, COUNT(CNO) AS CNOC,SUM(score) AS SSC FROM sc b GROUP BY SNO) b WHERE a.sno=b.SNO;

SELECT S.SNAME,B.* FROM (SELECT SNO, COUNT(CNO),SUM(score) FROM sc b GROUP BY SNO) b,STUDENT S WHERE B.SNO=S.SNO;

– 4、查询姓“liu”的老师的个数;

SELECT COUNT(*) FROM TEACHER WHERE TNAME LIKE 'liu%';

– 5、查询没学过“zhanyan”老师课的同学的学号、姓名;

SELECT A.SNO,A.SNAME FROM STUDENT A 
WHERE A.SNO NOT IN 
  (SELECT DISTINCT B.SNO FROM SC B WHERE B.CNO IN 
    (SELECT S.CNO FROM COURSE S WHERE S.TNO=
      (SELECT TNO FROM TEACHER WHERE TNAME='zhanyan')
    )
)
select a.sno,a.sname from student a
where a.sno
not in
(select distinct s.sno
 from sc s,
      (select c.*
       from course c ,
           (select tno
            from teacher t
            where tname='zhanyan')t
       where c.tno=t.tno) b
  where s.cno = b.cno )

– 6、查询学过“c001”并且也学过编号“c002”课程的同学的学号、姓名;

SELECT DISTINCT( ST.SNO ),ST.SNAME FROM STUDENT ST ,
(SELECT S.SNO,COUNT(S.SNO) FROM SC S WHERE S.CNO='c001' OR S.CNO='c002' GROUP BY S.SNO HAVING COUNT(S.SNO)=2) S WHERE ST.SNO=S.SNO;
select * from sc a
join sc b on a.sno=b.sno
join student st 
on st.sno=a.sno
where a.cno='c001' and b.cno='c002' and st.sno=a.sno;
select st.sno,st.sname from sc a
join sc b on a.sno=b.sno
join student st
on st.sno=a.sno
where a.cno='c001' and b.cno='c002' and st.sno=a.sno;

– 7、查询学过“谌燕”老师所教的所有课的同学的学号、姓名;

SELECT SNO,SNAME FROM STUDENT WHERE SNO IN
(SELECT A.SNO FROM SC A 
JOIN COURSE B ON A.CNO=B.CNO
JOIN TEACHER C ON C.TNO=B.TNO
AND C.TNAME='zhanyan')
select DISTINCT st.* from student st 
join sc s on st.sno=s.sno
join course c on s.cno=c.cno
join teacher t on c.tno=t.tno
where t.tname='zhanyan'

– 8、查询课程编号“c002”的成绩比课程编号“c001”课程低的所有同学的学号、姓名;

SELECT SNO,SNAME FROM STUDENT WHERE SNO IN 
(SELECT A.SNO FROM SC A 
JOIN SC B ON A.CNO='c001' AND B.CNO='c002' AND A.SNO=B.SNO
AND A.SCORE>B.SCORE);

select * from student st
join sc a on st.sno=a.sno
join sc b on st.sno=b.sno
where a.cno='c002' and b.cno='c001' and a.score < b.score

– 9、查询所有 课程成绩小于60 分的同学的学号、姓名;

SELECT SNO,SNAME FROM STUDENT WHERE SNO IN  
(SELECT A.SNO FROM SC A WHERE A.SCORE<60);

select st.*,s.score from student st
join sc s on st.sno=s.sno
join course c on s.cno=c.cno
where s.score <60;

– 10、查询没有学全所有课的同学的学号、姓名;

SELECT ST.SNO,ST.SNAME FROM STUDENT ST
LEFT JOIN SC S ON ST.SNO=S.SNO
GROUP BY ST.SNO,ST.SNAME
HAVING COUNT(S.CNO) < (SELECT COUNT(C.CNO) FROM COURSE C);

select stu.sno,stu.sname,count(sc.cno) from student stu
left join sc on stu.sno=sc.sno
group by stu.sno,stu.sname
having count(sc.cno)<(select count(distinct cno)from course)

– 11、查询至少有一门课与学号为“s001”的同学所学相同的同学的学号和姓名;

SELECT ST.SNO,ST.SNAME FROM STUDENT ST WHERE ST.SNO IN 
(SELECT S.SNO FROM SC S WHERE S.CNO IN (SELECT CNO FROM SC WHERE SNO='s001')  AND S.SNO!='s001')

SELECT DISTINCT ST.SNO,ST.SNAME FROM STUDENT ST
JOIN SC S ON S.SNO=ST.SNO AND S.CNO IN (SELECT CNO FROM SC WHERE SNO='s001') AND S.SNO!='s001'

select st.* from student st,
(select distinct a.sno from
(select * from sc) a,
(select * from sc where sc.sno='s001') b
where a.cno=b.cno) h
where st.sno=h.sno and st.sno<>'s001'

– 12、查询至少学过学号为“s001”同学所有一门课的其他同学学号和姓名;
– 同上

– 13、把“SC”表中“谌燕”老师教的课的成绩都更改为此课程的平均成绩;
– 什么鬼

– 14、查询和“s001”号的同学学习的课程完全相同的其他同学学号和姓名;
– 什么鬼

– 15、删除学习“谌燕”老师课的SC 表记录;

DELETE FROM SC S WHERE S.CNO IN (
SELECT C.CNO FROM COURSE C
JOIN TEACHER T ON T.TNO=C.TNO AND T.TNAME='zhanyan');
COMMIT;

DELETE FROM SC S WHERE S.SCORE='79.23';
SELECT * FROM SC S WHERE S.SCORE='79.23';
COMMIT;
insert into sc values ('s001','c001',78.9);
insert into sc values ('s002','c001',80.9);
insert into sc values ('s003','c001',81.9);
insert into sc values ('s004','c001',60.9);
insert into sc values ('s001','c002',82.9);
insert into sc values ('s002','c002',72.9);
insert into sc values ('s003','c002',81.9);
insert into sc values ('s001','c003',59);
insert into sc values ('s005','c003',59);
commit;
select * from sc;


select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT
  from v$session a, v$sqlarea b 
where a.sql_address = b.address

– 16、向SC 表中插入一些记录,这些记录要求符合以下条件:没有上过编号“c002”课程的同学学号、“c002”号课的平均成绩;

INSERT INTO SC
SELECT * FROM 
(SELECT DISTINCT ST.SNO FROM STUDENT ST
MINUS
SELECT S.SNO FROM SC S WHERE S.CNO='c002') STNO 
LEFT JOIN (SELECT SC.CNO,AVG(SC.SCORE) FROM SC SC WHERE SC.CNO='c002' GROUP BY SC.CNO) SCC ON 1=1;
COMMIT;

INSERT INTO SC
SELECT STNO.SNO,'c002',(SELECT AVG(SC.SCORE) FROM SC SC WHERE SC.CNO='c002') FROM 
(SELECT DISTINCT ST.SNO FROM STUDENT ST
MINUS
SELECT S.SNO FROM SC S WHERE S.CNO='c002') STNO 

select distinct st.sno,sc.cno,(select avg(score)from sc where cno='c002')
from student st,sc
where not exists
(select * from sc where cno='c002' and sc.sno=st.sno) and sc.cno='c002';

– 17、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分

SELECT SC.CNO AS CID,MAX(SC.SCORE) AS HS,MIN(SC.SCORE) AS LS FROM SC GROUP BY SC.CNO;

– 18、按各科平均成绩从低到高和及格率的百分数从高到低排序

SELECT SC.CNO, AVG(SC.SCORE),sum(case when score>=60 then 1 else 0 end)/count(*)
as jige FROM SC SC 
GROUP BY SC.CNO
ORDER BY AVG(SC.SCORE),jige DESC;

select cno,avg(score),sum(case when score>=60 then 1 else 0 end)/count(*)
as jige
from sc group by cno
order by avg(score) , jige desc

– 19、查询不同老师所教不同课程平均分从高到低显示

SELECT DISTINCT * FROM TEACHER T
 JOIN COURSE C ON C.TNO=T.TNO
 JOIN 
(SELECT SC.CNO,AVG(SC.SCORE) FROM SC SC GROUP BY SC.CNO ORDER BY AVG(SC.SCORE) DESC) SCC ON SCC.CNO=C.CNO ;

select max(t.tno),max(t.tname),max(c.cno),max(c.cname),c.cno,avg(score) from sc , course c,teacher t
where sc.cno=c.cno and c.tno=t.tno
group by c.cno
order by avg(score) desc

– 20、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]

SELECT S.CNO,C.CNAME,
SUM(CASE WHEN SCORE BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS "85-100",
SUM(CASE WHEN SCORE BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS "70-85",
SUM(CASE WHEN SCORE BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS "60-70",
SUM(CASE WHEN SCORE<60 THEN 1 ELSE 0 END) AS "<60"
FROM SC S,COURSE C
WHERE S.CNO=C.CNO
GROUP BY S.CNO,C.CNAME;

select sc.cno,c.cname,
sum(case  when score between 85 and 100 then 1 else 0 end) AS "[100-85]",
sum(case  when score between 70 and 85 then 1 else 0 end) AS "[85-70]",
sum(case  when score between 60 and 70 then 1 else 0 end) AS "[70-60]",
sum(case  when score <60 then 1 else 0 end) AS "[<60]"
from sc, course c
where  sc.cno=c.cno
group by sc.cno ,c.cname;

– 21、查询各科成绩前三名的记录:(不考虑成绩并列情况)

select * from (
SELECT SNO,CNO,SCORE,row_number()over(partition by cno order by score desc) as rn FROM SC) res WHERE res.rn<4;

select * from
(select sno,cno,score,row_number()over(partition by cno order by score desc) rn from sc)
where rn<4

– 22、查询每门课程被选修的学生数

SELECT COUNT(SNO),CNO FROM SC GROUP BY CNO;

– 23、查询出只选修了一门课程的全部学生的学号和姓名

SELECT ST.SNO,ST.SNAME FROM STUDENT ST
WHERE ST.SNO IN (
SELECT S.SNO FROM SC S GROUP BY S.SNO HAVING COUNT(S.CNO)=1)

select sc.sno,st.sname from student st
 join sc
on sc.sno=st.sno
group by st.sname,sc.sno having count(cno)=1;

– 24、查询男生、女生人数

SELECT SSEX,COUNT(SSEX) FROM STUDENT GROUP BY SSEX;

– 25、查询姓“张”的学生名单

SELECT SNAME FROM STUDENT WHERE SNAME LIKE 'zhang%';

– 26、查询同名同姓学生名单,并统计同名人数

SELECT SNAME,COUNT(SNAME) FROM STUDENT GROUP BY SNAME HAVING COUNT(SNAME)>1;

– 27、1981 年出生的学生名单(注:Student 表中Sage 列的类型是number)

SELECT SNO,SNAME,TO_CHAR(SYSDATE,'YYYY') FROM STUDENT WHERE TO_CHAR(SYSDATE,'YYYY')-SAGE=1994;

select sno,sname,sage,ssex from student t where to_char(sysdate,'yyyy')-sage =1988

– 28、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列

SELECT CNO,AVG(SCORE) FROM SC GROUP BY CNO ORDER BY AVG(SCORE),CNO DESC;

– 29、查询平均成绩大于85 的所有学生的学号、姓名和平均成绩

SELECT ST.SNO,ST.SNAME,AVG(S.SCORE) FROM STUDENT ST
JOIN SC S ON S.SNO=ST.SNO
GROUP BY ST.SNO,ST.SNAME,S.SNO HAVING AVG(S.SCORE)>80;


SELECT S.SNO,(SELECT ST.SNAME FROM STUDENT ST WHERE ST.SNO=S.SNO) AS NAME,AVG(S.SCORE) AS AVGS FROM SC S GROUP BY S.SNO HAVING AVG(S.SCORE)>80;

– 30、查询课程名称为“数据库”,且分数低于60 的学生姓名和分数

SELECT ST.SNAME,S.SCORE FROM STUDENT ST
JOIN SC S ON S.SNO=ST.SNO
AND S.SCORE<80
JOIN COURSE C ON C.CNO=S.CNO AND C.CNAME='Java Web';

select sname,score from student st,sc,course c
where st.sno=sc.sno and sc.cno=c.cno and c.cname='Java Web' and sc.score<80

– 31、查询所有学生的选课情况;

SELECT ST.SNO,ST.SNAME,C.CNAME FROM STUDENT ST
JOIN SC S ON S.SNO=ST.SNO
JOIN COURSE C ON C.CNO=S.CNO;

select st.sno,st.sname,c.cname from student st,sc,course c
where sc.sno=st.sno and sc.cno=c.cno;

– 32、查询任何一门课程成绩在70 分以上的姓名、课程名称和分数;

SELECT ST.SNAME,C.CNAME,S.SCORE FROM STUDENT ST ,SC S,COURSE C 
WHERE S.SCORE>70 AND S.CNO=C.CNO AND ST.SNO=S.SNO;

SELECT ST.SNAME,C.CNAME,S.SCORE FROM STUDENT ST 
JOIN SC S ON S.SNO=ST.SNO
AND S.SCORE>70
JOIN COURSE C ON C.CNO=S.CNO;

– 33、查询不及格的课程,并按课程号从大到小排列

SELECT S.CNO,S.SCORE,C.CNAME FROM SC S,COURSE C WHERE S.SCORE<60 AND C.CNO=S.CNO ORDER BY S.CNO DESC;

SELECT S.CNO,S.SCORE,C.CNAME FROM SC S
JOIN COURSE C ON C.CNO=S.CNO AND S.SCORE<60
ORDER BY S.CNO DESC;

– 34、查询课程编号为c001 且课程成绩在80 分以上的学生的学号和姓名;

SELECT ST.SNO,ST.SNAME FROM STUDENT ST
JOIN SC S ON S.SNO=ST.SNO
AND S.SCORE>80 AND S.CNO='c001';

SELECT ST.SNO,ST.SNAME FROM STUDENT ST,SC S WHERE S.SNO=ST.SNO AND S.SCORE>80 AND S.CNO='c001';

– 35、求选了课程的学生人数

SELECT COUNT(DISTINCT S.SNO) FROM SC S;

– 36、查询选修“谌燕”老师所授课程的学生中,成绩最高的学生姓名及其成绩

SELECT ST.SNAME,S.SCORE FROM STUDENT ST,SC S,COURSE C,TEACHER T 
WHERE S.SNO=ST.SNO AND C.CNO=S.CNO AND T.TNO=C.TNO AND T.TNAME='zhanyan' AND
S.SCORE=(SELECT MAX(SCORE) FROM SC WHERE SC.CNO=C.CNO);

SELECT * FROM (SELECT ST.SNAME,MAX(S.SCORE) FROM STUDENT ST
JOIN SC S ON S.SNO=ST.SNO
JOIN COURSE C ON C.CNO=S.CNO
JOIN TEACHER T ON T.TNO=C.TNO
AND T.TNAME='zhanyan'
GROUP BY ST.SNAME,C.CNO ORDER BY MAX(S.SCORE) DESC) INFO WHERE ROWNUM=1;


select st.sname,score from student st,sc ,course c,teacher t
where st.sno=sc.sno and sc.cno=c.cno and c.tno=t.tno
and t.tname='zhanyan' and sc.score=
(select max(score)from sc where sc.cno=c.cno)

– 37、查询各个课程及相应的选修人数

SELECT C.CNAME,COUNT(*) FROM COURSE C,SC S
WHERE C.CNO=S.CNO GROUP BY C.CNAME;

select cno,count(sno) from sc group by cno;

– 38、查询不同课程成绩相同的学生的学号、课程号、学生成绩

SELECT S1.* FROM SC S1
JOIN SC S2 ON S1.SCORE=S2.SCORE AND S1.CNO!=S2.CNO;

select a.* from sc a ,sc b where a.score=b.score and a.cno<>b.cno

– 39、查询每门功课成绩最好的前两名

SELECT * FROM (SELECT S.SNO,S.SCORE,ROW_NUMBER()OVER(PARTITION BY S.CNO ORDER BY S.SCORE DESC) AS RN FROM SC S) RES WHERE RES.RN<3;

– 40、统计每门课程的学生选修人数(超过10 人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

SELECT S.CNO,COUNT(S.CNO) FROM SC S
GROUP BY S.CNO HAVING COUNT(S.CNO)>3 ORDER BY COUNT(S.CNO) DESC,S.CNO;

– 41、检索至少选修两门课程的学生学号

SELECT S.SNO FROM SC S
GROUP BY S.SNO HAVING COUNT(S.CNO)>=2;

– 42、查询全部学生都选修的课程的课程号和课程名

SELECT C.CNO,C.CNAME FROM COURSE C
WHERE C.CNO=(SELECT SX.CNO FROM (SELECT S.CNO,COUNT(S.SNO),ROW_NUMBER()OVER(ORDER BY COUNT(SNO) DESC) AS RN FROM SC S GROUP BY S.CNO) SX WHERE SX.RN=1);



select cno,cname from course c
where c.cno in
(select cno from sc group by cno)

– 43、查询没学过“谌燕”老师讲授的任一门课程的学生姓名

SELECT ST.SNAME FROM STUDENT ST
MINUS
SELECT ST.SNAME FROM STUDENT ST 
JOIN SC S ON S.SNO=ST.SNO
JOIN COURSE C ON C.CNO=S.CNO
JOIN TEACHER T ON T.TNO=C.TNO AND T.TNAME='zhanyan';

– 44、查询两门以上不及格课程的同学的学号及其平均成绩

SELECT ASNO.SNO,ASNO.AVGS  FROM (SELECT S.SNO FROM SC S WHERE S.SCORE<60 GROUP BY S.SNO HAVING COUNT(S.SNO)>1) SSNO
JOIN (SELECT S.SNO,AVG(S.SCORE) AS AVGS FROM SC S GROUP BY S.SNO) ASNO ON SSNO.SNO=ASNO.SNO;

select sno,avg(score)from sc
where sno in
(select sno from sc where sc.score<60
group by sno having count(sno)>1
) group by sno;

– 45、检索“c003”课程分数小于60,按分数降序排列的同学学号

SELECT S.SNO FROM SC S WHERE S.SCORE<60 AND S.CNO='c003' ORDER BY S.SCORE DESC;

– 46、删除“s002”同学的“c001”课程的成绩

DELETE FROM SC WHERE SNO='s002' AND CNO='c001';
COMMIT;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值