一道SQL的面试题之联想

本人工作在一家小型的民营企业,主要从事业务系统的日常维护,二次开发,菜鸟一枚。周五经理准备面试两个开发人员,据简历,都还比较不错,让经理产生了想法,于是准备了一套面试题目,给我们亮了一道SQL题目,非他之手,据出此题者说,如果面试者只能写出一种方法,基本可以pass。请读者仔细看题:

题目:如下表,用一条select语句求出所有课程在80分(含80分)以上的学生姓名,请写出所有可行方案。(注意:表名为sc,字段为name,kc,score)

这道题目并不陌生吧,相信大家一看就能下手,但是人往往对简单的东西总是不屑一顾,就拿此题说吧,不难,相信做开发的都能做,百度一大把答案,你也许会说这是小儿科,这样的面试题没有任何意义,真的是这样的吗?想想我们做IT相关的工作的核心是什么?技术不行可以借助百度,谷歌,群友,论坛逐步学习并掌握,思维呢……我敢断言,只会码代码的人绝不是一名优秀的程序员,常言道,规矩是死的,人是活的。人的思维是至关重要的,无论哪一行,没有一个好思维,难成器。不要以为简单,其实不见得比你想象的简单,你对此题能提供几种方案?

下面进行剖析:

1)准备数据:

 use test2012
go
if OBJECT_ID('sc') is not null
drop table sc
create table sc
(
name char(10),
kc char(10),
score decimal(5,2)
) insert into sc
values('张三','语文',80),
('张三','数学',81),
('张三','英语',100),
('李四','语文',90),
('李四','数学',80),
('李四','英语',70),
('王五','语文',100),
('王五','数学',100),
('王五','英语',79)

校对一下:

2)本人稍微思索了一下,提供一下几种解决方案(只针对上表及其数据):

方案一:(分组,最小值)

 --方法一:按学生分组,求最小分数>=80
select name from sc
group by name
having min(score)>=80

结果及其执行计划:

方案二:(筛选,分组)

 --方法二:筛选成绩>=80,在进行分组
select name from sc where score>=80
group by name
having count(distinct kc)>=3

结果及其执行计划:

方案三:(内连接)

 --方法三:内连接
select distinct a.name from sc a,sc b,sc c
where a.name=b.name and a.name=c.name
and a.kc<>b.kc and a.kc<>c.kc and b.kc<>c.kc
and b.score>=80 and a.score>=80 and c.score>=80

结果及其执行计划:

方案四:(嵌套)

 --方法四:嵌套
select distinct name from sc where name not in
(select name from sc where score<80)

结果及其执行计划:

当然还有any,all的方案,此处略去。四种方案中,LZ认为最优方案是方案一,最为符合题意。其他方案均有特殊性,不具有普遍性。

为什么这么说?

首先针对上表及其表中仅有的数据,四种方案都能达到目的,即解决问题。如果对表中数据稍做变动,即原题不变,表格变为:

这时,方案一,方案四可行,方案二,方案三就不是可行方案了。

再次修改,原题不变,表格不变,附加条件:只能使用一次关键字select。

这时,方案一,二,三可行,方案四就不满足附加条件了。

PS:此题的演变还有很多种,不满足于会解题,会剖析问题,思维拓展,这样才会向成功靠近。一个问题的解决方案有多种,但是最优的却只有一种,重在思维能力,思索角度。

读者可以看看执行计划,分析,有什么想法呢?

3)总结:

此题虽陈旧,却值得琢磨,考察的是一个IT的思维能力,代码的核心在于算法。能从一个简单的问题挖掘出不一样的东西,这个才是IT的精髓。很遗憾,多年的老鸟居然一个也写不出来,或许你会说这并不能代表什么?但是可以想象他的代码质量及其性能如何?!解决问题固然是好,更体现IT精髓却不是它而是从解决方案中找到最优方案。

