一道SQL的面試題之聯想


      一道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)
View Code

       校對一下:

       

       2)本人稍微思索了一下,提供一下幾種解決方案(只針對上表及其數據):

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

1 --方法一:按學生分組,求最小分數>=80
2 select name from sc 3 group by name 4 having min(score)>=80
View Code

     結果及其執行計划:

     

     方案二:(篩選,分組)    

1 --方法二:篩選成績>=80,在進行分組
2 select name from sc where score>=80
3 group by name 4 having count(distinct kc)>=3
View Code

     結果及其執行計划:

    

    方案三:(內連接)    

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
View Code

    結果及其執行計划:

    

    方案四:(嵌套)

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

      結果及其執行計划:

 

 

    當然還有any,all的方案,此處略去。四種方案中,LZ認為最優方案是方案一,最為符合題意。其他方案均有特殊性,不具有普遍性。

    為什么這么說?

    首先針對上表及其表中僅有的數據,四種方案都能達到目的,即解決問題。如果對表中數據稍做變動,即原題不變,表格變為:

    這時,方案一,方案四可行,方案二,方案三就不是可行方案了。

    再次修改,原題不變,表格不變,附加條件:只能使用一次關鍵字select。

    這時,方案一,二,三可行,方案四就不滿足附加條件了。

    PS:此題的演變還有很多種,不滿足於會解題,會剖析問題,思維拓展,這樣才會向成功靠近。一個問題的解決方案有多種,但是最優的卻只有一種,重在思維能力,思索角度

    讀者可以看看執行計划,分析,有什么想法呢?

    3)總結:

       此題雖陳舊,卻值得琢磨,考察的是一個IT的思維能力,代碼的核心在於算法。能從一個簡單的問題挖掘出不一樣的東西,這個才是IT的精髓。很遺憾,多年的老鳥居然一個也寫不出來,或許你會說這並不能代表什么?但是可以想象他的代碼質量及其性能如何?!解決問題固然是好,更體現IT精髓卻不是它而是從解決方案中找到最優方案。

      一句話,會解決問題只能說明你的基礎,優化解決方案才會體現你的能力。

     PS:如有不足之處,歡迎指點與切磋,您的光臨是我的榮幸,聯系方式QQ:649414754        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM