想通過(guò)數(shù)據(jù)科學(xué)面試,這十個(gè)SQL概念你必須掌握
本文轉(zhuǎn)載自公眾號(hào)“讀芯術(shù)”(ID:AI_Discovery)。
SQ是一種數(shù)據(jù)庫(kù)查詢和程序設(shè)計(jì)語(yǔ)言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng),其功能非常強(qiáng)大,是數(shù)據(jù)科學(xué)面試中繞不過(guò)的考點(diǎn)。
很多人為了通過(guò)面試事無(wú)巨細(xì)地準(zhǔn)備,犄角旮旯都不敢放過(guò)。但事實(shí)上,在現(xiàn)實(shí)面試中大多數(shù)公司只測(cè)試其少數(shù)核心概念。努力學(xué)習(xí)不如機(jī)智學(xué)習(xí),以下這10個(gè)概念因其在實(shí)際中應(yīng)用最多而最常出現(xiàn)。在準(zhǔn)備面試時(shí),你應(yīng)該主要關(guān)注這些概念。
1. CASE WHEN
許多問(wèn)題都可能需要使用CASE-WHEN語(yǔ)句,因?yàn)檫@個(gè)概念功能非常多。
在根據(jù)其他變量分配某個(gè)值或類時(shí),我們需要用CASE-WHEN可以編寫(xiě)復(fù)雜的條件語(yǔ)句。但還有一個(gè)功能鮮為人知,它可以用來(lái)透視數(shù)據(jù)。例如,如果你已有“月(month)”列,又希望為每個(gè)month創(chuàng)建一個(gè)單獨(dú)的列,則可以使用CASE WHEN語(yǔ)句來(lái)透視數(shù)據(jù)。
示例問(wèn)題:編寫(xiě)一個(gè)SQL查詢重新排列表樣式,以使每個(gè)月對(duì)應(yīng)一個(gè)收入欄。
- 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語(yǔ)句是一定要記牢的,將SELECT DISTINCT語(yǔ)句與聚合函數(shù)(即第三個(gè)概念)一起使用非常常見(jiàn)。例如,如果你有一個(gè)客戶訂單的數(shù)據(jù)表,則可能會(huì)被要求計(jì)算每個(gè)客戶的平均訂單數(shù)。在本例中,需要計(jì)算訂單的總數(shù)除以客戶的總數(shù)。像這樣:
- SELECT
- COUNT(order_id) / COUNT(DISTINCTcustomer_id) as orders_per_cust
- FROM
- customer_orders
3. 聚合函數(shù)
聚合函數(shù)跟上一點(diǎn)聯(lián)系緊密,你需要對(duì)這類函數(shù)的功能有深刻理解,比如min,max,sum,count等等……你應(yīng)該好好理解GROUP BY和HAVING子句。我強(qiáng)烈建議你花點(diǎn)時(shí)間去解決實(shí)際問(wèn)題,我們?cè)谝恍﹦?chuàng)造性的方法中常常會(huì)用到聚合函數(shù)。
示例問(wèn)題:編寫(xiě)一個(gè)SQL查詢,在名為Person的表中找出所有重復(fù)的電子郵件。
- +----+---------+
- | 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 內(nèi)連接
對(duì)于那些對(duì)SQL比較陌生,或有一段時(shí)間沒(méi)有使用過(guò)SQL的人來(lái)說(shuō),混淆左連接和內(nèi)連接是件輕而易舉的事兒。請(qǐng)確保你能清楚理解每個(gè)連接如何獲得不同的結(jié)果,許多面試問(wèn)題會(huì)要求你做一些連接。在某些情況下,選擇了一個(gè)而非另一個(gè),即是成敗兩條路。
5. 自連接
SQL自連接指的是將表與其自身連接,它聽(tīng)上去用處不大,但實(shí)際上用處十分廣泛。在許多實(shí)際應(yīng)用中,數(shù)據(jù)存儲(chǔ)在一個(gè)大表中,而不是許多小表中,我們需要自連接來(lái)解決特定的問(wèn)題。
示例問(wèn)題:給定下面的Employee表,編寫(xiě)一個(gè)SQL查詢,找出收入高于經(jīng)理的員工。在表中,喬(Joe)是唯一收入高于經(jīng)理的員工。
- +----+-------+--------+-----------+
- | 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. 子查詢
子查詢也稱為內(nèi)部查詢或嵌套查詢,是查詢內(nèi)查詢,會(huì)被嵌入到WHERE子句中,可以解決需要多次按序查詢以生成給定結(jié)果的特殊問(wèn)題。子查詢和WITH AS語(yǔ)句在查詢中的使用次數(shù)都非常多,因而必須掌握。
示例問(wèn)題:假設(shè)一個(gè)網(wǎng)站包含兩個(gè)數(shù)據(jù)表,Customers表和Orders表。編寫(xiě)一個(gè)SQL查詢來(lái)找出所有從未訂購(gòu)過(guò)的客戶。
- 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í)。公司很可能會(huì)考察你字符串的格式化和處理,以確保你懂得如何處理數(shù)據(jù)。
字符串格式化包括以下內(nèi)容:
- LEFT, RIGHT
- TRIM
- POSITION
- SUBSTR
- CONCAT
- UPPER, LOWER
- COALESCE
8. 日期時(shí)間處理
你肯定會(huì)遇到一些涉及日期和時(shí)間數(shù)據(jù)的SQL問(wèn)題,也許是需要按月份對(duì)數(shù)據(jù)分組,或者將變量格式從DD-MM-YYYY轉(zhuǎn)換為簡(jiǎn)單的月份。
須知的函數(shù):
- EXTRACT
- DATEDIFF
示例問(wèn)題:給定一個(gè)Weather表,編寫(xiě)一個(gè)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ù)使你能對(duì)所有行執(zhí)行聚合值,而不是只返回一行(這是GROUP BY語(yǔ)句的用處),這對(duì)于行排序、計(jì)算累計(jì)等需求來(lái)說(shuō)十分有用。
示例問(wèn)題:編寫(xiě)一個(gè)查詢以獲取薪水最高的empno,確保解決方案可以處理關(guān)系。
- 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),但偶爾也會(huì)有人問(wèn)到這點(diǎn),以防萬(wàn)一還是要了解一下。如果你有兩個(gè)含有相同列的表,又希望將它們組合在一起,這時(shí)UNION就可以派上用場(chǎng)啦。如果你不能百分百確定如何操作它,請(qǐng)及時(shí)善用搜索引擎解決它。
掌握這個(gè)10個(gè)概念,面試中的大部分問(wèn)題你都將迎刃而解。祝你面試順利!
































