資料分析學習筆記part_1
Lesson 1 : SQL初探
SQL和移動平均值
-
實體關係圖(ERD) 是檢視資料庫中資料的常用方式。下面是我們將用於 Parch & Posey 資料庫的 ERD。包括:1. 表的名稱 2. 每個表中的列 3. 表配合工作的方式。如下圖所示,可以將每個表視為一個單獨的電子表格。然後將每個電子表格中的列放在表名下面。例如,region 表有兩列:
id
和name
,而 web_events 表有四列。
-
SQL的優點
-
SQL 很容易理解。
-
傳統的資料庫允許我們直接訪問資料。
-
傳統的資料庫可使我們稽核和複製資料。
-
SQL 是一個可一次分析多個表的很好工具。5. 相對於 Google Analytics 等儀表板工具,SQL 可使我們分析更復雜的問題。
-
-
為什麼企業喜歡使用資料庫:
-
只有輸入了需要輸入的資料,以及只有某些使用者能夠將資料輸入資料庫,才能保證資料的完整性。
-
可以快速訪問資料 - SQL 可使我們從資料庫中快速獲取結果。 可以優化程式碼,快速獲取結果。
-
可以很容易共享資料 - 多個人可以訪問儲存在資料庫中的資料,所有訪問資料庫的使用者獲得的資料都是一樣。
-
-
SQL 資料庫儲存資料方式
-
CREATE TABLE 是一個在資料庫中建立新表的語句。
-
DROP TABLE 是刪除資料庫中表的語句。
-
SELECT 讀取並顯示資料。我們將這稱為查詢。
-
-
常用的兩種查詢語句
-
SELECT用於提醒查詢要返回哪些列。
-
FROM用於提醒查詢在哪個表中查詢。注意,這個表中需要有列。
SELECT * FROM orders;
-
-
注意:每個查詢至少有一個 SELECT 和 FROM 語句。 SELECT 語句用於放置要顯示資料的列。FROM 語句用於放置要從中提取資料的表。
-
練習:嘗試編寫自己的查詢,以便為 orders 表中的所有訂單選擇
id
、account_id
和occurred_at
列。SELECT id, account_id, occurred_at FROM orders;
-
規定查詢格式
-
大寫,我們大寫了 SELECT 和 FROM,而將表和列名稱小寫。這是一個常見的格式慣例。大寫命令(SELECT、FROM),小寫查詢中的其他內容是常見做法。這使得查詢更容易讀取,這在編寫更復雜的查詢時更為重要。
-
表和變數名中不需要空格,通常在列名中使用下劃線,避免使用空格。 在 SQL 中使用空格有點麻煩。 在 Postgres 中,如果列或表名稱中有空格,就需要使用雙引號括住這些列/表名稱(例如:FROM "Table Name",而不是 FROM table_name)。在其他環境中,可能會使用方括號(例如:FROM [Table Name])。
-
在查詢中使用空格,QL 查詢忽略空格,因此可以根據需要在程式碼之間新增儘可能多的空格和空行,並且查詢結果是相同的。
SELECT account_id FROM orders #等價於 SELECT account_id FROM orders;
-
-
SQL不區分大小寫
SELECT account_id FROM orders; #和這個相同 DELECT account_id FROM orders #也和這個相同 SELECT AcCoUnt_id FROM oRdErS
但是如果沒有區分大小寫鍵入正確的字元,程式語言會變得不易閱讀。
-
分號
根據 SQL 環境,查詢結尾可能需要一個執行的分號。 這個"要求"在其他環境中比較靈活。我們認為在每個語句的末尾新增一個分號是最好的做法,如果環境能夠一次顯示多個結果,那麼這樣做還可以一次執行多個命令。最好的做法:
SELECT account_id FROM orders;
-
LIMIT
LIMIT 命令始終是查詢的最後一部分。下面的例子僅顯示訂單表的前 10 行和所有列:
SELECT * FROM orders LIMIT 10;
-
練習
-
編寫一個查詢,將響應限制在前 15 行,和包括 web_events 表中的
occurred_at
、account_id
和channel
欄位。SELECT occurred_at, account_id FROM web_events LIMIT 15;
-
-
ORDER BY
-
語句可使我們按任意行排序表。ORDER BY 語句始終在 SELECT 和 FROM 語句之後,但位於 LIMIT 語句之前。 學習其他命令時,這些語句的順序將更為重要。 如果使用 LIMIT 語句,它將始終顯示在最後。(提示 記住可以在 ORDER BY 語句中的列之後新增
DESC
,然後按降序排序,因為預設是按升序排序的。")練習
-
編寫查詢,返回 orders 表的前 10 個訂單。包含
id
、occurred_at
和total_amt_usd
。SELECT id, occurred_at, total_amt_usd FROM orders ORDER BY occurred_at LIMIT 10;
-
編寫一個查詢,基於
total_amt_usd
返回前 5 個最高的 訂單 (orders 表)。包括id
、account_id
和total_amt_usd
。SELECT id, account_id, total_amt_usd FROM orders ORDER BY total_amt_usd DESC LIMIT 5;
-
編寫一個查詢,基於
total
返回前 20 個最低 訂單 (orders 表)。包括id
、account_id
和total
。SELECT id, account_id, total FROM orders ORDER BY total LIMIT 20;
-
-
我們可以基於必須滿足的條件,使用 WHERE 語句來為表格建立子集。WHERE 語句中使用的常用符號包括:
-
>
(大於) -
<
(小於) -
>=
(大於或等於) -
<=
(小於或等於) -
=
(等於) -
!=
(不等於)練習
-
從 訂單 表提取出大於或等於 1000 的
gloss_amt_usd
美元數額的前五行資料(包含所有列)。SELECT * FROM orders WHERE gloss_amt_usd >= 1000 LIMIT 5;
-
從 訂單 表提取出小於 500 的
total_amt_usd
美元數額的前十行資料(包含所有列)。SELECT * FROM orders WHERE total_amt_usd < 500 LIMIT 10;
-
-
WHERE 與非數字資料一起使用
-
WHERE 語句也可以與非數字資料一起使用。在這節課中,我們可以使用
=
和!=
運算子。 還需要確保在文字資料中使用引號(單引號或雙引號都可以 - 如果原始文字中有引號,就一定要注意)。 -
通常將 WHERE 與非數字資料欄位一起使用時,我們會使用 LIKE、NOT 或 IN 運算子。
練習
-
過濾賬戶(
accounts
)表格,從該表格中篩選出 Exxon Mobil 的name
、website
和primary point of contact
(primary_poc
)。SELECT name, website, primary_poc FROM accounts WHERE name = 'Exxon Mobil';
-
-
算數運算子
-
派生列:我們將現有的列組合,生成的新列稱為 派生 列。
常見運算包括:
-
*
(乘法) -
+
(加法) -
-
(減法) -
/
(除法)
練習
-
使用 訂單 (orders)表:
建立一個用
standard_amt_usd
除以standard_qty
的列,查詢每個訂單中標準紙的單價。將結果限制到前 10 個訂單,幷包含id
和account_id
欄位。SELECT id, account_id, standard_amt_usd/standard_qty AS unit_price FROM orders LIMIT 10;
-
編寫一個查詢,查詢每個訂單海報紙的收入百分比。 只需使用以
_usd
結尾的列。 (在這個查詢中試一下不使用總列)。包含id
和account_id
欄位。SELECT id, account_id, poster_amt_usd/(standard_amt_usd + gloss_amt_usd + poster_amt_usd) AS post_per FROM orders;
-
-
邏輯運算子
-
邏輯運算子包括:
-
LIKE 可用於進行類似於使用 WHERE 和
=
的運算,但是這用於可能 不 知道自己想準確查詢哪些內容的情況。 -
IN 用於執行類似於使用 WHERE 和
=
的運算,但用於多個條件的情況。 -
NOT 這與 IN 和 LIKE 一起使用,用於選擇 NOT LIKE 或 NOT IN 某個條件的所有行。
-
AND & BETWEEN 可用於組合所有組合條件必須為真的運算。
-
OR 可用於組合至少一個組合條件必須為真的運算。
-
-
LIKE 運算子對於處理文字非常有用。我們將在 WHERE 子句中使用 LIKE。 LIKE 運算子經常與
%
一起使用。%
告訴我們,我們可能會想要任何數量的字元,產生一組特定的字元或者遵循一組特定的字元。記住,需要用單引號或雙引號將傳達給 LIKE 運算子的文字括住,因為這個字串中的大小寫字母不一樣。 搜尋 'T' 與搜尋 't' 不同。練習
使用 accounts (客戶) 表查詢
-
所有以 'C' 開頭公司名。
SELECT name FROM accounts WHERE name LIKE 'C%';
-
名稱中包含字串 'one' 的所有公司名。
SELECT name FROM accounts WHERE name LIKE '%one%';
-
所有以 's' 結尾的公司名。
SELECT name FROM accounts WHERE name LIKE '%s';
-
-
IN 運算子對於數字和文字列都很有用。這個運算子可使我們使用
=
,但對於特定列的多個專案。 可以檢查我們要提取資料的一個、兩個或多個列值,但這些都在同一個查詢中。 在後面的概念中,我們將介紹 OR 運算子,也可以使用這個運算子執行這些任務,但使用 In運算子編寫的查詢更清楚一些。練習
-
使用 客戶 表查詢 Walmart、Target 和 Nordstrom 的
name (客戶名稱)
,primary_poc (主要零售店)
, andsales_rep_id (銷售代表 id)
。SELECT name, primary_poc, sales_rep_id FROM accounts WHERE name IN ('Walmart', 'Target', 'Nordstrom');
-
使用 web_events 表查詢有關通過
organic
或adwords
聯絡的所有個人資訊。SELECT * FROM web_events WHERE channel IN ('organic', 'adwords');
-
-
NOT 運算子是一個非常有用的運算子,用於與之前介紹的兩個運算子 IN 和 LIKE 一起運算。通過指定 NOT LIKE 或 NOT IN,我們可以查詢到所有不符合特定條件的行。
練習
-
使用客戶表查詢除 Walmart、Target 和 Nordstrom 之外的所有商店的客戶名稱、主要零售店和銷售代表 id。
SELECT name, primary_poc, sales_rep_id FROM accounts WHERE name NOT IN ('Walmart', 'Target', 'Nordstrom');
-
使用 web_events 表查詢除通過任何方法聯絡的個人的所有資訊,除了使用
organic
或adwords
方法。SELECT * FROM web_events WHERE channel NOT IN ('organic', 'adwords');
-
使用客戶表查詢所有不以 'C' 開頭的公司名。
SELECT name FROM accounts WHERE name NOT LIKE 'C%';
-
所有名稱中不包含字串 'one' 的公司名。
SELECT name FROM accounts WHERE name NOT LIKE '%one%';
-
所有不以 's' 結尾的公司名。
SELECT name FROM accounts WHERE name NOT LIKE '%s';
-
-
有時使用 BETWEEN 比使用 AND 使語句更清楚一些。
-
AND 運算子用於 WHERE 語句中,用於一次考慮多個邏輯子句。 使用 AND 連線一個新的語句時,需要指定感興趣的列。可以同時連線儘可能多的考慮語句。 這個運算子可用於我們迄今為止所學習到的所有運算,包括算術運算子(
+
、*
、-
、/
),可以使用 AND運算子將 LIKE、IN 和 NOT 邏輯連線到一起。WHERE column >= 6 AND column <= 10 #運用between WHERE column BETWEEN 6 AND 10
練習
-
編寫一個查詢,返回所有訂單,其中
standard_qty
超過 1000,poster_qty
是 0,gloss_qty
也是 0。SELECT * FROM orders WHERE standard_qty > 1000 AND poster_qty = 0 AND gloss_qty = 0;
-
使用客戶表查詢所有不以 'C' 開始但以 's' 結尾的公司名。
SELECT name FROM accounts WHERE name NOT LIKE 'C%' AND name LIKE '%s';
-
使用 web_events 表查詢通過
organic
或adwords
聯絡,並在 2016 年的任何時間開通帳戶的個人全部資訊,並按照從最新到最舊的順序排列。SELECT * FROM web_events WHERE channel IN ('organic', 'adwords') AND occurred_at BETWEEN '2016-01-01' AND '2017-01-01' ORDER BY occurred_at DESC;
-
-
與 AND 運算子類似,OR 運算子可以組合多個語句。 使用 OR 連線新的語句時,需要指定感興趣的列。可以同時連線儘可能多的考慮語句。 這個運算子可用於我們迄今為止所學習到的所有運算,包括算術運算子(
+
、*
、-
、/
),可以使用 OR 運算子將 LIKE、IN、NOT、AND 和 BETWEEN邏輯連線到一起。將多個運算組合到一起時,可能經常需要使用括號來確保我們要執行的邏輯能得到正確執行。
練習
-
查詢 訂單 (orders) id 的列表,其中
gloss_qty
或poster_qty
大於 4000。只在結果表中包含id
欄位。SELECT id FROM orders WHERE gloss_qty > 4000 OR poster_qty > 4000;
-
編寫一個查詢,返回訂單 (orders) 的列表,其中標準數量 (
standard_qty
)為零,光澤度 (gloss_qty
) 或海報數量 (poster_qty
)超過 1000。SELECT * FROM orders WHERE standard_qty = 0 AND (gloss_qty > 1000 OR poster_qty > 1000);
-
查詢以 'C' 或 'W' 開頭的所有公司名 (company names),主要聯絡人 (
primary contact
) 包含 'ana' 或 'Ana',但不包含 'eana'。SELECT * FROM accounts WHERE (name LIKE 'C%' OR name LIKE 'W%') AND ((primary_poc LIKE '%ana%' OR primary_poc LIKE '%Ana%') AND primary_poc NOT LIKE '%eana%');
-
-
總結
-
語句 使用方法 其他詳細資訊 SELECT SELECT Col1, Col2, ... 提供需要的列 FROM FROM Table 提供列所在的表格 LIMIT LIMIT 10 限制返回的行數 ORDER BY ORDER BY 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 經常與 LIKE 和 IN 一起使用。 AND WHERE Col1 > 5 AND Col2 < 3 過濾兩個或多個條件必須為真的行 OR WHERE Col1 > 5 OR Col2 < 3 過濾一個條件必須為真的行 BETWEEN WHERE Col BETWEEN 3 AND 5 一般情況下,語法比使用 AND 簡單一些 -
SELECT col1, col2 FROM table1 WHERE col3 > 5 AND col4 LIKE '%os%' ORDER BY col5 LIMIT 10;
-
移動平均值
-
移動平均值用於將資料線性化,以便更容易觀察長期趨勢,也不會因日常波動而錯亂。例如,假設想視覺化服裝零售店的銷售趨勢。從每天的資料開始,而圖表看起來太不穩定,因為更多的人在週末購物,所以銷售額會在週末飆升。
- 可以按周計算銷售額,但這可能不能顯示想要的一些詳細資訊。
- 使用移動平均值可使每日波動平滑一些,也可以觀察長期趨勢。
-
Project : 探索未來氣候發展趨勢
- 注:學習筆記是在優達學城學習時,參考部分課程內容總結而成。
-
Project : 探索未來氣候發展趨勢-專案心得:
專案描述:用SQL編寫查詢,提取城市資料,並匯出至csv檔案,利用Excle對城市氣候變化趨勢進行視覺化,最終圍繞三個問題進行分析。
專案心得:通過本專案,瞭解了全球變暖下的氣候發展背景,熟悉SQL基本查詢語句,初步瞭解資料分析基本流程,在實際問題與資料分析相聯絡方面有了新的認識,對於資料分析更加感興趣。