想通過數(shù)據(jù)科學面試,這十個SQL概念你必須掌握
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)。
SQ是一種數(shù)據(jù)庫查詢和程序設計語言,用于存取數(shù)據(jù)以及查詢、更新和管理關系數(shù)據(jù)庫系統(tǒng),其功能非常強大,是數(shù)據(jù)科學面試中繞不過的考點。
很多人為了通過面試事無巨細地準備,犄角旮旯都不敢放過。但事實上,在現(xiàn)實面試中大多數(shù)公司只測試其少數(shù)核心概念。努力學習不如機智學習,以下這10個概念因其在實際中應用最多而最常出現(xiàn)。在準備面試時,你應該主要關注這些概念。
1. CASE WHEN
許多問題都可能需要使用CASE-WHEN語句,因為這個概念功能非常多。
在根據(jù)其他變量分配某個值或類時,我們需要用CASE-WHEN可以編寫復雜的條件語句。但還有一個功能鮮為人知,它可以用來透視數(shù)據(jù)。例如,如果你已有“月(month)”列,又希望為每個month創(chuàng)建一個單獨的列,則可以使用CASE WHEN語句來透視數(shù)據(jù)。
示例問題:編寫一個SQL查詢重新排列表樣式,以使每個月對應一個收入欄。
- Initial table:
- +------+---------+-------+
- | id | revenue | month |
- +------+---------+-------+
- | 1 | 8000 | Jan |
- | 2 | 9000 | Jan |
- | 3 | 10000 | Feb |
- | 1 | 7000 | Feb |
- | 1 | 6000 | Mar |
- +------+---------+-------+
- Result table:
- +------+-------------+-------------+-------------+-----+-----------+
- | id | Jan_Revenue | Feb_Revenue |Mar_Revenue | ... | Dec_Revenue |
- +------+-------------+-------------+-------------+-----+-----------+
- | 1 | 8000 | 7000 | 6000 |... | null |
- | 2 | 9000 | null | null | ... | null |
- | 3 | null | 10000 | null | ... | null |
- +------+-------------+-------------+-------------+-----+-----------+
2. SELECT DISTINCT
SELECT DISTINCT語句是一定要記牢的,將SELECT DISTINCT語句與聚合函數(shù)(即第三個概念)一起使用非常常見。例如,如果你有一個客戶訂單的數(shù)據(jù)表,則可能會被要求計算每個客戶的平均訂單數(shù)。在本例中,需要計算訂單的總數(shù)除以客戶的總數(shù)。像這樣:
- SELECT
- COUNT(order_id) / COUNT(DISTINCTcustomer_id) as orders_per_cust
- FROM
- customer_orders
3. 聚合函數(shù)
聚合函數(shù)跟上一點聯(lián)系緊密,你需要對這類函數(shù)的功能有深刻理解,比如min,max,sum,count等等……你應該好好理解GROUP BY和HAVING子句。我強烈建議你花點時間去解決實際問題,我們在一些創(chuàng)造性的方法中常常會用到聚合函數(shù)。
示例問題:編寫一個SQL查詢,在名為Person的表中找出所有重復的電子郵件。
- +----+---------+
- | Id | Email |
- +----+---------+
- | 1 | a@b.com |
- | 2 | c@d.com |
- | 3 | a@b.com |
- +----+---------+ANSWER:
- SELECT
- FROM
- Person
- GROUP BY
- HAVING
- count(Email) > 1
4. 左連接 vs 內連接
對于那些對SQL比較陌生,或有一段時間沒有使用過SQL的人來說,混淆左連接和內連接是件輕而易舉的事兒。請確保你能清楚理解每個連接如何獲得不同的結果,許多面試問題會要求你做一些連接。在某些情況下,選擇了一個而非另一個,即是成敗兩條路。
5. 自連接
SQL自連接指的是將表與其自身連接,它聽上去用處不大,但實際上用處十分廣泛。在許多實際應用中,數(shù)據(jù)存儲在一個大表中,而不是許多小表中,我們需要自連接來解決特定的問題。
示例問題:給定下面的Employee表,編寫一個SQL查詢,找出收入高于經理的員工。在表中,喬(Joe)是唯一收入高于經理的員工。
- +----+-------+--------+-----------+
- | Id | Name | Salary | ManagerId |
- +----+-------+--------+-----------+
- | 1 | Joe | 70000 | 3 |
- | 2 | Henry | 80000 | 4 |
- | 3 | Sam | 60000 | NULL |
- | 4 | Max | 90000 | NULL |
- +----+-------+--------+-----------+Answer:
- SELECT
- a.Name as Employee
- FROM
- Employee as a
- JOIN Employee as b on a.ManagerID= b.Id
- WHERE a.Salary > b.Salary
6. 子查詢
子查詢也稱為內部查詢或嵌套查詢,是查詢內查詢,會被嵌入到WHERE子句中,可以解決需要多次按序查詢以生成給定結果的特殊問題。子查詢和WITH AS語句在查詢中的使用次數(shù)都非常多,因而必須掌握。
示例問題:假設一個網站包含兩個數(shù)據(jù)表,Customers表和Orders表。編寫一個SQL查詢來找出所有從未訂購過的客戶。
- Table: Customers.+----+-------+
- | Id | Name |
- +----+-------+
- | 1 | Joe |
- | 2 | Henry |
- | 3 | Sam |
- | 4 | Max |
- +----+-------+Table: Orders.
- +----+------------+
- | Id | CustomerId |
- +----+------------+
- | 1 | 3 |
- | 2 | 1 |
- +----+------------+Answer:
- SELECT
- Name as Customers
- FROM
- Customers
- WHERE
- Id NOT IN (
- SELECT
- CustomerId
- FROM Orders
- )
7. 字符串格式化
字符串函數(shù)非常重要,尤其是在處理不清晰的數(shù)據(jù)時。公司很可能會考察你字符串的格式化和處理,以確保你懂得如何處理數(shù)據(jù)。
字符串格式化包括以下內容:
- LEFT, RIGHT
- TRIM
- POSITION
- SUBSTR
- CONCAT
- UPPER, LOWER
- COALESCE
8. 日期時間處理
你肯定會遇到一些涉及日期和時間數(shù)據(jù)的SQL問題,也許是需要按月份對數(shù)據(jù)分組,或者將變量格式從DD-MM-YYYY轉換為簡單的月份。
須知的函數(shù):
- EXTRACT
- DATEDIFF
示例問題:給定一個Weather表,編寫一個SQL查詢以找出所有高于之前(昨天)溫度的日期Id。
- +---------+------------------+------------------+
- | Id(INT) | RecordDate(DATE) | Temperature(INT) |
- +---------+------------------+------------------+
- | 1 | 2015-01-01 | 10 |
- | 2 | 2015-01-02 | 25 |
- | 3 | 2015-01-03 | 20 |
- | 4 | 2015-01-04 | 30 |
- +---------+------------------+------------------+Answer:
- SELECT
- a.Id
- FROM
- Weather a,
- Weather b
- WHERE
- a.Temperature > b.Temperature
- AND DATEDIFF(a.RecordDate,b.RecordDate) = 1
9. 窗口函數(shù)
窗口函數(shù)使你能對所有行執(zhí)行聚合值,而不是只返回一行(這是GROUP BY語句的用處),這對于行排序、計算累計等需求來說十分有用。
示例問題:編寫一個查詢以獲取薪水最高的empno,確保解決方案可以處理關系。
- depname | empno | salary |
- -----------+-------+--------+
- develop | 11 | 5200 |
- develop | 7 | 4200 |
- develop | 9 | 4500 |
- develop | 8 | 6000 |
- develop | 10 | 5200 |
- personnel | 5 | 3500 |
- personnel | 2 | 3900 |
- sales | 3 | 4800 |
- sales | 1 | 5000 |
- sales | 4 | 4800 |Answer:
- WITH sal_rank AS
- (SELECT
- empno,
- RANK() OVER(ORDER BY salary DESC) rnk
- FROM
- salaries)
- SELECT
- empno
- FROM
- sal_rank
- WHERE
- rnk = 1;
10. UNION
UNION不常出現(xiàn),但偶爾也會有人問到這點,以防萬一還是要了解一下。如果你有兩個含有相同列的表,又希望將它們組合在一起,這時UNION就可以派上用場啦。如果你不能百分百確定如何操作它,請及時善用搜索引擎解決它。
掌握這個10個概念,面試中的大部分問題你都將迎刃而解。祝你面試順利!