Friday, November 20, 2020

在Python中使用SQL語法的一些體驗(1)--建立數據結構的觀念

        學習python這麼強大的編程語言,還需要學習SQL嗎?如果你需要對結構式數據進行處理,如果你需要對數據處理合併、篩選、匯總,那麼學習SQL會讓你處理這些需求時,有相當顯著的成果。這些幫助可能來自於快速完成需求,也可能幫你分析需求,整理數據之間的關係,對你未來跨平台的學習也相當有幫助。

在Python中使用SQL語法的一些體驗(2)--連接數據庫

在Python中使用SQL語法的一些體驗(3)--讀入.sql

  • 建立數據結構的觀念

        學習SQL最重要的价值,並不是如何寫代碼或是完成需求,而是對數據結構有基本的認識。特別是健值的觀念(key),例如主鍵(primary key)、外鍵(foreign key)、唯一鍵(unique)。要讓兩張表產生關連時應該要用哪些欄位連接?計算加總、最大值、平均數時應該要用哪些欄位做分群依據?

        學習SQL除了你對數據結構有基礎的認識之外,也讓你能夠讓將完整思考整體需求,而不是單獨處理個別。以上面這個數據結構圖來說。在整個銷售業績表中(Fact Sales),與之相關的有日期維度表(Dim_Date)、產品維度表(Dim_Product)、分店維度表(Dim_Store)。如果我們想要找出第三季的手機周平均銷售量中,扣除單周周售量小於1000的店家後的最大的國家,你要如何思考這需求?學習SQL會讓你對這需求有很清楚的概念。以下面這個代碼為例,在編寫的過程中你會逐步思考各個條件之間的關係。如果你沒學過SQL而是先接觸python,單純使用python單行代碼的觀念來理解需求,你的思緒很容易一開始就會迷路了。


  • 低學習障礙
        對於SQL來說,資料的合併、篩選、條件判斷、彙總都是基本功能。SQL也是學習障礙最低的數據庫語言,你可能學一個早上就能開始動手。旁邊一個沒學過寫代碼的職場新鮮人也可能是先學SQL。基本上你只要會Excel,對於SQL的語法是很容易理解的。SQL常用的就join(left、right、inner)、where、on 、group、by、in、not、having、case、when,學完大概15個左右你就會了。你比較不會遇到忽然看到某個問題需要另一個函式來處理的情況。
        SQL是個跨平台的語言,基本上能處理結構式數據的語言都會支持SQL語法,python上能寫,hive、SAS、SQLite、Access都可以寫SQL語法。如果你是初入門的新手,學SQL最基礎也是最划算的。SQL也是最廣泛的數據庫語言,也就是你能求助的地方是最多的,各種神奇問題都能迅速釣到神人相助。

  • Pass Through
        所謂的Pass Through是指代碼是在你連接的平台運行。假設你在python透過API、JDBC或ODBC連結到一個數據庫,Pass Through讓你可以在python上編寫這個平台的代碼送到這個數據庫運行,運行完畢後才將結果送回來python。
        可能很多新同學看到關於python的一些神奇報導來學python,誤以為python各種能力都強。抱歉,種語言都有它的強項和弱項,計算效能是python最弱的能力之一。
        你可以試試看,在Excel上寫一個公式,但是數據有50萬筆,你的電腦可能就掛了。但是如果你在你的電腦上裝個MySQL或是SQLite在來處理這50筆數據,你會發現同樣的語法跑起來順滑多了。
        你需要處理的數據可能是幾萬筆、幾百萬筆、幾億筆,這時候你就要透過連接的數據庫先進行處理。一般而言,數據庫會採用MySQL或是hive或是其他架構,都是當初在設計架構時,都考慮了要處理的數據量,也就是你連接的數據庫本身的架構能夠處理你的計算量。
        另一個Pass Through很重要的特色是,數據庫只會回傳最終結果。假設你的原始數據有1億筆,但是經過篩選計算只會剩下1萬筆,如果你先將數據讀回來,你得先讀完1億筆的數據量再計算。如果你透過Pass Through,那麼你只需要傳輸最終1萬筆的數據量。很多時候你跑代碼的時間都花在傳資料上,而不是計算上。
        為什麼會說到Pass Through?剛剛才說到很多平台都是用SQL語法,那麼你就能用Pass Through處理巨量數據。

1 comment: