本人工作在一家小型的民營企業,主要從事業務系統的日常維護,二次開發,菜鳥一枚。周五經理准備面試兩個開發人員,據簡歷,都還比較不錯,讓經理產生了想法,於是准備了一套面試題目,給我們亮了一道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