Oracle 之 SQL 面试题
<一>
有3个表S,C,SC
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号成绩)
问题:
1,找出没选过“黎明”老师的所有学生姓名。
2,列出2门以上(含2门)不及格学生姓名及平均成绩。
3,即学过1号课程又学过2号课所有学生的姓名。
请用标准SQL语言写出答案,方言也行(请说明是使用什么方言)。
详解并创建表测试
1.表的创建并添加记录
create table s
(
sno number(6) primary key,
sname varchar2(20)
);
insert into s values (1,'x1');
insert into s values (2,'x2');
======================
create table c
(
cno number(6) primary key,
cname varchar2(20),
cteacher varchar2(20)
) ;
insert into s values (1001,'yuwen','liming');
insert into s values (1002,'shuxue','fan');
insert into s values (1003,'english','lily');
insert into s values (1004,'lishi','liming');
insert into s values (1005,'huaxue','wang');
=======================
create table sc
(
sno number(6),
cno number(6),
scgrade number(3),
constraint sno_cno_uni unique(sno,cno)
);
insert into sc values (1,1001,92);
insert into sc values (1,1002,72);
insert into sc values (1,1003,82);
insert into sc values (2,1001,42);
insert into sc values (2,1003,32);
insert into sc values (2,1004,56);
insert into sc values (3,1002,74);
insert into sc values (3,1003,44);
insert into sc values (3,1005,94);
insert into sc values (4,1002,62);
insert into sc values (4,1003,92);
insert into sc values (4,1004,82);
insert into sc values (5,1003,52);
insert into sc values (5,1004,62);
insert into sc values (5,1005,46);
====================
2.详解
问题1:找出没选过“黎明”老师的所有学生姓名。
求解过程:
a.求黎明老师教的所有课的课号
select cno from c where cteacher='liming';
b.求选了“黎明”老师的所有学生的学号
select distinct sno from sc
where cno in (select cno from c where cteacher='liming');
c.求未选“黎明”老师的所有学生的姓名
select sname from s where sno not in
(select distinct sno from sc
where cno in (select cno from c where cteacher='liming')
);
最终求的结果是 x3;
问题2:列出2门以上(含2门)不及格学生姓名及平均成绩。
求解过程:
a.求出所有学生中有2门及以上不及格的学生学号
(having函数对于group by函数的过滤 不能用where)
select sno from sc where scgrade<60 group by sno having count(sno)>1;
b.根据第一步求出的学号,追出至少2门不及格学生姓名。
select sname from s where sno in
(select sno from sc where scgrade<60 group by sno having count(sno)>1);
求出结果为 x2, x5
c.根据第一步求出的学号,求出至少2门不及格学生的平均成绩(含有及格部分的成绩混在一起,即学生所有课程的总平均)
select sno, avg(scgrade) from sc group by sno having sno in
(select sno from sc where scgrade<60 group by sno having count(sno)>1);
d.根据第一步求出的学号,求出至少2门不及格学生的平均成绩(仅仅不及格部分求平均)
select sno, avg(scgrade) from sc where scgrade<60 group by sno having sno in
(select sno from sc where scgrade<60 group by sno having count(sno)>1);
问题3:既学过1001号课程又学过1002号课所有学生的姓名。
求解过程:
第一步:学过1001号课程的学号
select sno from sc where cno = 1001
第二步:学过1002号课程的学号
select sno from sc where cno = 1002
第三步:既学过1001号课程,也学过1002号课程的学生学号
select t1.sno from
(select sno from sc where cno = 1001) t1 join
(select sno from sc where cno = 1002) t2 on
t1.sno=t2.sno;
第四步:根据学生学号,追出姓名。
select sname from s where sno in
(
select t1.sno from
(select sno from sc where cno = 1001) t1 join
(select sno from sc where cno = 1002) t2 on
t1.sno=t2.sno
);
求出结果为
x1;
注意:此面试题看似简单。却可以锻炼自己的逻辑思维。
=====================