前几天求职面试,有一道SQL题:给出三个表:学生、课程、成绩,求选修了所有课程的学生。

一道看似很简单的问题,把我难住了,我改了又改,涂涂画画,抓耳挠腮,因为试卷没有多少空白位置了,最后只好放弃。心情大受影响,尽管最后还是获得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、

  1. select * from student s
  2. where not exists(select 1 from class c
  3. where not exists(select 1 from score
  4. 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、

  1. select * from student where sno not in(
  2. select st.sno from student st,class c
  3. where not exists(select 1 from score
  4. where sno=st.sno and cno=c.cno)
  5. )

嵌套里面的语句是有未选修课程的学生

然后外部是不在此名单内的学生

3、

  1. select * from student where sno in(
  2. select st.sno from student st
  3. inner join score sc on st.sno=sc.sno
  4. group by st.sno
  5. having count(*)=(select count(*) from class)
  6. )

这个语句比较容易理解。但效率可能不高,我不确定(select count(*) from class)是否要执行很多次。

版权声明:本文为博主原屙文章,喜欢你就担走。

一条SQL语句面试题:求选修所有课程的学生的更多相关文章

  1. 一条SQL语句求前面记录的平均值

    有算法要求如下: For (i=1,i<=10,i++) { ta[i] = (t[1] + t[2] + ... + t[i]) / i; } 用一条SQL语句实现它: 分别用表变量 @ta ...

  2. sql语句 面试题

    ql语句 面试题   自动编号   学号   姓名 课程编号 课程名称 分数 1        2005001  张三  0001      数学    69 2        2005002  李四 ...

  3. 腾讯面试:一条SQL语句执行得很慢的原因有哪些?---不看后悔系列

    说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你"输入URL回车之后,究竟发生了什么"一样,看看你能说出多少了. 之前腾讯 ...

  4. 一条SQL语句执行得很慢的原因有哪些?

    说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你“输入URL回车之后,究竟发生了什么”一样,看看你能说出多少了. 之前腾讯面试的实话,也问到这 ...

  5. 一条SQL语句执行得很慢的原因有哪些?(转)

    一条 SQL 语句执行的很慢,那是每次执行都很慢呢?还是大多数情况下是正常的,偶尔出现很慢呢?所以我觉得,我们还得分以下两种情况来讨论. 1.大多数情况是正常的,只是偶尔会出现很慢的情况. 2.在数据 ...

  6. 【转】SQL语句面试题

    1.一道SQL语句面试题,关于group by表内容:2005-05-09 胜2005-05-09 胜2005-05-09 负2005-05-09 负2005-05-10 胜2005-05-10 负2 ...

  7. 一条SQL语句执行得很慢的原因有哪些

    说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考你计算机网络的知识时,问你"输入URL回车之后,究竟发生了什么"一样,看看你能说出多少了. 之前腾讯 ...

  8. 一条Sql语句分组排序并且限制显示的数据条数

    如果我想得到这样一个结果集:分组排序,并且每组限定记录集的数量,用一条SQL语句能办到吗? 比如说,我想找出学生期末考试中,每科的前3名,并按成绩排序,只用一条SQL语句,该怎么写? 表[TScore ...

  9. JavaWeb 学习009-4个页面,5条sql语句(添加、查看、修改、删除)

    ===========++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++==+++++++++ 2016-12-3------ ...

随机推荐

  1. No-5.变量的命名

    变量的命名 目标 标识符和关键字 变量的命名规则 0.1 标识符和关键字 1.1 标识符 标示符就是程序员定义的 变量名.函数名 名字 需要有 见名知义 的效果 标示符可以由 字母.下划线 和 数字  ...

  2. 第2节 hive基本操作:11、hive当中的分桶表以及修改表删除表数据加载数据导出等

    分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去 开启hive的桶表功能 set hive.enforce.bucketing= ...

  3. 记录一次通过命令行方式来使用svn碰到的一系列问题

    由于使用Xcode自带的svn管理碰到很多问题,搞得头昏脑胀,找资料时看到小码哥这方面的视频,看完就开始折腾了. 准备:1.远程仓库地址及授权账号(用户名和密码) 2.一份项目代码,之所以要有这份代码 ...

  4. vue hash模式和404页面的配置

    1.设置我们的路由配置文件(/src/router/index.js): { path:'*', component:Error } 这里的path:’*’就是找不到页面时的配置,component是 ...

  5. 循环中i++和++i哪个好

    推荐使用++i,因为不需要返回临时对象,执行效率更高.

  6. 洛谷——P1602 Sramoc问题

    P1602 Sramoc问题 $bfs$搜索 保证第一个搜到的符合条件的就是最小的 #include<bits/stdc++.h> #define N 110000 using names ...

  7. 远程连接mysql数据库

    远程连接mysql数据库需要以下步骤(改表法): 1.数据源(数据库服务器)对要访问数据库进行授权: 2.本地库(本地)连接: 具体方法: 1. 进入数据服务器,输入cmd进入控制台:输入 mysql ...

  8. Courses on Turbulence

    Courses on Turbulence Table of Contents 1. Lecture 1.1. UIUC Renewable energy and turbulent environm ...

  9. amoeba连接mysql--ERROR 2006 (HY000): MySQL server has gone away

    amoeba下载地址:http://sourceforge.net/projects/amoeba/files amoeba version:amoeba-mysql-binary-2.1.0-RC5 ...

  10. MySQL-Transfer2.2发布

    http://dinglin.iteye.com/blog/1888640 Transfer 2.2发布.下载地址 版本说明 1.  基于版本 Percona-5.5.31 ,简单用法是先安装好官方或 ...