SQL 的練習筆記 — 如何建立 Pokédex

Jeremy Pai
Life’s a Struggle
7 min readMar 12, 2021

--

Image by Thor Deichmann from Pixabay

本篇主要是記錄學習 SQL 的過程與心得,如需較完整的教學文請搜尋其他大大的分享。

SQL 的全名是 Structured Query Language,是處理資料庫的程式語言,可以做到存取資料以及查詢、更新與管理關聯式資料庫系統。

(引用自數據分析那件事)

如今已有付費的商用軟體,例如 Google 的 BigQuery。如果想要學習如何使用 BigQuery 進行基本的資料庫操作可以參照 Kaggle 的學習課程。

本篇會以 MySQL 來學習 SQL,主要是因為免費、安裝簡單且功能齊全。 安裝 MySQL 的過程可以參照底下這篇

底下會呈現自己製作的資料庫作為範例,先從資料庫的操作開始,由於 Pokemon Go 流行一時,因此選擇建立 pokemon_go 的資料庫作為紀念,儲存有關 pokemon 的資料,就如同 Pokédex。

Step 1:資料庫的操作函式

如果只是建立資料庫,只需輸入 “Create DATABASE 資料庫名稱;” 就可以了,在這一行之前輸入 “DROP DATABASE IF EXISTS 資料庫名稱;” 是避免重複建立相同名稱的資料庫。

順帶一提,在 SQL 語法中註解可以使用 “--” 或者是 “/* */”,還有使用 “;” 作為結尾。

Step 2:建立資料表的欄位

接下來建立 pokemon_go 底下的資料表欄位形式,基本要有 pokemon 的 ID、名稱、身高與體重才能稱為合格的 Pokédex。

與資料庫的建立與刪除相同,都是用 “CREATE” 與 “DROP” 進行操作。建立的格式是 “CREATE TABLE 資料表名稱 (欄位名稱 資料型態 欄位性質);”,資料型態可參考 W3Schools,而欄位性質包含了此欄位的數值是否可為 NULL、Default 數值、是否為 Key (也就是 ID)。以我的程式為例,pokeindex 這個欄位不可為 NULL、沒有預設值,而且設定為資料表 pokemon 的 ID。

但是 pokemon 會不會進化是個很重要的資訊,因此也必須加入 Pokédex 中。由於現階段覺得知道可不可以進化就好,不需要知道進化後的名稱,因此新增之後決定刪除...(反悔的概念 XD

如果需新增資料表的欄位,可以使用 “ALTER TABLE 資料表名稱 ADD 欄位名稱 資料型態;”,如果是刪除資料表的欄位,則為 “ALTER TABLE 資料表名稱 DROP 欄位名稱;”。

最後輸入 “DESCRIBE 資料表名稱;”就可以看到現在建立的資料表長什麼樣子。

目前建立好的資料表 pokemon

順帶一提,可以使用 “TRUNCATE TABLE 資料表名稱”,清除掉所有的資料,只保留資料表結構。

Step 3:將資料插入資料表

將 pokemon 相關資訊插入資料表的時間到啦!

資料插入資料表的語法是 “INSERT INTO 資料表名稱 (特定欄位1, 特定欄位2, ...) VALUES (欄位數值1, 欄位數值2, ...);”,如沒有設定特定欄位就是插入數值到所有欄位。最後先偷偷使用 “SELECT” 函式將結果印出來。

將資料插入

Step 4:修改資料表中的資料

仔細檢查一下發現 Articuno 輸入錯誤,急凍鳥不會進化啊!

可以使用 “UPDATE 資料表名稱 SET 欄位1=數值1, 欄位2=數值2, … WHERE 條件”,值得注意的是有些 SQL 預設是 “safe update mode”,意思就是如果條件不是依據一開始設定的 Key 欄位的話就會出現錯誤訊息。一種解決方式就是按照規則走,條件就以 Key 欄位作為判斷條件。另一種解決方式是把 “safe update mode” 關閉,只要輸入 “SET SQL_SAFE_UPDATES = 0;” 就可以。

刪除資料就是 “DELETE FROM 資料表名稱 WHERE 條件;”,條件的設定與 “UPDATE” 相同。

更新資料表

Step 5:從資料表中查詢資料

查詢可以說是資料庫中相當重要的功能,可以從之前儲存的資料中選擇特定的資料出來使用。底下是最簡單的選取方式…全選。

基本語法為 “SELECT 欄位1, 欄位2, … FROM 資料表名稱 WHERE 條件;”,條件可為 “AND”、“OR” 與 “BETWEEN”。如要搜尋不重複的值可加上 “DISTINCT”,變成 “SELECT DISTINCT 欄位1, 欄位2, ... FROM 資料表名稱 WHERE 條件;”。

符合條件而選出來的 pokemon

也可以直接透過底下程式碼,搜尋有沒有 pokename 是 NULL 的資料

使用 “LIMIT” 設定要選取哪幾列,語法為 “LIMIT a, b”。代表著從 a+1 列開始取 b 個列的資料後回傳。

經過 Limit 設定選取的資料

“LIKE” 可以用來設定字串中是否含有設定的字串,例如底下是搜尋是否有 資料的 pokename 含有 LA。

結果有!是我們的乘龍 Lapras

“ORDER BY” 是用來將資料作排序,可以依照 “DESC” (由大到小) 與 “ASC” (由小到大, 預設) 決定排序方式。

排序過後的資料

“GROUP BY” 是將資料作分組,其中使用彙總函式 (Aggregate function) “COUNT(*)” 計算有幾列。

以能不能夠進化作為分組

“GROUP BY” 可以搭配 “HAVING”,篩選出符合條件的 Group。

第一天的練習就先到這裡啦~之後再看看會不會再學習一些新的 SQL 語法。底下附上全部的程式碼,有些地方有稍作修改。

--

--

Jeremy Pai
Life’s a Struggle

機器視覺演算法工程師~不限主題隨心寫下自己想寫的事物