zoukankan      html  css  js  c++  java
  • 一条SQL语句面试题:求选修所有课程的学生

    前几天求职面试,有一道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)是否要执行很多次。


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

  • 相关阅读:
    Mach-O iOS
    IPA的构建原理 iOS
    输入网址进入网页按回车刷新网页都发生了什么?URL 输入到显示的过程?
    LeetCode另一棵树的子树Swift
    如何解决静态库的冲突问题 iOS
    LeetCode下一个更大元素 I Swift -- 单调递增栈
    UITapGestureRecognizer 和 UICollectionView/UITableView等点击事件冲突问题
    UITableView/UICollectionView调用reloadData刷新时界面闪烁
    C#绘制折线图或曲线图,直接返回Image对象或图片文件
    C#反射+继承+接口的应用
  • 原文地址:https://www.cnblogs.com/leftfist/p/4764258.html
Copyright © 2011-2022 走看看