由 Tomi Mester 寫于2017年5月9日
本文轉(zhuǎn)載自https://data36.com/sql-for-data-analysis-tutorial-beginners/
如果你想成數(shù)據(jù)分析師或是數(shù)據(jù)科學(xué)家,那么 SQL 是必須的。在過去的幾年中,我已經(jīng)與許多公司有線業(yè)務(wù)合作 - 從 5 人創(chuàng)業(yè)公司到 5000 多名員工跨國公司,并沒有看到一家不會(huì)以某種方式使用SQL進(jìn)行數(shù)據(jù)分析(以及更多的事情)的公司。
SQL簡(jiǎn)單并且容易理解。因而,不只是工程師、開發(fā)者、數(shù)據(jù)分析師或數(shù)據(jù)科學(xué)家可以使用它,而是任何愿意花費(fèi)幾天來學(xué)習(xí)和練習(xí)它的人。
我已經(jīng)創(chuàng)建了這個(gè) SQL 系列,成為有志的數(shù)據(jù)分析師和數(shù)據(jù)科學(xué)家的最實(shí)用和多動(dòng)手的 SQL 教程。如果你從沒有接觸過編碼、編程、查詢,它將從頭開始,這并不會(huì)是一個(gè)問題!
讓我們開始吧!

注意:因?yàn)檫@是一個(gè)實(shí)用教程,我鼓勵(lì)你和我一起編碼。如果你這樣做,你將需要一個(gè)數(shù)據(jù)服務(wù)器來練習(xí)。所以我建議你先通過閱讀這篇文章。
利用SQL進(jìn)行數(shù)據(jù)分析?這是什么?為什么好呢?
SQL代表『結(jié)構(gòu)化查詢語言』。
但是我喜歡描述它為「加強(qiáng)版的 Excel」。下面是同一份數(shù)據(jù)在 Excel 和 SQL:

如你所見,SQL 和 Excel 十分相似。它們用具有行和列的二維列表展示數(shù)據(jù)。兩者都非常結(jié)構(gòu)化,非常透明。
不過也有差異。作為初學(xué)者,你應(yīng)該知道兩件關(guān)于 SQL 的重要事情:
1.第一是性能。雖然 Excel 在小數(shù)據(jù)集中表現(xiàn)很棒,但是當(dāng)你使用不同的公式處理 100 k+ 行的文件,它變得十分緩慢和低效。在 SQL 中,甚至超過 10 M+ 行的文件可以很快的處理。(例如,在接下來的利用 SQL進(jìn)行數(shù)據(jù)分析文章中,我們將使用一個(gè) 7 M+ 行的數(shù)據(jù)集。)
2.第二是怎樣訪問你的數(shù)據(jù)。Excel 主要是圖形用戶界面(也成為 GUI)。你可以滾動(dòng)、敲入公式、用光標(biāo)選擇你的范圍等等,非常方便。在 SQL 中,你沒有這樣的界面,你必須使用稱為『SQL 查詢』來代替??聪旅娴膅if:

<center>在 Excel 中求和</center >