一句话,会解决问题只能说明你的基础,优化解决方案才会体现你的能力。

PS:如有不足之处,欢迎指点与切磋,您的光临是我的荣幸,联系方式QQ:

一道SQL的面试题之联想的更多相关文章

  1. 一道sql面试题(查询语句)

    一道sql面试题(查询语句)   id name age 1  a        11 2  b        11 3  c        12 4  d        13 5  e        ...

  2. SQL经典面试题及答案

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

  3. Sql Server 面试题

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名 name   kecheng   fenshu 张三     语文       81张三     数学       75李四     语文   ...

  4. 【转】SQL语句面试题

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

  5. SQL Server面试题

    前几天在博客园上看到一道SQL面试题,sc是表名.老师拿来与同学分享,让大家试做,要求是:查出每科成绩都>=80分的名字,看能写出几种方法.没有主外键,没有关联,脑袋一下子就蒙了.经老师讲解指导 ...

  6. 【Android】一道Android OpenGL笔试题

    一道Android OpenGL笔试题 SkySeraph May. 5th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sky ...

  7. 经典的SQL语句面试题

    Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...

  8. SQL数据库面试题

    SQL数据库面试题 1.SQL SREVER中,向一个表中插入了新数据,如何快捷的得到自增量字段的当前值 这种情况其实我们经常用到,比如我们新建了一个用户,建立完用户后我们希望马上得到这个新用户的ID ...

  9. 解析js中作用域、闭包——从一道经典的面试题开始

    如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...

随机推荐

  1. comet4j开发指南

    http://blog.csdn.net/majian_1987/article/details/8489738 好多朋友反映,因排版问题,文章部分边缘内容无法查看.尝试过排版,但仍无法显示正常,所以 ...

  2. java配置好jdk-bash: /usr/bin/java: No such file or directory

    在 Linux 系统中安装 JDK 环境,配置好环境变量后,输入 java.javac 或者 java -version 等时,都提示如下错误: -bash: /usr/local/java/bin/ ...

  3. 主攻ASP.NET MVC4.0之重生:发邮箱激活验证

    导入Interop.jmail组件 using jmail;using System.Net.Mail; 点击下载源代码 Controller相关代码 public class SendEmailCo ...

  4. scp 和 pscp

    今天在做项目遇到了两个问题,做一些总结. 1.在项目中,防火墙的的相关配置是关于cisco企业级防火墙的配置,并不是window防火墙. 2. 在Linux上,   scp     linux文件   ...

  5. OWASP十大攻击类型详解

    随着WEB应用技术的不断进步与发展,WEB应用程序承载了越来越多的业务,而随之而来的也是WEB应用所面临的越来越复杂的安全问题.而WEB日志作为WEB安全中的一个重要组成部分,不但可在事后起到追踪和溯 ...

  6. 父元素设置overflow,绝对定位的子元素会被隐藏或一起滚动

    一般情况: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <met ...

  7. Qt Ping

    QProcess对象可以直接执行cmd的命令,但是ping操作是会阻塞的,所以需要在子线程里ping QProcess *tempCmd = new QProcess(); tempCmd->s ...

  8. vRA7 Business error “Untrusted certificate chain”

    报错截图: 服务无法注册 第一步:登录vRB 5480页面,取消到vRA的注册 第二部:SSH登录到VRB中,查看bio-ssl.keystore.password. cat /shared/cata ...

  9. C++中容器的使用(一)

    C++中有两种类型的容器:顺序容器和关联容器. 顺序容器主要有vector.list.deque等.其中vector表示一段连续的内存,基于数组实现,list表示非连续的内存,基于链表实现,deque ...

  10. Linux 修改DNS解决 Could not retrieve mirrorlist" 报错

    CentOS yum有时出现“Could not retrieve mirrorlist ”的解决办法——resolv.conf的配置 或者IP配置文件上写入 缺少DNS引起的问题1. 无法识别域名 ...