馬住這7大SQL經典面試問題,春招躺贏!
全文共5480字,預計學習時長14分鐘
什麼是SQL?
SQL是一種用於與資料庫通信的編程語言,是技術行業招聘中需要掌握的最有用的技能之一。SQL是結構化查詢語言的縮寫,這個驚人的工具是分析大型數據集的必備工具。當它應用於關係資料庫(以某種方式相互關聯的唯一數據表)時,它的優點尤其明顯。
由於SQL在技術領域無處不在,許多公司在給出工作邀請之前都會進行SQL面試。這有助於確保求職者(尤其是從事項目管理、分析、商業智能和軟體工程相關工作的人員)能夠輕鬆地在工作中使用SQL。
如果你即將進行SQL面談,你或許想知道可能會遇到什麼樣的問題。招聘人員通常對細節含糊其辭,像這樣一無所知地開始一場談話會讓人不知所措。
因此,我們列出了7個最常見的SQL面試問題,以便你在面試前進行一些練習。通過一些預先準備,你會在面試日感覺到胸有成竹、自信滿滿。
1、什麼是關係資料庫,什麼是SQL?舉例說明
雖然你可能知道關係資料庫是什麼以及SQL是什麼,但很難在面試現場給出連貫、簡潔的解釋。為此,請確保你已提前準備好回答這個簡單的問題。以下是一些答題小技巧:
關係資料庫是一組數據表,以某種方式相互鏈接或關聯。它用於存儲不同類型的信息,這些信息可以彙集起來回答特定的分析問題。這是在不丟失任何關鍵信息的情況下,最大限度地減少存儲在伺服器上的數據量一種有效方法。
這是一個模糊的定義,所以讓我們看看實際中的關係資料庫。在線零售商的關係資料庫的簡單版本可能包含兩個單獨的數據表:
? 顧客。客戶信息列表,包括客戶姓名、聯繫信息和發貨首選項。此資料庫中的每個記錄都包含一個唯一的customer_id欄位,通過該欄位可以識別客戶。
? 訂單。在零售商網站上購買的訂單列表。每個訂單列表還包含一個customer_id欄位,用於將該訂單的詳細信息與下訂單的特定客戶相關聯。
當然,如果我們只在Orders 表中包含客戶信息,就不需要多表資料庫。但這並不是特別有效:如果一個客戶下了多個訂單,他或她的姓名、聯繫信息和發貨偏好將列在Orders 表的多行上,從而導致不必要的重複和無法管理的大型資料庫。相反,我們創建了一個關係資料庫來節省空間,並展示了不同數據塊是如何鏈接在一起的。
那麼,SQL只是用於與這個關係資料庫通信的語言。資料庫還不能理解像英語這樣的人類語言——英語在語法上太複雜了——所以我們使用一種它們能夠理解的標準化的語言來與它們交流。
2、SQL JOIN子句有哪些不同類型,它們是如何被使用的?
在SQL中,JOIN子句用於返回將兩個或多個其他表的內容合併在一起的表。 例如,如果我們有兩個表——一個包含Customers信息,另一個包含各個客戶訂購的Orders 信息——我們可以使用JOIN子句將它們組合在一起並創建一個新表:客戶的完整訂單列表,提供所有必要的信息以便發貨。
有多種類型的JOIN子句,它們的功能稍微有所不同:
? INNER JOIN返回在指定的兩個表中都匹配的行列表。它是默認的連接類型,因此如果只輸入JOIN而不指定任何其他條件,則將自動使用INNER JOIN。
? LEFT JOIN將返回語句中左表的所有結果,並在可能的情況下與右表中的行匹配。如果左表中的一行在右表中不包含相應的匹配項,仍將列出該行——右表中的列為空值。
? RIGHT JOIN 將返回語句中右表的所有結果,並儘可能與左表中的行匹配。如果右表中的行在左表中不包含相應的匹配項,仍將該行列出——左表的列為空值。
? FULL JOIN將返回語句中左表和右表的所有結果。如果存在左表中的行與右表不匹配或右表中的行與左表不匹配的情況,所有數據仍將被返回——但SQL將在所有未匹配的列中輸出空值。
? CROSS JOIN返回兩個表的笛卡爾積——換句話說,左表的每個單獨行與右表的每個單獨行匹配。
3、為什麼此查詢未返回預期結果?
orders表中總共有1000行:
其中23個訂單來自customer_id = 45的用戶:
然而,當我們選擇不是來自customer_id = 45的訂單數量時,我們只得到973個結果:
973 23 = 996。但是,customer_id =45加上customer_id不等於45的訂單數量不應該等於1000嗎?為什麼此查詢未返回預期結果?
答案是:此數據集很可能包含具有 customer_id為空的order值。在條件中使用SELECT子句時,具有空值的行與=或運算符不匹配。
上面我們所指的第二個查詢可以修改如下,以產生預期的結果:
4、為什麼其中一個查詢有效而另一個查詢無效
請看以下查詢,該查詢返回預期結果:
第二個數據集中不包含3,所以為什麼我們的查詢錯誤地輸出了"Three is here!"?
答案再一次與MYSQL處理NULL值的方式有關。讓我們仔細看看。在我們的第一個查詢中,我們詢問值3是否包含在集合中(1, 2, 3, NULL)。我們的語句在功能上等同於以下內容:
由於3絕對等於3,所以滿足了我們的OR條件之一,語句輸出"Three is here!"。另一方面,我們的第二個語句詢問值3是否未包含在集合中(1, 2, NULL)。此語句在功能上等同於以下內容:
在這種情況下,條件檢查3 NULL失敗,因為在ANSI標準SQL中,我們需要使用IS NULL語句而不是運算符。
5、你能構建一個基本的INNER JOIN嗎
customers和 orders表具有以下相應的結構:
你是否可以構造一個簡單的SELECT 語句,該語句使用INNER JOIN來組合來自customers和orders表的所有信息?
這裡的答案非常簡單。我們是這樣做到的:
6、使用 AS 語句
我們根據上面的orders表編寫了一個查詢,以選擇2016年的所有訂單。但是我們的查詢有錯。你能找出問題出在哪兒嗎?
答案是:order_year是一個別名,意味著它被用作更複雜引用的另一個名稱:YEAR(order_placed_date)。 事實證明,在SQL中,別名只能在 GROUP BY、 ORDER BY 和 HAVING子句中引用 - 它們不能在WHERE子句中使用。 運行上面的代碼將產生以下結果:
要解決這個問題,我們需要重申WHERE子句中order_year別名的定義,如下所示:
7、使用SUM 函數
請看以下資料庫結構:
你是否可以編寫一個可以查找所有order_ids 的 product.price 的查詢?(例如,每個訂單的product.price的總和)
這個問題有點棘手,因為我們必須同時使用SUM函數和 GROUP BY子句並通過order_id聚合訂單。我們是這樣做的:
留言 點贊 發個朋友圈
我們一起分享AI學習與發展的乾貨
編譯組:王玲、趙璇
※機器學習可以管理你的郵件……和諾言!
※代碼詳解:通過模擬API來理解TensorFlow
TAG:讀芯術 |