想學數據分析但不會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連用,比用運算符簡單一些