目前在職場中很難找到非常合格的資料庫開發人員。我的一個同事曾經說過:“SQL開發是一門語言,它很容易學,但是很難掌握。”
在面試應聘的SQL Server資料庫開發人員時,我運用了一套標準的基準技術問題。下面這些問題是我覺得能夠真正有助於淘汰不合格應聘者的問題。它們按照從易到難的順序排列。當您問到關於主鍵和外鍵的問題時,後面的問題都十分有難度,因為答案可能會更難解釋和說明,尤其是在面試的情形下。
您能向我簡要敘述一下SQL Server 2000中使用的一些資料庫物件嗎?
您希望聽到的答案包括這樣一些對象:表格、視圖、使用者定義的函數,以及預存程序;如果他們還能夠提到像觸發器這樣的對象就更好了。如果應聘者不能回答這個基本的問題,那麼這不是一個好兆頭。
什麼是索引?SQL Server 2000裡有什麼類型的索引?
任何有經驗的資料庫開發人員都應該能夠很輕易地回答這個問題。一些經驗不太多的開發人員能夠回答這個問題,但是有些地方會說不清楚。
簡單地說,索引是一個資料結構,用來快速存取資料庫表格或者視圖裡的資料。在SQL Server裡,它們有兩種形式:叢集索引和非叢集索引。叢集索引在索引的葉級儲存資料。這意味著不論叢集索引裡有表格的哪個(或哪些)欄位,這些欄位都會按順序被儲存在表格。由於存在這種排序,所以每個表格只會有一個叢集索引。非叢集索引在索引的葉級有一個行標識符。這個行標識符是一個指向磁碟上資料的指標。它允許每個表格有多個非叢集索引。
NULL是什麼意思?
NULL(空)這個值是資料庫世界裡一個非常難纏的東西,所以有不少應聘者會在這個問題上跌跟頭您也不要覺得意外。
NULL這個值表示UNKNOWN(未知):它不表示“”(Null 字元串)。假設您的SQL Server資料庫裡有ANSI_NULLS,當然在預設情況下會有,對NULL這個值的任何比較都會生產一個NULL值。您不能把任何值與一個 UNKNOWN值進行比較,並在邏輯上希望獲得一個答案。您必須使用IS NULL操作符。
什麼是主鍵?什麼是外鍵?
主鍵是表格裡的(一個或多個)欄位,只用來定義表格裡的行;主鍵裡的值總是唯一的。外鍵是一個用來建立兩個表格之間關係的約束。這種關係一般都涉及一個表格裡的主鍵欄位與另外一個表格(儘管可能是同一個表格)裡的一系列相連的欄位。那麼這些相連的欄位就是外鍵。
什麼是觸發器?SQL Server 2000有什麼不同類型的觸發器?
讓未來的資料庫開發人員知道可用的觸發器類型以及如何?它們是非常有益的。
觸發器是一種專用類型的預存程序,它被捆綁到SQL Server 2000的表格或者視圖上。在SQL Server 2000裡,有INSTEAD-OF和AFTER兩種觸發器。INSTEAD-OF觸發器是替代資料操控語言(Data Manipulation Language,DML)語句對錶格執行語句的預存程序。例如,如果我有一個用於TableA的INSTEAD-OF-UPDATE觸發器,同時對這個表格執行一個更新語句,那麼INSTEAD-OF-UPDATE觸發器裡的代碼會執行,而不是我執行的更新語句則不會執行操作。
AFTER觸發器要在DML語句在資料庫裡使用之後才執行。這些類型的觸發器對於監視發生在資料庫表格裡的資料變化十分好用。
您如何確一個帶有名為Fld1欄位的TableB表格裡只具有Fld1欄位裡的那些值,而這些值同時在名為TableA的表格的Fld1欄位裡?
這個與關係相關的問題有兩個可能的答案。第一個答案(而且是您希望聽到的答案)是使用外鍵限制。外鍵限制用來維護引用的完整性。它被用來確保表格裡的欄位只儲存有已經在不同的(或者相同的)表格裡的另一個欄位裡定義了的值。這個欄位就是候選索引鍵(通常是另外一個表格的主鍵)。
另外一種答案是觸發器。觸發器可以被用來保證以另外一種方式實現與限制相同的作用,但是它非常難設定與維護,而且效能一般都很糟糕。由於這個原因,微軟建議開發人員使用外鍵限制而不是觸發器來維護引用的完整性。
對一個投入使用的線上交易處理表格有過多索引需要有什麼樣的效能考慮?
您正在尋找進行與資料操控有關的應聘人員。對一個表格的索引越多,資料庫引擎用來更新、插入或者刪除資料所需要的時間就越多,因為在資料操控發生的時候索引也必須要維護。
您可以用什麼來確保表格裡的欄位只接受特定範圍裡的值?
這個問題可以用多種方式來回答,但是只有一個答案是“好”答案。您希望聽到的回答是Check限制,它在資料庫表格裡被定義,用來限制輸入該列的值。
觸發器也可以被用來限制資料庫表格裡的欄位能夠接受的值,但是這種辦法要求觸發器在表格裡被定義,這可能會在某些情況下影響到效能。因此,微軟建議使用Check限制而不是其他的方式來限制域的完整性。
返回參數和OUTPUT參數之間的區別是什麼?
如果應聘者能夠正確地回答這個問題,那麼他的機會就非常大了,因為這表明他們具有使用預存程序的經驗。
返回參數總是由預存程序返回,它用來表示預存程序是成功還是失敗。返回參數總是INT資料類型。
OUTPUT參數明確要求由開發人員來指定,它可以返回其他類型的資料,例如字元型和數值型的值。(可以用作輸出參數的資料類型是有一些限制的。)您可以在一個預存程序裡使用多個OUTPUT參數,而您只能夠使用一個返回參數。
什麼是相互關聯的子查詢?如何使用這些查詢?
經驗更加豐富的開發人員將能夠準確地描述這種類型的查詢。
相互關聯的子查詢是一種包含子查詢的特殊類型的查詢。查詢裡包含的子查詢會真正請求外部查詢的值,從而形成一個類似於迴圈的狀況。
關於面試過程的思考
這些問題只不過是確定一個SQL Server資料庫開發人員是否合格的起點。根據應聘者對上面這些問題的回答情況,我可能會要求他們參加我的TSQL編程考試,這一般是一套根據不同情況進行的10到12個資料庫查詢。
您需要自己決定將要僱用的開發人員具有什麼樣的專業技能。然後,需要通過自己的經驗、判斷以及在面試時對應聘者的感受(來做最終決定)。
您在面試資料庫開發人員時一般會問哪些問題呢?讓我們一起來討論一下吧。
Tim Chapman是肯塔基州路易維爾市一家銀行的SQL Server資料庫管理員,他有超過7年的行業經驗。他還通過了微軟SQL Server 2000和SQL Server 2005的認證。