一道SQL的面試題之聯想

2021-06-21 20:31:00 字數 1974 閱讀 3748

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

題目:如下表,用一條select語句求出所有課程在80分(含80分)以上的學生姓名,請寫出你認為的可行方案(有幾種寫幾種,僅限本**及其資料

)。(注意:表名為sc,欄位為name,kc,score)

下面進行剖析:    

1)準備資料:

use test2012

goif 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)本人稍微思索了一下,提供一下幾種解決方案(只針對上表及其資料):

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

方案三:(內連線)  

方案四:(巢狀)

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

為什麼這麼說?

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

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

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

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

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

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

3)總結:

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

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

一道sql 的面試題

表結構 成績表 grade 包含字段 gradeid int,自增 sno int,學號 cno int,課程號 score float,分數 查詢每門課程的平均 最高 最低 分及課程號 select g score cno from dbtest dbo grade group by cno se...

一道sql面試題的解答

題目 寫出一條sql語句 取出表a中第31到第40記錄 sqlserver,以自動增長的id作為主鍵,注意 id可能不是連續的。解答 已測試 1 假設id是連續的 select top10 fromawhereidnot in selecttop30 idfroma 或select fromawhe...

一道sql面試題的解答

題目 寫出一條sql語句 取出表a中第31到第40記錄 sqlserver,以自動增長的id作為主鍵,注意 id可能不是連續的。解答 已測試 1 假設id是連續的 select top10 fromawhereidnot in selecttop30 idfroma 或select fromawhe...