一道SQL的面试题之联想
本人工作在一家小型的民营企业,主要从事业务系统的日常维护,二次开发,菜鸟一枚。周五经理准备面试两个开发人员,据简历,都还比较不错,让经理产生了想法,于是准备了一套面试题目,给我们亮了一道SQL题目,非他之手,据出此题者说,如果面试者只能写出一种方法,基本可以pass。请读者仔细看题:
题目:如下表,用一条select语句求出所有课程在80分(含80分)以上的学生姓名,请写出所有可行方案。(注意:表名为sc,字段为name,kc,score)
这道题目并不陌生吧,相信大家一看就能下手,但是人往往对简单的东西总是不屑一顾,就拿此题说吧,不难,相信做开发的都能做,百度一大把答案,你也许会说这是小儿科,这样的面试题没有任何意义,真的是这样的吗?想想我们做IT相关的工作的核心是什么?技术不行可以借助百度,谷歌,群友,论坛逐步学习并掌握,思维呢……我敢断言,只会码代码的人绝不是一名优秀的程序员,常言道,规矩是死的,人是活的。人的思维是至关重要的,无论哪一行,没有一个好思维,难成器。不要以为简单,其实不见得比你想象的简单,你对此题能提供几种方案?
下面进行剖析:
1)准备数据:

1 use test2012
2 go
3 if OBJECT_ID('sc') is not null
4 drop table sc
5 create table sc
6 (
7 name char(10),
8 kc char(10),
9 score decimal(5,2)
10 )
11
12 insert into sc
13 values('张三','语文',80),
14 ('张三','数学',81),
15 ('张三','英语',100),
16 ('李四','语文',90),
17 ('李四','数学',80),
18 ('李四','英语',70),
19 ('王五','语文',100),
20 ('王五','数学',100),
21 ('王五','英语',79)
校对一下:
2)本人稍微思索了一下,提供一下几种解决方案(只针对上表及其数据):
方案一:(分组,最小值)

1 --方法一:按学生分组,求最小分数>=80
2 select name from sc
3 group by name
4 having min(score)>=80
结果及其执行计划:
方案二:(筛选,分组)

1 --方法二:筛选成绩>=80,在进行分组
2 select name from sc where score>=80
3 group by name
4 having count(distinct kc)>=3
结果及其执行计划:
方案三:(内连接)

1 --方法三:内连接
2 select distinct a.name from sc a,sc b,sc c
3 where a.name=b.name and a.name=c.name
4 and a.kc<>b.kc and a.kc<>c.kc and b.kc<>c.kc
5 and b.score>=80 and a.score>=80 and c.score>=80
结果及其执行计划:
方案四:(嵌套)

1 --方法四:嵌套
2 select distinct name from sc where name not in
3 (select name from sc where score<80)
结果及其执行计划:
当然还有any,all的方案,此处略去。四种方案中,LZ认为最优方案是方案一,最为符合题意。其他方案均有特殊性,不具有普遍性。
为什么这么说?
首先针对上表及其表中仅有的数据,四种方案都能达到目的,即解决问题。如果对表中数据稍做变动,即原题不变,表格变为:
这时,方案一,方案四可行,方案二,方案三就不是可行方案了。
再次修改,原题不变,表格不变,附加条件:只能使用一次关键字select。
这时,方案一,二,三可行,方案四就不满足附加条件了。
PS:此题的演变还有很多种,不满足于会解题,会剖析问题,思维拓展,这样才会向成功靠近。一个问题的解决方案有多种,但是最优的却只有一种,重在思维能力,思索角度。
读者可以看看执行计划,分析,有什么想法呢?
3)总结:
此题虽陈旧,却值得琢磨,考察的是一个IT的思维能力,代码的核心在于算法。能从一个简单的问题挖掘出不一样的东西,这个才是IT的精髓。很遗憾,多年的老鸟居然一个也写不出来,或许你会说这并不能代表什么?但是可以想象他的代码质量及其性能如何?!解决问题固然是好,更体现IT精髓却不是它而是从解决方案中找到最优方案。
一句话,会解决问题只能说明你的基础,优化解决方案才会体现你的能力。
PS:如有不足之处,欢迎指点与切磋,您的光临是我的荣幸,联系方式QQ:649414754
作者: 天堂的鸽子
出处:https://www.cnblogs.com/zhangbc/p/3695556.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!