常見SQL面試題知識點+使用技巧

2021-02-19 SQL資料庫開發

點擊關註上方「SQL資料庫開發」,

設為「置頂或星標」,第一時間送達乾貨

SQL是用於數據分析和數據處理的最重要的程式語言之一,因此與數據科學相關的工作(例如數據分析師、數據科學家和數據工程師)在面試時總會問到關於 SQL 的問題。

SQL面試問題旨在評估應聘者的技術和解決問題的能力。因此對於應聘者來說,關鍵在於不僅要根據樣本數據編寫出正確的查詢,而且還要像對待現實數據集一樣考慮各種場景和邊緣情況

在這篇文章中,我將介紹 SQL 面試問題中常見的模式,並提供一些在 SQL 查詢中巧妙處理它們的技巧。

要搞定一場 SQL 面試,最重要的是儘量多問問題,獲取關於給定任務和數據樣本的所有細節。充分理解需求後,接下來你就可以節省很多迭代問題的時間,並且能很好地處理邊緣情況。

我注意到許多候選人經常還沒完全理解SQL問題或數據集,就直接開始編寫解決方案了。之後,等我指出他們解決方案中存在的問題後,他們只好反覆修改查詢。最後,他們在迭代中浪費了很多面試時間,甚至可能到最後都沒有找到正確的解決方案。

我建議大家在參加SQL面試時,就當成是自己在和業務夥伴共事。所以在你提供解決方案之前,應該要針對數據請求了解清楚所有的需求。

樣本employee_salary表

這裡你應該要求面試官說清楚「前三名」具體是什麼意思。我應該在結果中包括 3 名員工嗎?你要我怎樣處理關係?此外,請仔細檢查樣本員工數據。salary 欄位的數據類型是什麼?在計算之前是否需要清除數據?

在SQL中,JOIN 通常用來合併來自多個表的信息。

有四種不同類型的 JOIN,但在大多數情況下,我們只使用INNER、LEFT和FULLJOIN,因為 RIGHTJOIN並不是很直觀,還可以使用 LEFTJOIN 很簡單地重寫。在 SQL 面試中,需要根據給定問題的特定要求選擇你要使用的正確JOIN。

舉例:

查找每個學生參加的課程總數。(提供學生 id、姓名和選課的數量。)

樣本student和class_history表

你可能已經注意到了,並非所有出現在 class_history 表中的學生都出現在了 student 表中,這可能是因為這些學生已經畢業了。(這在事務資料庫中實際上是非常典型的情況,因為不再活躍的記錄往往會被刪除。)

根據面試官是否希望結果中包含畢業生,我們需要使用LEFT JOIN或 INNER JOIN來組合兩個表:

WITH class_count AS (
    SELECT student_id, COUNT(*) AS num_of_class
    FROM class_history
    GROUP BY student_id
)
SELECT 
    c.student_id,
    s.student_name,
    c.num_of_class
FROM class_count c
-- CASE 1: include only active students
JOIN student s ON c.student_id = s.student_id
-- CASE 2: include all students
-- LEFT JOIN student s ON c.student_id = s.student_id

GROUP BY是SQL中最重要的功能,因為它廣泛用於數據聚合。如果在一個 SQL 問題中看到諸如求和、平均值、最小值或最大值之類的關鍵字,這就表明你可能應該在查詢中使用GROUP BY了。

一個常見的陷阱是在GROUP BY過濾數據時混淆 WHERE和HAVING——我見過很多人犯了這個錯誤。

舉例:

計算每個學生在每個學年的必修課程平均 GPA,並找到每個學期中符合 Dean’s List(GPA≥3.5)資格的學生。

樣本gpa_history表

由於我們在GPA計算中僅考慮必修課程,因此需要使用WHERE is_required=TRUE來排除選修課程。

我們需要每位學生在每學年的平均GPA,因此我們將同時GROUP BY student_id和school_year 列,並取gpa列的平均值。最後,我們只保留學生平均 GPA高於3.5的行,可以使用HAVING來實現。合起來是下面這樣:


SELECT 
    student_id,
    school_year,
    AVG(gpa) AS avg_gpa
FROM gpa_history
WHERE is_required = TRUE 
GROUP BY student_id, school_year
HAVING AVG(gpa) >= 3.5


注意:每當在查詢中使用GROUP BY時,都只能選擇group-by列和聚合列,因為其他列中的行級信息已被捨棄。

