一道SQL的面試題之聯想

     本人工作在一家小型的民營企業,主要從事業務系統的日常維護,二次開發,菜鳥一枚。週五經理準備面試兩個開發人員,據簡歷,都比較不錯,讓經理產生了想法,於是準備了一套面試題目,給我們亮了一道SQL題目,非他之手,據出此題者說,如果面試者只能寫出一種方法,基本可以pass。請讀者仔細看題:(聲明:題幹有漏洞,本文討論的是解決方案,鑽牛角尖是無意義的

     題目:如下表,用一條select語句求出所有課程在80分(含80分)以上的學生姓名,請寫出你認爲的可行方案(有幾種寫幾種,僅限本表格及其數據)。(注意:表名爲sc,字段爲name,kc,score)

wKioL1NeNOeDL-IvAACNtGPxFig099.jpg

   這道題目並不陌生吧,相信大家一看就能下手,但是人往往對簡單的東西總是不屑一顧,就拿此題說吧,不難,相信做開發的都能做,百度一大把答案,你也許會說這是小兒科,這樣的面試題沒有任何意義,真的是這樣的嗎?想想我們做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)

  檢查一下,如下:

wKiom1NeNhbB8peTAACvRPo3OCk605.jpg

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

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

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

  執行計劃及其結果:

wKioL1NeNn_RwqhSAAI6UtXPVAA216.jpg


   方案二:(篩選,分組)  

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

  執行計劃及其結果:

wKiom1NeNxvA28xfAAJ7l4gWYq4584.jpg


方案三:(內連接)    

--方法三:內連接
 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

執行計劃及其結果:

wKioL1NeN2ywI9JbAANsXfhio1E937.jpg



方案四:(嵌套)

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

執行計劃及其結果:

wKiom1NeN_6AV788AAJ9-rB3JWw689.jpg

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

   爲什麼這麼說?

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

wKiom1NeOMeBSpVvAACAuja2ZdI813.jpg

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

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

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

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

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

這裏再補充一種:(朋友提供的,本人沒有想到,except幾乎沒有被用過)

方案五:(except用法)

(select distinct name from sc)
  except (select name from sc where score<80)

3)總結:

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

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

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章