MySQL基本介紹
圖片說明:上課照片
- MySQL安裝簡報:下載位置。
一、MySQL介紹
資料庫是一個對結構化資訊或資料的組織性收集,通常以電子方式儲存在電腦系統。資料庫通常由資料庫管理系統(DBMS)控制。資料和DBMS,以及和它們相關的應用程式,統稱為資料庫系統,通常又簡稱資料庫。 目前運行中最常見的資料庫型態通常是在一系列的表格中進行行列間建模,使得處理和資料查詢更為有效。如此一來,資料就可以很容易取得、管理、修改、更新、控制和編組。大部分的資料庫使用結構化查詢語言來編寫或查詢資料。
- MySQL資料庫最新排名:目前第二 (Ref: DB-Engines Ranking)
-
基本上使用完全免費,沒有任何限制
-
推薦課程:
- MIS512 資料庫系統 黃三益 (資管碩)
- MIS205 資料庫管理 魏春旺 (資管系)
二、建立資料表
此章節我們將學習如何匯入資料至資料庫內。此處我們將以調整後股價及籌碼面資料做範例。
Step1. 下載TEJ特殊轉檔資料
我們先至TEJ資料庫特殊轉檔下載待會要做範例的數據集:
-
股票範圍:上(下)市普通股
-
日期區間:為2020/01/01至2020/10/23
-
調整後股價(日頻)特殊轉檔(輸出檔案命名為:adj_stock_price_data.txt)
-
籌碼面資料特殊轉檔(輸出檔案命名為:institutional_data.txt)
由於TEJ資料庫是用Big5編碼儲存資料,但我們建議資料庫還是以UTF8儲存會比較好,所以此處先對下載好的檔案做編碼轉換。編碼轉換的方式很簡單,只要直接打開資料後,在另存新檔時選取要儲存的編碼即可。
Step2. 建立資料庫與資料表
整理好資料後,接下打開MySQL Workbench開始建立資料庫與資料表。
- 建立資料庫流程:
-
建立資料表流程:
-
調整後股價資料表相關設定
-
三大法人籌碼面資料表相關設定
-
若想要更深入了解欄位變數型態,可參考此頁面SQL Data Types for MySQL, SQL Server, and MS Access
Step3. 匯入數據
匯入資料程式碼如下所示。需要特別注意的是,要匯入的檔案路徑不能有中文字串,且路徑需為左斜線。
若執行上述語句時,會發現MySQL報3948錯誤代碼:
這個原因是MySQL在8.0版本有提升安全性要求,對load data local
指令有限制。在5.7版本原本是個很方便好用的指令,結果8.0版本要用時被限制,而且還不知道要怎麼解除,這個問題一直被討論,有興趣可參考此頁面。當然最後官方團隊有提供解決方法。
總共需要做兩個處理,第一個在MySQL登入畫面時,進行連線設定:
接下來在Connection -> Advanced -> Others 的框中,新增OPT_LOCAL_INFILE=1
參數設定,新增好後按Close然後連線至資料庫。
第二個處理為在查詢區中輸入以下程式碼:
若local_infile的值為ON,代表設定成功。
經過上述兩個步驟,就可以開啟load data local的功能,可以順利匯入資料,且只要設定這一次就好,之後就不用再重跑。
我們重新執行以下指令:
查詢資料後,會發現欄位的名稱也被一併匯入資料庫:
所以要把欄位名稱刪除,執行以下指令:
查詢後可發現欄位名稱已被刪除:
另外還有需要要注意的一點,資料內容會有空白的狀況。在某筆資料列按右鍵選擇Copy Row後,貼在指令區會發現股票代碼及名稱有空白,這個空白必需要消除避免R程式在併表時發生錯誤。
我們針對股票代碼及股票名稱消除空白,消除的指令為:
執行完以上指令後,重新再做一次Copy Row,可發現目標欄位空白皆已被消除。
以上就是MySQL資料庫匯入數據的做法。
三、MySQL常用程式碼介紹
資料庫有資料後,我們就可以開始介紹MySQL資料整理的程式碼。
查詢: Select
排序: Order by
篩選條件: Where
限制設定:Limit
數學計算
小試身手1
- 請以股票代碼搜尋2303, 2344, 2603三檔股票在2020/10/19的資訊,並且按收盤價由大到小排序。
- 請找出2020/10單日成交量最高前十名的股票代碼、名稱、日期、成交量(資料表只要這3個欄位)。
- 請算出台積電在2020/10期間每個交易日的均價(開高低收平均),並按時間由最新到最舊排序
函數運算
流程控制: If與Case when
群組函式: Group by與Having
子查詢
併表
併表程式碼可參考此網頁說明,基本上我們最常用的就是Left Join。
小試身手2
- 請找出在2020/10月中,日均量>5000張且外資累積總買賣超>10,000張之股票代碼。
匯入資料
除了前面以load data local infile
匯入txt檔案至MySQL資料表為,我們也可以inset into
指令來加入資料至資料表。
清空資料表
在MySQL中,如果想把資料全部清除但保留資料欄位,可以使用truncate
指令。
輸入程式碼:
也可以直接從MySQL Workbench直接操作:
執行完之後,調整後股價表內的資料就會消失不見,但資料欄位還是會留著:
查詢資料表欄位資訊
如果想要查詢資料表目前的欄位資訊,可以輸入:
查詢資料表建表程式碼
若想要查詢目前資料表建立的程式碼,可以輸入:
刪除資料表
若要刪掉整個資料表,則輸入:
或者也可透過MySQL Workbench直接操作:
刪除後就看不到該資料表:
如果你懂drop table
語法,那看這張圖你就會笑:
駭客攻擊資料庫手法:SQL Injection
四、MySQL程式對接(R、Python)
R程式與MySQL對接程式範例
R與MySQL對接的套件為RMySQL。
以下是在R中連線至資料庫下載資料的範例:
Python程式與MySQL對接程式範例
在Python程式中,利用pandas和pymysql即可自資料庫中下載資料。
小試身手
請試著在R或Python中寫程式碼,傳入學號、姓名、留言及時間至指定的MySQL資料表。 Hint:
- 利用SQL的
inesrt into
指令 - R的目前日期時間寫法:
- Python目前日期時間寫法:
五、資料庫索引
資料庫索引的優點是可以增加條件篩選(where)的速度,但因為要建立索引,所以必須要額外使用硬碟空間,且在新增/修改/刪除資料時,也必須要動態維護索引導致速度會變慢。
我們通常都會以常被where篩選的欄位來建立索引,以調整後股價資料表為例,常會使用股票代碼及日期來做篩選,因此針對這兩個欄位就會建立索引,以增加條件篩選的速度。
以下為索引相關的程式碼指令:
接下來實際測試建立索引前後的查詢速度,此處以董監事持股狀況表為例,該資料表期間為2005/01至2020/09,共有10,168,107筆資料。假設我們想要搜尋台積電2330在201912的董監事持股資料,程式寫法為:
此查詢語句執行後速度為:10.703秒
我們為此表的code及date欄位添加索引並重新執行篩選查詢語句:
加入索引後執行查詢的速度為:0.078秒
由上述範例中,在加入索引後查詢的速度由10.703秒變為0.078秒,速度有明顯的增加。
六、建立資料庫服務
若架設好資料庫,想要讓其他人可以連線一起使用,則需要做以下設定:
Step1. 設定使用者登入帳密及權限
為資訊安全,此處除了設定帳密外,也會鎖定學校IP。
設定好帳號後,還需要給該帳號資料庫權限。此處我們只開放該使用者只能查詢stock_market資料庫。
Step2. 打開防火牆
為讓其他使用者能夠連入,還需要開啟伺服器端的防火牆。MySQL服務的默認Port為3306,需將此Port打開。通常會將服務的Port做修改(透過my.ini),不要用默認的Port避免被輕易的攻擊,但此處只是範例所以還是用原本默認的Port。
防火牆設定部分,主要是去控制台找Windows Defender防火牆 -> 選擇進階設定 -> 點選輸入規則 -> 新增規則。
Step3. 使用者連線設定
在客戶端連線部分,使用者在Workbench上點選新增連線按鈕,將連線資訊填入,包含資料庫IP、帳號、密碼及Port,設定好後即可連入使用。
七、課堂補充程式碼:
八、刪除MySQL程式
若要刪除MySQL程式,可以使用MySQL Installer,卸載會比較方便且乾淨。