大多數人會從SELECT開始,從上到下編寫SQL查詢。

但你知道SQL引擎執行函數時要到後面才執行SELECT嗎?以下是 SQL 查詢的執行順序:

FROM, JOIN

WHERE

GROUP BY

HAVING

SELECT

DISTINCT

ORDER BY

LIMIT, OFFSET

再次考慮前面的示例:

因為我們想在計算平均GPA之前過濾掉選修課程,所以我使用WHERE is_required=TRUE代替HAVING,因為WHERE會在GROUP BY和HAVING之前執行。我不能編寫HAVING avg_gpa >= 3.5的原因是,avg_gpa被定義為SELECT的一部分,因此無法在SELECT之前執行的步驟中引用它。

我建議在編寫查詢時遵循引擎的執行順序,這在編寫複雜查詢時會很有用。

Window函數也經常出現在SQL面試中。共有五種常見的Window函數:

在SQL面試中,重要的是要了解排名函數之間的差異,並知道何時使用LAG/LEAD

另一個示例employee_salary表

當一個SQL問題要求計算「TOP N」時,我們可以使用ORDER BY或排名函數來回答問題。

但在這個示例中,它要求計算「每個 Y 中的 TOP N X」,這強烈暗示我們應該使用排名函數,因為我們需要對每個分區組中的行進行排名。

以下查詢恰好能找到 3 名薪水最高的員工,而不論他們的關係如何,如下:


WITH T AS (
SELECT 
    *,
    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_salary DESC) AS rank_in_dep
FROM employee_salary)
SELECT * FROM T
WHERE rank_in_dep <= 3 
-- Note: When using ROW_NUMBER, each row will have a unique rank number and ranks for tied records are assigned randomly. For exmaple, Rimsha and Tiah may be rank 2 or 3 in different query runs.


此外,根據關係的處理方式,我們可以選擇其他排名函數。同樣,細節是很重要的!

ROW_NUMBER,RANK,DENSE_RANK結果比較

SQL面試中的另一個常見陷阱是忽略數據重複

儘管樣本數據中的某些列似乎具有不同的值,但面試官還是希望候選人考慮所有可能性,就像他們在處理真實數據集一樣。

例如:

在上一個示例employee_salary表中,可以讓僱員共享相同的名稱。

要避免由重複項導致的潛在問題,一種簡單方法是始終使用 ID 列唯一地標識不同的記錄。

舉例:

使用 employee_salary 表查找每個部門所有員工的總薪水。

正確的解決方案是 GROUP BY employee_id,然後使用 SUM(employee_salary) 計算總薪水。如果需要僱員姓名,請在末尾與 employee 表聯接以檢索僱員姓名信息。

錯誤的方法是使用 GROUP BY employee_name。

在SQL中,任何謂詞都可以產生三個值之一true,false和NULL,後者是unknown或missing數據值的保留關鍵字。處理NULL數據集時可能會意外地很棘手。

在SQL面試中,面試官可能會特別注意解決方案是否處理了NULL值。有時,很明顯有一列是不能nullabl的,但對於其他大多數列來說,很有可能會有NULL值。

建議:確認示例數據中的關鍵列是否為nullable,

如果可以,請利用IS(NOT)NULL,IFNULL和COALESCE 之類的函數來覆蓋這些邊緣情況。

最後一點也非常重要:在SQL面試期間要隨時與面試官溝通交流。

我面試過的許多候選人都很沉默寡言,有疑問的時候才會知聲。當然如果他們最終給出了完美的解決方案,那也不是什麼問題。

但是,在技術面試期間保持溝通交流往往會是有價值的。

例如:你可以談論對問題和數據的理解,說明你計劃如何解決問題,為什麼使用某些函數而不是其他選項,以及正在考慮哪些極端情況。

首先要提問,收集所需的細節

在INNER,LEFT和FULL JOIN之間謹慎選擇

使用GROUP BY聚合數據並正確使用WHERE和HAVING

了解三個排名函數之間的差異

知道何時使用LAG/LEAD窗口函數

如果在創建複雜的查詢時遇到困難,請嘗試遵循SQL執行順序

考慮潛在的數據問題,例如重複和NULL值

與面試官交流你的思路

https://www.infoq.cn/article/fqEAvFfISfKthSIf4FZf?utm_source=rss&utm_medium=article

我是嶽哥,最後給大家分享我寫的SQL兩件套:《SQL基礎知識第二版》《SQL高級知識第二版》的PDF電子版。裡面有各個語法的解釋、大量的實例講解和批註等等,非常通俗易懂,方便大家跟著一起來實操。

