Oracle

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;

 

注意:此面试题看似简单。却可以锻炼自己的逻辑思维。


=====================

 

 

你可能感兴趣的:(oracle,C++,c,面试,C#)