一道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. Raspberry Pi开发之旅-同步时间

    使用htpdate同步时间 由于树莓派板子上没有 RTC 硬件和电池,因此树莓派上的系统时间重启是保存不了的.网上已经有人想到应对 NTP 被防火墙封掉类似的需求了,开源的 htpdate 命令直接使 ...

  2. @MarkFan 口语练习录音 20140406 [美女与野兽的口语练习录音]

    大家好,您现在收听的是美女与野兽的口语练习录音 敢于追求,不惧任何挑战,才是勇敢的人生.试想一下,世界上每天有多少人为了梦想,为了生活,甚至是为了别人在不停地奔跑.假若你此刻心中装有梦想,却碍于现实不 ...

  3. awk的逻辑运算符

    运算符 描述 赋值运算符 = += -= *= /= %= ^= **= 赋值语句 逻辑运算符 || 逻辑或 && 逻辑与 正则运算符 ~ ~! 匹配正则表达式和不匹配正则表达式 关系 ...

  4. MATLAB更换字体后 中文显示乱码问题

    MATLAB的脚本代码默认宋体显示,对于大多数720P的显示器来说,无论是中文还是英文,显示效果都非常差.Windows环境下,Consolas是一种比较理想的英文代码字体. Consolas 字体是 ...

  5. Kubernetes Resource Qoutas

    配置参数: spec.containers[].resources.limits.cpu spec.containers[].resources.limits.memory spec.containe ...

  6. C++字符串操作库函数

    #include <bits/stdc++.h> using namespace std; int main() { ]="; ]="abcdefg"; ]= ...

  7. centos7下安装jdk7

     CentOS7.1 JDK安装 1.卸载自带OPENJDK    用 java -version 命令查看当前jdk版本信息   #java -version    用rpm -qa | grep ...

  8. mysql错误总结-ERROR 1067 (42000): Invalid default value for TIMESTAMP

    1. ERROR 1067 (42000): Invalid default value for 'FAILD_TIME'   (对TIMESTAMP  类型的子段如果不设置缺省值或没有标志not n ...

  9. JS获取函数的成员变量

    1. js函数 var table = function(){ var totalCount = 10; //给函数添加一个方法,返回成员变量的值,供调用 this.getTotalCount = f ...

  10. Android深度探索(卷1)HAL与驱动开发 虚拟环境的安装

    前言: 最近在看<Android深度探索(卷1)HAL与驱动开发>安装随书带的虚拟环境浪费了很多时间,说是虚拟环境的安装倒不如说是虚拟环境的导入,其实没什么技术含量,也没有什么复杂的,只是 ...