<center>在 SQL 中求和</center >
因?yàn)榈谝淮慰吹竭@個(gè),可能感覺到麻煩。但是相信我,一旦你了解 SQL 基礎(chǔ)知識(shí),你會(huì)發(fā)現(xiàn)它比 Excel 更加清晰、更有效率。只提兩個(gè)有點(diǎn):在 SQL 中,連接表比 Excel 更簡(jiǎn)單。同樣,使用 SQL 自動(dòng)化和重復(fù)使用腳本也將會(huì)變得更加方便。
當(dāng)你使用 SQL 進(jìn)行數(shù)據(jù)分析,你將會(huì)使用它(最有可能)進(jìn)行簡(jiǎn)單任務(wù):聚合事情、連接數(shù)據(jù)集、使用簡(jiǎn)單的統(tǒng)計(jì)和數(shù)學(xué)方法。但是,你可以比以前更有效率執(zhí)行這些任務(wù)和更大的數(shù)據(jù)集。
Python,R 和 bash怎么樣?
如果你已經(jīng)完成了我之前的 bash 教程 或者你已經(jīng)參加一些我的在線直播,你可能會(huì)問:SQL 比 Python,R 或者 bash 好還是壞?答案是...好吧,這個(gè)問題沒有明確答案!
一旦你開始在實(shí)際生活的數(shù)據(jù)項(xiàng)目中應(yīng)用這些語言,你將看到 Python 和 R 在某些方面是表現(xiàn)好的,而 SQL 在其他方面表現(xiàn)好。主要是語法、功能、性能不同...但是,我現(xiàn)在不想進(jìn)入該主題,因?yàn)椋?/p>
a)我承諾一個(gè)使用教程,其主題有點(diǎn)理論(甚至有點(diǎn)哲學(xué))。
????b)它還有點(diǎn)先進(jìn)的東西。
????c)在這個(gè)水平上,你完全不需要擔(dān)心它的性能,并且你有可能得到資深數(shù)據(jù)科學(xué)家或者數(shù)據(jù)工程師的幫助。
注意:如果你真的很好奇,我給你~1小時(shí)在這里比較 Python,R,SQL 和 bash。
但是現(xiàn)在,讓我們?cè)囋嚢桑?/p>
STEP 0 - 安裝你自己的 SQL 環(huán)境來練習(xí)!
注意:如果你已經(jīng)有自己的 SQL 環(huán)境,你可以跳到<u>STEP-獲得數(shù)據(jù)!</u>
首先,請(qǐng)仔細(xì)閱讀這篇文章。它是關(guān)于如何一步一步設(shè)置你自己的數(shù)據(jù)服務(wù)和安裝 bash,Python,R 和 SQL 的教程。
注意:在我的『利用 SQL 進(jìn)行數(shù)據(jù)分析』文章中,我將使用 postgreSQL!還有其他類型的 SQL 語言(例如,另一個(gè)眾所周知的開源語言 mySQL)。好消息是,所有的 SQL 語言都非常相似 -- 如果你學(xué)習(xí) postgreSQL,則需要幾個(gè)小時(shí)(甚至幾分鐘)才能適應(yīng)另一個(gè)。我選擇了 postgreSQL,因?yàn)樗苁軞g迎(許多在線企業(yè)都在使用它),同時(shí)它被稱為最先進(jìn)的開源 SQL 語言。
如果你通過上述鏈接的文章,請(qǐng)仔細(xì)檢查,如果你有以下3件事情:
1.具有終端(或 iTerm)訪問權(quán)限的數(shù)據(jù)服務(wù)器。
??2.PostgreSQL 安裝在你的數(shù)據(jù)服務(wù)器上。
??3.你的計(jì)算機(jī)上的Pgadmin4(或SQL Workbench)。
如果缺少某些內(nèi)容,請(qǐng)?jiān)俅伍喿x:安裝 bash,Python,R 和 SQL!
注意:作為一個(gè) SQL 查詢工具,相比于 pgadmin4,我更喜歡 SQL Workbench,但這是一種品味的問題。在我的利用 SQL 進(jìn)行數(shù)據(jù)分析教程中,我將使用 SQL Workbench(以下是有關(guān)如何在計(jì)算機(jī)上安裝它的教程),但你可以隨意使用 pgadmin4。這不會(huì)有什么區(qū)別!
STEP 1 – 通過命令行登錄你的 SQL 數(shù)據(jù)庫!
太好了!你將在一分鐘內(nèi)編寫你的第一個(gè) SQL 查詢!首先從命令行訪問你的 SQL 數(shù)據(jù)庫!你已經(jīng)做了一次,我們將重復(fù)這個(gè)過程:
1.打開終端(或 iTerm)。
??2.ssh到你的數(shù)據(jù)服務(wù)器
??在我的環(huán)境下,我輸入:
??ssh tomi@[my_ip_adress]
??

??3.一旦我登錄服務(wù)器,我想訪問我的 postgreSQL 數(shù)據(jù)庫。因?yàn)槲乙呀?jīng)訪問了我的用戶,我只需要鍵入這個(gè)命令:
??
psql -U tomi -d postgres- ? psql 是命令本身以及 -U 指定你的用戶名(我的為「tomi」),以及 -d 指定你的數(shù)據(jù)庫的名稱(我的是 postgres 同樣適用于你)。你的提示應(yīng)改為:postgres=>??

??完成!你可以完全訪問你的 SQL 數(shù)據(jù)庫!
??4.作為測(cè)試,鍵入:
??
\dt??這會(huì)列出你所有的數(shù)據(jù)表。到目前為止,你只有一個(gè)數(shù)據(jù)表,但是這將會(huì)馬上改變!
??