有需要的讀者可以下載學習,在下面的公眾號「數據前線」(非本號)後臺回復關鍵字:SQL,就行

相關焦點

  • sql子查詢面試題
    這是《從零學會sql》系列課程第4節課《複雜查詢》的練習題,也是常考常考的面試題。
  • SQL面試中常見題型和應對技巧
    應對技巧遇到忘記或不會的知識點該怎麼辦?SQL面試,基本分兩種形式,一種現場寫,一種發一套題讓你做。如果你SQL玩得很轉,基本上都沒太大問題。首先他出的題,基本上不會超出業務範圍。不光面試寫SQL,包括面試其他知識點,如果你臨時忘記,直接說不會,印象分一定會減弱。那該怎麼辦?
  • 常見的SQL優化面試題
    現在面試過程中,除了開發的基礎,面試官通常還會問SQL優化的方面,SQL優化也能體現出來平時對資料庫的理解和技術的高低。現在就總結了幾個,希望對大家有幫助。1.在表中建立索引,優先考慮where.group by使用到的欄位。
  • 手撕SQL | 必知必會5道SQL面試題
    愛數據曉輝 | 作者愛數據學院8月SQL月考題 | 來源附本次sql請根據各小題的需求,用代碼實現 本次考點 考察知識點:sql核心語句、聯結、子查詢、分析函數、控制函數等語句的掌握以及sql技能綜合運用的能力考察同學們的審題是否細緻、考查理解業務的能力
  • 大數據分析工程師面試集錦3-SQL/SparkSql/HiveQL
    本文將SQL/SparkSql/HiveQL放在一起來梳理一份常見題型的面試題庫。下面兩張圖是SQL基礎概念和基礎語法的考題大綱圖,接下來圍繞圖中提到的概念來列舉幾個常見面試題。圖1 基礎概念圖2 基礎語法考題模擬題1:你覺得SQL是一種什麼樣的語言,說說你對它的認識。
  • 2019年java常見面試題
    本人今年2月份來到上海來尋求工作,已經面試了10多家了,在這裡分享一下我的心得和常問到的面試題。3、關於自我介紹,最好簡明扼要,能體現自身的特點,表達流暢、自信,提前最好準備;4、準備好紮實的基礎知識,以及對經歷過的項目要有足夠的認識,每一個項目都是一次學習、提升的機會,一般JAVA集合類是考察的重點;5、一般好一點的面試官會順著知識點逐漸深入或者逐漸擴展,所以對於知識點的掌握最好全面深入
  • 這些SQL技能你都會嗎? 經典SQL面試題送給你(附答案)
    儘管面試官虐我千百遍,我還待他如初戀。
  • 幾道常見的SQL面試題,看你能答對幾道?
    SQL面試題,在不看底部參考答案的情況下,看自己能做對幾道。刪除除了自動編號不同, 其他都相同的學生冗餘信息 3.一個叫 team 的表,裡面只有一個欄位name, 一共有4 條紀錄,分別是a,b,c,d, 對應四個球對,現在四個球對進行比賽,用一條sql  語句顯示所有可能的比賽組合
  • mysql經典面試題(2019年整理)
    mysql經典面試題(2019年整理)MySQL資料庫開發規範MYSQL如何優化?結合你的經驗MySQL存儲引擎- MyISAM與InnoDB區別MySQL資料庫索引技巧與索引優化mysql經典面試題(2019年整理)mysql的sql語句優化方法面試題總結Mysql的引擎有哪些?支持事物麼?DB儲存引擎有哪些?
  • 毫不誇張說這是全網,目前最全的前端面試題庫,覆蓋98%知識點
    在這裡,有面試筆試常見技巧的提煉與總結;在這裡,有面試筆試高頻前端知識點的整理與剖析目錄面試筆試經驗技巧篇經驗技巧1 如何巧妙地回答面試官的問題2經驗技巧2 如何回答技術性的問題3經驗技巧3 如何回答非技術性問題4經驗技巧4 如何回答快速估算類問題5經驗技巧5 如何回答算法設計問題6經驗技巧6 如何回答系統設計題
  • hiveSQL常見面試題
    小編前幾天去面試了一個大數據分析的崗位,學習了幾個月信心滿滿的小編被無情的面試教育了,被教育的不是一些高深的算法理論,而是一些hiveSQL。這些題小編真不是不會,場景都非常熟悉,但就是容易忘。今天小編整理了一點常用場景的hiveSQL,很可能就能在面試中幫到你。場景一:分組求TopN先看數據:
  • 如何學習SQL語言
    為了幫助剛畢業找工作,或者想轉行成為數據分析師工作的朋友,我會用下面內容教會你怎樣用最快速、最容易理解的方式學會資料庫和SQL,並使用SQL進行數據分析:1.入門2.簡單查詢3.匯總分析4.複雜查詢5.多表查詢6.求職面試題7.檢驗SQL的學習效果第1部分:入門學習以下內容:1)了解資料庫的基本概念
  • Java 最常見的 200+ 面試題:面試必備
    聊回面試題這件事,這份面試清單原本是我們公司內部使用的,可到後來有很多朋友在微信上聯繫到我,讓我幫他們找一些面試方面的資料,而且這些關係也不太好拒絕,一呢,是因為這些找我,要面試題的人,不是我的好朋友的弟弟妹妹,就是我的弟弟妹妹們;二呢,我也不能馬馬虎虎的對付,受人之事忠人之命,我也不能辜負這份信任。
  • SQL | 數據分析面試必備SQL語句+語法
    我本人曾在滴滴、美團、平安科技的數據分析類崗位實習過,實習期間會大量運用sql進行取數。也參與了2018年的秋招,做過網易、拼多多、新浪等等公司的數據分析筆試題,還是比較了解SQL常考的題目類型的。寫這篇文章是希望幫助還沒有實戰過SQL的小夥伴、或者了解一些SQL語句,但是擔心自己了解的太片面的小夥伴。
  • SQL面試必刷題(1) Case When
    SQL語言是每個開發人員必備的一種技能,本文對面試過程中常見的SQL面試題進行分類、匯總,每類題型包括一些例題,希望大家能夠舉一反三。
  • 一道拼多多/阿里/字節都會考的sql面試題
    目前大數據發展勢頭強勁,各個公司大數據崗位需求不斷上漲,其中數據相關的崗位都逃不開hive/hadoop相關技術,面試中更是屢屢提及。今天我們來看一下一道在大廠頻繁出現的面試/筆試題目。要求使用hive-sql,不允許使用自定義的UDAF或者MR實現。題目分析:本題目的數據非常簡單,容易理解,難點在怎麼判斷「連續登錄」。我們知道sql的優點是處理行列式,通過簡單的代碼快速處理行列式的常規操作。
  • 面試技巧:面試常見誤區及應對技巧
    【導讀】本篇內容中公事業單位提供面試技巧面試常見誤區及應對技巧。希望可以幫助各位考生順利備考事業單位考試!很多同學在剛剛接觸到面試的時候,常常會陷入這樣幾個誤區,在誤區之中循環,在面試道路上走了很多彎路。那麼現在我們一起來看看這樣的誤區有哪些?你中招了嗎?如何正確走出誤區?誤區一:面試就是要答多說。
  • 分析了300+近期Facebook數據科學家面試實例,我們總結了臉家5類最常見面試題
    註:在進一步研究後,要解決大多數這些SQL問題都需要使用到聚合函數,例如JOIN,UNION和GROUP BY。如果你有機會拿到面試,請注意這一點。對於有關SQL的類似的面試問題,請查看以下資源:41 Essential SQL Interview Questions and Answers連結:https://www.toptal.com/sql/interview-questions
  • 一道簡單的sql語句題
    結果才發現,數據分析崗位大多注重的是資料庫的能力,比如sql語句的考察,hive的考察,以及一些運營思維的考察,所以第一次面試就很悲劇啦,不過題目還是很有代表性的。其他的不寫了,這裡只分享一個關於sql的題目。1、問題引出現在有兩個數據表,一個數據表記錄司機的信息,比如司機id,司機姓名,司機註冊時間等等,一個數據表記錄一天的訂單情況,比如訂單ID,訂單司機id,訂單時間。
  • 如何拿下SQL面試?這些技巧和陷阱必須要知道……
    本文將對SQL面試問題的常見模式進行闡釋,分享在SQL查詢中靈活處理這些模式的技巧。快掏出小本本開始學習吧~提問要拿下一場SQL面試,最重要的在於儘可能多地提問,以確保自己掌握了給定任務和數據樣本的所有細節。理解這些需求有助於節省迭代問題的時間,也有助於更好地處理邊緣情況。