這次很榮幸邀請到目前在台大、資策會以及中華電信學會擔任資料科學專業講師的郭耀仁來和大家分享資料庫與SQL的基礎知識及運用,而在這堂社課你將會學到:
資料庫架構
SQL基礎語法
SQL 是一個歷久彌新的語言,早於 1970 年代問世,50 年後今日仍然是資料科學與軟體開發從業者最重要的技能之一。
SQL全名為 Structured Query Language,是一種結構化查詢的語言,專門用來管理與查詢關聯式資料庫,其中可在依SQL的使用目的細分為資料查詢、操作、定義與控制。
資料查詢語言(Data Query Language, DQL) SELECT ...
資料操作語言(Data Manipulation Language, DML) UPDATE ... INSERT INTO...VALUES... DELETE...
資料定義語言(Data Definition Language, DDL) CREATE ... DROP...
資料控制語言(Data Control Language, DCL) COMMIT... GRANT...
在SQL中,常見的資料互動涵蓋四個動詞(CRUD):創造 Create、查詢 Read、更新 Update、刪除 Delete。舉例來說,在使用任何的網頁或手機應用程式時,我們的滑鼠點擊與手勢觸控都會被應用程式轉換成 CRUD:
創造 Create:發佈新的動態。
查詢 Read:瀏覽追蹤對象的動態。
更新 Update:編輯先前發佈動態的內容。
刪除 Delete:撤掉先前所發佈的動態。
資料庫(Database)是儲存在電腦中的資料集合,我們可以透過撰寫 SQL 有效率地對資料庫中的數據進行資料操作。一個合格的資料庫,其中的資料集合必須具有以下兩個特徵:
資料觀測值必須具有屬性(attributes)。屬性能夠賦予資料觀測值意義,如缺乏屬性,便很難知道每一欄位的資料代表的意思。
2.資料集合必須具備有元資料(Metadata)。元資料(Metadata)常見的解釋為「data about data」、「描述資料的資料」。
資料庫管理系統全名 database management system(DBMS) 是一種為管理資料庫而設計的大型電腦軟體管理系統。可以理解為,資料庫是一艘船,SQL語言是開船的技術與執照,用來操作資料庫,而資料庫管理系統就是船塢、碼頭、湖泊、河流或海洋,是存放與管理眾多資料庫的地方。
資料庫系統又可以分為兩大類:關聯式資料庫管理系統(RDBMS, Relational Database Management System)與非關聯式資料庫管理系統(NoSQL DBMS, Not only SQL Database Management System),而其中又以關聯式資料庫管理系統較為普遍。
常見的關聯式資料庫管理系統包括:甲骨文(Oracle)的 Oracle Database、微軟(Microsoft)的 SQL Server、國際商業機器(IBM)的 DB2、開放原始碼的 SQLite、開放原始碼的 MySQL、開放原始碼的 PostgreSQL。而本課程會使用 SQLite 作為教學教材。
環境安裝
下載 SQLiteStudio
Windows 作業系統下載副檔名為 .exe 的安裝檔:https://bit.ly/gh-sqlite-studio-exe
macOS 下載副檔名為 .dmg 的安裝檔:https://bit.ly/gh-sqlite-studio-dmg
連結資料庫
開啟 SQLite → 點選 Database → 點選 Add a Database → 在 file 欄位選取或輸入資料集位置 → 匯入資料集(本課以 IMDb 最高評等的 250 部電影作為教材)
完成上述步驟後點選 Tools 中的 Open SQL editor ,並輸入以下指令以確認學習環境能妥善運行。
儲存在資料庫中的資料表是有兩個維度的資料結構:
第一個維度稱為觀測值(Observations),有時亦稱為列(Rows)。
第二個維度稱為變數(Variables),有時亦稱為欄(Columns)。
而在描述一個資料表的外觀時,通常會以 (m, n) 來描述一個具有 m 列觀測值、n 欄變數的資料表(或者資料查詢結果)。以下圖為例,該SQL查詢結果的外觀為 (5, 6) 。
以 SELECT 與 FROM 從資料表選擇
SELECT、FROM 與 LIMIT
SELECT 是「選擇」欄位。
FROM 是指定「從」哪個資料表查詢資料。
LIMIT 是讓資料查詢結果顯示指定的前幾列。
* 表示「所有」。
; 表示一段 SQL 的結束。
在 SELECT 後加入 * 表示選取所有欄位,而加入欄位的名稱表示查詢結果只選擇指定欄位。 若想指定多個欄位,就用逗號 , 將多個欄位名稱隔開。
小技巧
保留字大小寫不會影響執行結果的對錯,但通常指令會用大寫。
寫作一段 SQL 可以單行或者換行並搭配縮排。
可使用註解描述一段程式碼的用意
為查詢結果中的變數取別名
使用 AS 為查詢結果中的變數取別名,其用法為 SELECT 欄位名稱 AS 新名稱 。
省略查詢結果中重複的資料
使用 DISTINCT 來省略重複值,其用法為 SELECT DISTINCT 欄位名稱 。
在沒有 FROM 的情況下,SELECT 也能夠單獨存在於一段 SQL 之中
如果只有單獨輸入 SELECT 輸入值 的話,欄位名稱和其資料觀測值會皆為輸入值。
在 SELECT 後面除了指定資料表的欄位,也能夠擺放常數,常見的常數類型有:
整數(INTEGER)。
帶小數點的浮點數(REAL)。
用單引號或雙引號標記的文字(TEXT)。
空值、遺漏值(NULL)。
使用單獨存在的 SELECT 將常見的常數類型顯示出來。
使用函數 TYPEOF() 將常數類型顯示出來
這表示即便在資料表中沒有儲存常數,依然能在 SQL 中加入這些常數並作為查詢使用。
SQL運算符介紹及運用
數值運算符
針對整數(INTEGER)與帶小數點的浮點數(REAL)可以使用數值運算符衍生計算欄位。SQL數值運算符語法如下:
在使用 / 相除兩個整數的時候要特別注意所衍生的欄位依然會以整數類型存在,若希望衍生欄位是浮點數類型,要為分子或者分母加上小數點。
文字運算符
針對文字(TEXT)可以使用文字運算符衍生計算欄位。
|| :兩個垂直線(可透過 Shift + \ 按出來)能夠連接文字。
若想要排序查詢結果,可以透過加入 ORDER BY 以指定變數的大小的方式來進行排序。
而排序的方法又分為兩種:遞增(或稱升冪)排序以及遞減(或稱降冪)排序,而
ORDER BY 預設的排序方式為遞增,若希望讓查詢結果遞減排序,必須加上保留字 DESC (Descending)。
※遞增的規範是由 0 到 9、A 到 Z
在 ORDER BY 後,可以指定多個變數搭配各自的排序方式。
也可以結合 LIMIT ,就可以進行「前 m 高」或「前 m 低」的資料分析。
若想要篩選資料,可以透過加入 WHERE 以條件(Conditions)作為篩選觀測值的依據選出想要的資料。
其語法為:
關係運算符
關係運算符常用在撰寫條件的時候,是能夠產生布林值(Boolean)的運算符號,而布林值(Boolean)則是用來表示比較結果的兩個值(False、True),比較結果為「False」的布林值,SQLite 會以 0 表示,而「True」則為 1 。
基礎關係運算符語法如下:
我們可以透過在 SELECT 後使用關係運算符來對每列觀測值都生成一個對應的布林值,
若是在 WHERE 後使用關係運算撰寫條件(數值與文字類型的變數皆可用),會篩選出相對應條件的觀測值。
特徵比對
除了基礎關係運算符,對文字類型的變數撰寫條件時,還能夠使用具備特徵比對(Pattern matching)性質的關係運算符 LIKE ,而在使用 LIKE 關係運算符的時候需要搭配萬用字元(Wildcards)。
邏輯運算符
當 WHERE 後的條件有多個的時候,必須使用邏輯運算符結合這些條件,基礎的邏輯運算符有:
AND 結合條件的交集。
BETWEEN 結合數值比較條件的交集。
OR 結合條件的聯集。
IN 結合條件的聯集。
NOT 反轉真假。
AND 交集
在使用 AND 結合兩個條件時,要兩條件皆為 True 才會判斷為 True,其餘狀況均為 False。
在撰寫交集條件式時也可以用 BETWEEN 來簡化程式碼。
OR 聯集
使用 OR 結合兩個條件時,要兩者皆為 False 才為 False,其餘狀況均為 True。
在撰寫交集條件式時也可以用 IN 來簡化程式碼。
NOT 反轉比較結果
使用 NOT 將條件的比較結果反轉,亦即 True 和 False 的互換
NULL缺漏值
NULL 遺漏值(或稱空值)不適用基礎關係運算符(=、+、- ...),要判斷是否為遺漏值,必須使用 IS NULL 作為關係運算符。
基本查詢語法
SELECT 是「選擇」欄位。
FROM 是指定「從」哪個資料表查詢資料。
LIMIT 是讓資料查詢結果顯示指定的前幾列。
排序語法
ORDER BY 能夠以指定變數的大小的方式來進行排序
篩選語法
WHERE 能夠以條件作為篩選觀測值的依據選出想要的資料。
感謝郭耀仁帶來精彩的SQL課程,不僅讓社員們可以更加瞭解資料庫的架構,同時也學會使用SQL的基礎語法來進行資料的處理,也期許未來社員在專案的參與過程中可以善加利用!