再次提醒!如果缺少某些東西或者不能運(yùn)行,請(qǐng)?jiān)俅伍喿x:安裝 bash,Python,R 和 SQL!
STEP 2 - 獲得數(shù)據(jù)!
在本教程中,我們將使用一個(gè)非常小的數(shù)據(jù)集,稱為 zoo。
您可以從這里以原始 .tsv 格式下載,你可以在 Excel 中操作它。如果您已經(jīng)完成了bash 教程,或者在bash /command line。
但是,繼續(xù)使用SQL:
1)創(chuàng)建一個(gè)表,我們可以向表中載入數(shù)據(jù)。在我的后續(xù)教程中,我將詳細(xì)解釋這里發(fā)生了什么,但現(xiàn)在,你只需將這幾行代碼復(fù)制粘貼到終端中:
CREATE TABLE zoo (
animal varchar(10),
uniq_id integer PRIMARY KEY,
water_need integer
);

2)仔細(xì)檢查表格是否已創(chuàng)建:
\dt 我們有新的數(shù)據(jù)表:zoo!

3)載入數(shù)據(jù)!
再次說明:我稍后會(huì)解釋,但是現(xiàn)在,只是復(fù)制粘貼這個(gè) SQL 查詢:
INSERT INTO zoo (animal,uniq_id,water_need) VALUES
('elephant',1001,500),
('elephant',1002,600),
('elephant',1003,550),
('tiger',1004,300),
('tiger',1005,320),
('tiger',1006,330),
('tiger',1007,290),
('tiger',1008,310),
('zebra',1009,200),
('zebra',1010,220),
('zebra',1011,240),
('zebra',1012,230),
('zebra',1013,220),
('zebra',1014,100),
('zebra',1015,80),
('lion',1016,420),
('lion',1017,600),
('lion',1018,500),
('lion',1019,390),
('kangaroo',1020,410),
('kangaroo',1021,430),
('kangaroo',1022,410);
如果一切正常,你會(huì)得到這條提醒:
INSERT 0 22

最重要的 SQL 語句:SELECT
是時(shí)候?qū)W習(xí)最基本的 SQL 語句。這是:
SELECT * FROM table_name;
每當(dāng)你在數(shù)據(jù)上使用讀取,過濾,轉(zhuǎn)換,聚合或執(zhí)行任何操作,你將會(huì)使用 SELECT。在這系列教程中,90%的內(nèi)容將會(huì)顯示出來,以某種方式修改單一查詢。作為開始,我們從 zoo 數(shù)據(jù)表中 SELECT 任意內(nèi)容。
SELECT * FROM zoo;

我已經(jīng)得到完整的可讀格式的表。(如果要從這個(gè)視角中退出,請(qǐng)?jiān)阪I盤上按Q鍵。)
SELECT * FROM zoo;
我想它甚至不需要一個(gè)解釋 -- 因?yàn)檎Z法本身非常接近英語 - 但是為了以防萬一:
SELECT 是主語句,它告訴 SQL 我們想從我們的數(shù)據(jù)表中讀取一些東西。
* 通常是指「一切」 -- 在這種情況下,這意味著我們想選擇每一列。
FROM 告訴 SQL,我們要從指定的表中讀取數(shù)據(jù)。
zoo 是表的名稱。如果你有更多的表,您可以將其替換為任何其他表名。
; 這是一個(gè) SQL 特定的語法。每個(gè)查詢都應(yīng)該用分號(hào)關(guān)閉。如果您不小心錯(cuò)過了,SQL 將期望您繼續(xù)查詢,不會(huì)在屏幕上返回任何內(nèi)容。

從現(xiàn)在起,你將會(huì)使用這種語法。
SELECT columns
你可以用實(shí)際的列名替換 * 字符。嘗試這個(gè)查詢:
SELECT animal, water_need FROM zoo;

(如果要從此視圖中退出,請(qǐng)?jiān)阪I盤上按Q鍵。)
確切地說,你所期望的是:你的屏幕上列出了「animal」和「water_need」列,而不是「uniq_id」。
這樣可以 SELECT 任何列。你只需要用逗號(hào)分隔指定的列名。
你也可以這樣做:
SELECT animal, animal, animal FROM zoo;

