想學數據分析但不會Python,過來看看SQL吧(上)~
- 2019 年 10 月 31 日
- 筆記
作者:賈勝傑,碩士,退役軍人,電氣工程專業,現成功轉行K12領域數據挖掘工程師,不僅在數據清理、分析和預測方向,而且在自制力和高效學習方面都有豐富經驗。 編輯:王老濕
《從0到1,數據分析師修鍊之路》專欄的已經發佈了兩篇文章,分別講述了什麼是商業數據分析師 以及 如何成為一名商業數據分析師。今天將會帶來數據分析師的「技法修鍊」相關的內容,這些技法包括SQL,Python和統計學,具體的學習修鍊安排如下:
- SQL
- SQL基礎:語法,檢索,排序,過濾,創建計算字段和使用別名;
- SQL進階:鏈接表,聚合,分組,條件判斷,子查詢以及時間序列的處理;
- Python
- Python基礎:語法,數據類型,運算符,控制流,函數,腳本編寫及本地環境搭建;
- Python數據處理:Numpy與Pandas;
- Python可視化:Matplotlib,Pyecharts;
- 統計學
- 統計學基礎:描述統計學,概率,正態分佈,隨機抽樣,中心極限定律等;
- 統計學進階:推論統計學,置信區間,假設檢驗,線性回歸,邏輯回歸等。
所有以上的這些技法都只是工具,所以要以會用且熟練為目的,把學習重點放在應用層面,多動手便能事半功倍!我們今天先從數據分析必備技能中最為簡單的SQL來開始學習吧!(這篇文章介紹的主要是SQL基礎,文章末尾也會給出在線的練習SQL的網站)
知識清單
SQL簡介
SQL是Structured Query Language的簡寫,也就是結構化查詢語言。它最受歡迎的功能便是對數據庫中的數據進行增刪改查。作為數據分析師,會經常使用SQL語言從數據庫中查詢並提取數據,而增刪改則一般由數據工程師去操作。
你可能聽說過 NoSQL,它表示 Not only SQL(不僅僅是 SQL),與NoSQL的數據庫進行交互時,你編寫的代碼會與本課程中所學的SQL有所不同。最常用的 NoSQL 語言之一是 MongoDB(https://www.mongodb.com/),可以自行了解一下~
書寫規則及注釋
就像我們剛開始學寫字一樣,在學習編寫代碼之前,我們也要先了解這門語言規範的書寫規則和注釋方法。
這部分雖然比較簡單,但非常重要,有時候這不僅關係到你的飯碗,甚至還會危及到你的性命?,不信你可以看這篇假新聞:因代碼規範問題,美國一碼農槍殺了4個同事 (https://yq.aliyun.com/articles/644710)
SQL書寫規則
- SQL語句不區分大小寫,因此SELECT與select甚至是SeLect的效果是相同的,但是要對命令和變量進行區分,所以默認命令需要大寫,其他內容如變量等則需要小寫;
- 表和變量名中不要出現空格,可使用下劃線
_
替代; - 查詢語句中,使用單一空格隔開命令和變量;
- 為提高代碼的可移植性,請在查詢語句結尾添加一個分號
;
。
SQL中的注釋
代碼是給電腦看的,而注釋則是給人看的,是對你寫這行代碼的思路解釋,方便自己做debug或者給同事交接。
- 單行注釋 使用兩個連字符
-
,添加註釋。
SELECT col_name -- 這是一條注釋 FROM table_name;
- 多行注釋
多行注釋以/*
起始,以*/
結尾。
/*SELECT col_name FROM table_name;*/ SELECT col_2 FROM table_name;
檢索數據
檢索數據主要用的語句為:SELECT和FROM,意為從(FROM)xxx表中選擇(SELECT)xxx變量,下面看示例。
- 檢索單列
從table_name表中檢索col_name列。
SELECT col_name FROM table_name;
- 檢索多列
從table_name表中檢索col_1,col_2和col_3列。
SELECT col_1,col_2,col_3 FROM table_name;
- 檢索所有列
使用通配符*
,返回table_name表中的所有列;
SELECT * FROM table_name;
- 檢索某列中不同的值
檢索col_1中具有唯一性的行,即唯一值。
SELECT DISTINCT col_1 FROM table_name;
- 限制檢索的結果
使用LIMIT語句可以限制返回的行數。
SELECT col_1 FROM table_name LIMIT 10;
返回前10行(即第0-第9行)。
也可以添加OFFSET語句,設置返回數據的起始行:
SELECT col_1 FROM table_name LIMIT 10 OFFSET 5;
從第五行之後,返回十行數據(即第5-第14行)。
排序檢索數據
排序需要使用的子句是:ORDER BY。
- 其可以根據指定的單列或多列對結果進行排序;
- 默認按照升序進行排序(從小到大,從a到z),使用DESC關鍵字可以改為降序;
- 在使用ORDER BY時,請確保它是SELECT語句中的最後一條子句。
下面請看示例:
- 按列排序
SELECT col_name FROM table_name ORDER BY col_name;
返回的數據會按照col_name列進行升序排序,這裡col_name可以是單列也可以是多列,當然也可以使用非檢索的列進行排序。
- 降序排序
SELECT col_1,col_2 FROM table_name ORDER BY col_2 DESC,col_3;
返回的數據會按照col_2列降序,col_3列升序對col_1和col_2兩列進行排序。
這裡可以看出,DESC關鍵字的用法:只對跟在語句前面的變量有效。所以,想要對多列進行降序排序時,需要對每一列都指定DESC關鍵字。
過濾數據
我們使用WHERE子句來根據某個條件對篩選的數據進行過濾。
- WHERE子句應該寫在表名(即FROM子句)之後,在ORDER BY子句之前;
- 使用的基本方式為:
WHERE 列名+運算符+值
; - 過濾條件是區分大小寫的。
使用示例: 在表table_1列col_1中篩選出滿足條件col_1 運算符 value
的值。
SELECT col_1 FROM table_1 WHERE col_1 運算符 value;
- 運算符
運算符 |
描述 |
---|---|
= |
等於 |
<> |
不等於 |
> |
大於 |
< |
小於 |
>= |
大於等於 |
<= |
小於等於 |
BETWEEN…AND… |
在指定的兩值之間 |
IS NULL |
為NULL值 |
AND |
邏輯運算符:與 |
OR |
邏輯運算符:或 |
IN |
條件範圍篩選 |
NOT |
邏輯運算符:非 |
⚠️ SQL的版本不同,可能導致某些運算符不同(如不等於可以用!=表示),具體要查閱數據庫文檔。 在同時輸入AND和OR時,SQL會優先處理AND語句,所以為了建議大家在進行多條件篩選時,請用小括號將每個條件單獨擴起來,這樣既方便閱讀代碼,又不容易出問題。
- 用通配符進行過濾(LIKE)
通配符用來匹配值的一部分,跟在LIKE關鍵字後面進行數據過濾。
通配符 |
描述 |
---|---|
% |
表示任何字符出現任意次數 |
_ |
表示任何字符出現一次 |
[] |
指定一個字符集,它必須匹配該位置的一個字符 |
^ |
在[]中使用,表示否定 |
示例:
SELECT col_1 FROM table_1 WHERE col_1 LIKE '_[^JM]%' ORDER BY col_1;
如上篩選出的是,第二個字符為非J且非M的數據。
創建計算字段
其實就是在檢索數據的同時進行計算,並使用關鍵字AS將結果保存為某一列。
- 數值類型的計算
SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM orderitems WHERE order_num = 200008;
輸出:
prod_id quantity item_price expanded_price --------------------------------------------- RGAN01 5 4.9900 24.9500 BR03 5 11.9900 59.9500
這裡實現的就是使用quantity*item_price
創建一個名為expanded_price
的計算字段,也就是一個新列。
同樣適用於計算的操作符有+(加),-(減)和/(除)。
- 字符類型的拼接
SELECT RTRIM(col_name) + '('+RTRIM(col_country)+')' AS col_title FROM table_name ORDER BY col_name;
輸出:
col_title ------------------------ Bear Emporium(USA) Bears R Us(USA) Jouets et ours(France)
這裡實現的就是將col_name列與col_country列進行了拼接,新列的名字叫做col_title。
RTRIM()函數是去掉右邊的所有空格,LTRIM()是去掉左邊的所有空格,TRIM()是去掉兩邊的所有空格。
使用別名
在上一節中我們使用AS來為變量設置別名,你可能也見過如下所示的語句:
SELECT col1 + col2 AS total, col3
當然沒有 AS 的語句也可以實現使用別名:
FROM tablename t1
以及
SELECT col1 + col2 total, col3
將col1+col2的結果設置名為total的列。
代碼總結
語句 |
使用方法 |
其他詳細信息 |
---|---|---|
SELECT |
SELECT Col1, Col2, … |
選擇要篩選的列 |
FROM |
FROM Table |
提供列所在的表格 |
LIMIT |
LIMIT 10 |
限制返回的行數 |
ORDER BY |
ORDER BY Col |
根據列Col對查詢的結果排序(順序),可與 DESC 一起使用實現逆序。 |
WHERE |
WHERE Col > 5 |
用於過濾結果的一個條件語句 |
LIKE |
WHERE Col LIKE 『%me%』 |
僅提取出列文本中包含 『me』 的行 |
IN |
WHERE Col IN (『Y』, 『N』) |
僅過濾行對應的列為 『Y』 或 『N』的數據 |
NOT |
WHERE Col NOT IN (『Y』, 「N』) |
NOT表示非,與上行結果剛好互補。 |
AND |
WHERE (Col1 > 5) AND (Col2 < 3) |
AND表示與,過濾兩個或多個條件均為真的數據 |
OR |
WHERE Col1 > 5 OR Col2 < 3 |
OR表示或,過濾至少某一條件為真的行 |
BETWEEN |
WHERE Col BETWEEN 3 AND 5 |
與AND連用,比用運算符簡單一些 |