一条SQL语句面试题:求选修所有课程的学生
2015-03-12 00:13
309 查看
前几天求职面试,有一道SQL题:给出三个表:学生、课程、成绩,求选修了所有课程的学生。
一道看似很简单的问题,把我难住了,我改了又改,涂涂画画,抓耳挠腮,因为试卷没有多少空白位置了,最后只好放弃。心情大受影响,尽管最后还是获得offer。
但是心中有愧呀!
于是在机器上试了试:
先建好表
我想到了三种写法:1、[sql] view plaincopyselect * from student s
where not exists(select 1 from class c
where not exists(select 1 from score
where sno=s.sno and cno=c.cno));
两个not exists。我当时是只写了一个。由内嵌到外部,1)不存在一门为当前学生所选修的课程select 1 from class c where not exists(select 1 from score where sno=s.sno and cno=c.cno)
2)不存在 情况1),也就是不存在当前学生有没选修的课程这种情况换言之,当前学生选修了所有的课程
2、[sql] view plaincopyselect * from student where sno not in(
select st.sno from student st,class c
where not exists(select 1 from score
where sno=st.sno and cno=c.cno)
)
嵌套里面的语句是有未选修课程的学生然后外部是不在此名单内的学生
3、
[sql] view plaincopyselect * from student where sno in(
select st.sno from student st
inner join score sc on st.sno=sc.sno
group by st.sno
having count(*)=(select count(*) from class)
)
这个语句比较容易理解。但效率可能不高,我不确定(select count(*) from class)是否要执行很多次。
一道看似很简单的问题,把我难住了,我改了又改,涂涂画画,抓耳挠腮,因为试卷没有多少空白位置了,最后只好放弃。心情大受影响,尽管最后还是获得offer。
但是心中有愧呀!
于是在机器上试了试:
先建好表
use test; go create table student(sno varchar(50) not null,name varchar(50) not null); insert into student(sno,name) values('001','张三'); insert into student(sno,name) values('002','李四'); insert into student(sno,name) values('003','王五'); create table class(cno varchar(50) not null,name varchar(50) not null) insert into class(cno,name) values('c01','数据结构'); insert into class(cno,name) values('c02','操作系统'); insert into class(cno,name) values('c03','计算机组成原理'); insert into class(cno,name) values('c04','网络基础'); create table score(sno varchar(50) not null,cno varchar(50) not null,score decimal(18,2) not null) insert into score(sno,cno,score) values('001','c01',80); insert into score(sno,cno,score) values('001','c02',85); insert into score(sno,cno,score) values('001','c03',89); insert into score(sno,cno,score) values('001','c04',87); insert into score(sno,cno,score) values('002','c01',80); insert into score(sno,cno,score) values('003','c04',70);
我想到了三种写法:1、[sql] view plaincopyselect * from student s
where not exists(select 1 from class c
where not exists(select 1 from score
where sno=s.sno and cno=c.cno));
两个not exists。我当时是只写了一个。由内嵌到外部,1)不存在一门为当前学生所选修的课程select 1 from class c where not exists(select 1 from score where sno=s.sno and cno=c.cno)
2)不存在 情况1),也就是不存在当前学生有没选修的课程这种情况换言之,当前学生选修了所有的课程
2、[sql] view plaincopyselect * from student where sno not in(
select st.sno from student st,class c
where not exists(select 1 from score
where sno=st.sno and cno=c.cno)
)
嵌套里面的语句是有未选修课程的学生然后外部是不在此名单内的学生
3、
[sql] view plaincopyselect * from student where sno in(
select st.sno from student st
inner join score sc on st.sno=sc.sno
group by st.sno
having count(*)=(select count(*) from class)
)
这个语句比较容易理解。但效率可能不高,我不确定(select count(*) from class)是否要执行很多次。
相关文章推荐
- 一条SQL语句面试题:求选修所有课程的学生
- 一条SQL语句面试题:求选修所有课程的学生
- 面试题:用一条sql语句查询出“每门”课程都大于80分的学生姓名
- SQL语句之查找一个表在另一个表上的所有映射(如学生在选课表上的所有映射,即查询选修所有课程的学生姓名)
- 面试题:用一条sql语句查询出“每门”课程都大于80分的学生姓名
- 用一条SQL语句 查询出每门课程都大于80分的学生姓名" 的实现方式
- 查询至少选修了两门课程的学生学号的sql语句
- 用一条sql语句查询出“每门”课程都大于80分的学生姓名
- sql面试题:用一条SQL语句查出不重复的所有记录
- SQL查询选修了所有课程的学生姓名
- 学生各门课程成绩统计SQL语句大全
- 这个sql语句:列出各门课程成绩最好的两位学生?
- 用一条SQL语句 查询出每门课都大于80分的学生姓名
- vc++学生选课系统开发 sql语句操作数据库 修改课程名模块
- 一条SQL语句查询无限递归树所有数据
- 一条SQL语句查询数据库中所有的信息
- 一条SQL语句查询数据库中的所有表、存储过程、触发器
- SQL学习(5)查询选修全部课程的学生
- SQL用一条SQL语句 查询出每门课都大于80分的学生姓名
- 一条SQL语句查询数据库中的所有表、存储过程、触发器 (sysobjects表信息)