你會(huì)看到同一列多次...但是,因?yàn)檫@是沒有意義的,我建議只是根本不這樣做。
顯示數(shù)據(jù)的前幾行 -- LIMIT 從句
現(xiàn)在我們正在使用 22 行的數(shù)據(jù)表。在「利用 SQL 進(jìn)行數(shù)據(jù)分析」系列的下一集中,我們將使用一個(gè) 7 M+ 行數(shù)據(jù)文件。這是一個(gè)很大的變化,在這種情況下,每次都在屏幕上打印所有數(shù)據(jù)是不合理的,而是獲取前幾行的小樣本。為此,使用 LIMIT 從句 - 這是之前介紹的「基礎(chǔ)查詢」頂部的一個(gè)小「擴(kuò)展」:
SELECT * FROM zoo LIMIT 10;
這將僅打印前10行。(記住它是如何在 bash 中完成的?這是 head -10 命令。)

當(dāng)然,你可以決定要打印多少行,并在 LIMIT 之后指定!
過濾指定行 -- WHERE從句
基于數(shù)值,你可以用 WHERE 從句選擇特定的行。例如:
SELECT * FROM zoo WHERE animal = 'elephant';

SELECT * FROM zoo -?這是「基礎(chǔ)查詢」
WHERE -? 這告訴 SQL 你想過濾一些東西
animal = 'elephant' -? animal 是你正在尋找給定值的列名。而 elephant 是值本身。在 SQL 中,你必須添加列名,尋找值。
; -? 永遠(yuǎn)不要忘記分號(hào)!
在利用 SQL 進(jìn)行數(shù)據(jù)分析系列的下一集中,我將詳細(xì)介紹如何充分利用 WHERE!現(xiàn)在,如果你知道這是為了過濾行,便足夠了。
自我測(cè)試#1
這是一個(gè)介紹性的文章,所以這第一個(gè)任務(wù)也將是相當(dāng)容易的:
從 zoo 表中選擇前 3 個(gè) zebra!
該解或多或少是本文的總結(jié)!
.
.
.
準(zhǔn)備?
這是我的解決方案:
SELECT * FROM zoo WHERE animal = 'zebra' LIMIT 3;

SQL 很容易,對(duì)吧?
還有一件事:語法...
稍后,我將向你展示一些最佳實(shí)踐,以及如何保持 SQL 查詢的清潔和高效,但在第一篇文章中,我僅強(qiáng)調(diào)兩件事情:
- 所有的查詢都應(yīng)以分號(hào)(;)結(jié)尾。如果你不小心錯(cuò)過了,SQL 將期望您繼續(xù)查詢,不會(huì)在屏幕上返回任何內(nèi)容。例如:
postgres=> SELECT * FROM zoo
postgres->
這不是很好...這樣更好:
postgres=> SELECT * FROM zoo; - 當(dāng)談到SQL關(guān)鍵字(SELECT,WHERE,LIMIT等),SQL 并不區(qū)分大小寫。例如:
SELECT * FROM zoo;
工作原理如下:
select * from zoo;表名,列名和值的區(qū)分大小寫是你設(shè)置的問題。在我們當(dāng)前的設(shè)置(使用postgreSQL)中,表名和列名不區(qū)分大小寫,但是字段值是。例如。
SELECT * FROM zoo WHERE animal = 'elephant';–? WORKS
SELECT * FROM ZOO WHERE ANIMAL = 'elephant';–? WORKS
SELECT * FROM ZOO WHERE ANIMAL = 'ELEPHANT';–? DOES NOT WORK
請(qǐng)注意,按照慣例上大多數(shù)人使用大寫 SQL 關(guān)鍵字(SELECT,WHERE,LIMIT等)。它有助于閱讀你的代碼。
結(jié)論
相當(dāng)不錯(cuò)的學(xué)習(xí)和使用 SQL 進(jìn)行數(shù)據(jù)分析!恭喜!現(xiàn)在你可以寫你的第一個(gè)非常基本的 SQL 查詢...但這只是開始!讓我們繼續(xù)下一集,并學(xué)習(xí)如何使用 WHERE 從句從數(shù)據(jù)集中過濾東西。
如果你不想錯(cuò)過下一集,并且也想獲得有關(guān)即將到來的網(wǎng)絡(luò)研討會(huì)的信息,請(qǐng)訂閱我的每周通訊