最近半年,作為部門(mén)的面試官之一,參加了許多次招聘面試。數(shù)據(jù)庫(kù)知識(shí),尤其是對(duì)數(shù)據(jù)的增刪改查等操作是軟件測(cè)試人員的基本功,是面試過(guò)程中的必考項(xiàng)。在這其中,有一道題,是我每次面試的必考題。
題目
以Mysql為例,假設(shè)有一張數(shù)據(jù)庫(kù)表user_info,第一列是id,用作唯一標(biāo)識(shí);第二列是user_name,即用戶(hù)姓名;第三列是some_data,這是一列存儲(chǔ)某某數(shù)值的列,比如用戶(hù)的年收入、用戶(hù)的年齡、用戶(hù)完成的訂單數(shù)等等。需求是,找出這張表中,按第三列的數(shù)值降序排列,排在前5的所有用戶(hù)記錄。
題解
顯然,這道題中除了有基本的select語(yǔ)句、還有降序排序的基本用法,以及l(fā)imit用法,因此,稍微有些基礎(chǔ)的人便可以給出答案:
select * from user_info order by some_data desc limit 0,5;
即使這道題沒(méi)有涉及什么難點(diǎn),但精準(zhǔn)回答率也并不高(就我面試的情況,約為60%)。然而,寫(xiě)出如上答案還不算完,我會(huì)再次向候選人描述問(wèn)題并確認(rèn)是否回答完畢。
如果候選人表示回答完畢不需要修正,我會(huì)給出提示和引導(dǎo)——答案是否完整?是否遺漏了某些用戶(hù)記錄?這時(shí),極個(gè)別的候選人會(huì)意識(shí)到數(shù)值有重復(fù)的情況。這已經(jīng)不單單是Mysql的面試題了,還涉及到需求理解能力、邏輯思維能力等。
無(wú)論是否意識(shí)得到,我都會(huì)再進(jìn)一步明確地提問(wèn),在考慮重復(fù)數(shù)據(jù)的情況下,按第三列的數(shù)值降序排列,找出排在前5的所有用戶(hù)的記錄。
必然地,能夠?qū)懗鰜?lái)的就更少了,這里給出一個(gè)答案——先找出排在第5的第三列的值,再把大于等于該值的記錄降序輸出即可。
select * from user_info where some_data >=
(select distinct some_data from user_info order by some_data desc limit 4,1)
order by some_data desc;
- 括號(hào)中的子句的作用是找出按第三列倒序排序并去重后的第5個(gè)值。
- 括號(hào)外的
order by some_data desc是為了讓最終輸出的結(jié)果再次按第3列降序排序。
可見(jiàn),除了上面涉及到的知識(shí)點(diǎn),此時(shí)的答案還涉及了子查詢(xún),distinct關(guān)鍵字。
總結(jié)
這種穿插在面試過(guò)程中,問(wèn)題難度有遞進(jìn)的筆試題,不僅僅是一道非黑即白式的知識(shí)問(wèn)答,它更是一個(gè)情景對(duì)話。在這個(gè)過(guò)程中,可以考察到候選人對(duì)基本知識(shí)的掌握程度,還可以考察到他們對(duì)需求的理解能力、問(wèn)題的分析能力等。因此,這樣的題目比單一去考數(shù)據(jù)庫(kù)各個(gè)知識(shí)點(diǎn)的題目要有效地多。
相關(guān)知識(shí)點(diǎn)
- mysql
- select基本語(yǔ)法
- order by
- limit用法
- 子句語(yǔ)法
- distinct