網頁資料該存在哪裡?為什麼我們需要資料庫
學網頁開發的時候,你一定會遇到一個問題:資料要存在哪裡? 存在瀏覽器裡?存在使用者的電腦裡?還是存在其他地方? 這個看似簡單的問題,背後牽涉到資料的安全性、可用性、還有多人協作等等考量。而這些考量,正是「資料庫」存在的原因。 這篇文章會帶你從「資料該存在哪裡」這個問題出發,一步步理解為什麼我們最終需...
從為什麼需要資料庫開始,帶你認識表格設計、正規化原則到 SQL 語法操作,一步步建立完整的資料庫基礎。
共 40 篇文章
學網頁開發的時候,你一定會遇到一個問題:資料要存在哪裡? 存在瀏覽器裡?存在使用者的電腦裡?還是存在其他地方? 這個看似簡單的問題,背後牽涉到資料的安全性、可用性、還有多人協作等等考量。而這些考量,正是「資料庫」存在的原因。 這篇文章會帶你從「資料該存在哪裡」這個問題出發,一步步理解為什麼我們最終需...
上一篇文章我們知道了:資料應該存在遠端伺服器上,而不是瀏覽器或使用者的電腦裡。 但問題來了:遠端伺服器上可以存很多種東西——文字檔、Word 文件、Google 試算表、甚至就是一個 .txt 檔。那我們為什麼還需要特別學「資料庫」這個東西?用一般的檔案存資料不行嗎? 這篇文章要告訴你的是:資料不只...
前面的文章我們學到了:資料庫用「表格」來儲存資料,讓資料格式統一、位置固定、程式好處理。 但資料庫的好處不只這些。這篇文章要介紹資料庫另外兩個非常重要的功能——交易(Transaction) 和 鎖定(Lock)。 這兩個功能都是為了解決同一個問題:確保資料的正確性與一致性。 聽起來很專業?別擔心,...
前面的文章我們學到了:資料庫用「表格」來儲存資料,讓資料格式統一、方便管理。 但你可能會想:「表格我知道啊,就像 Excel 那樣,有什麼好學的?」 其實資料庫的表格有一套專門的術語和概念,學會這些之後,你才能用正確的「語言」來描述你想對資料做的事情。 這篇文章會帶你認識資料庫表格的基本結構,並且練...
前面的文章我們學會了資料庫表格的基本結構:表格(Table)、欄位(Column)、列(Row)、格子(Cell)、值(Value)。 但在真實世界中,資料不會乖乖地以表格形式出現。你拿到的可能是一段文字描述、一份會議記錄、或是一堆散亂的筆記。 這篇文章要帶你練習:如何從雜亂的資料中,找出共同性質,...
前面的文章我們學會了如何設計資料庫表格,把雜亂的資料整理成有結構的欄位和列。 但光是把資料存進去還不夠,我們還 [...]
前面的文章我們提到,資料庫的欄位(Column)一旦設計好,通常不建議隨意增減。 但有些情況下,資料的「共同性質」並不固定,這時候傳統的表格設計就會遇到困難。 這就牽涉到資料庫的兩大流派:關聯式資料庫與非關聯式資料庫。 這篇文章會帶你認識這兩種資料庫的差異,以及它們各自適合的使用情境。
在前面的文章中,我們介紹了資料庫的兩大流派:關聯式資料庫與非關聯式資料庫。 這篇文章開始,我們要深入學習關聯式資料庫。 關聯式資料庫是目前最主流的資料庫類型,大部分系統的核心資料都是用關聯式資料庫來儲存。學好關聯式資料庫,是學習資料庫最重要的基礎。 讓我們從關聯式資料庫最重要的特徵開始:欄位固定。
前面的文章我們學到了關聯式資料庫的核心特徵:欄位固定、格式統一。 但在真實世界中,資訊是雜亂的。這篇文章要教你如何把日常生活中的資訊,轉換成有條有理的資料表。 我們會透過兩個範例,從簡單到複雜,學會如何找出「個體」和「關係」,並把它們轉換成資料表。
在前一篇文章中,我們學會了如何把日常資訊轉換成資料表,包括個體表和關係表。 你可能會想:「為什麼要分這麼多張表?好複雜!把所有資料放在一張表不是更簡單嗎?」 這篇文章會回答這個問題。我們會實際嘗試「一張表打天下」,然後你就會明白:為什麼關聯式資料庫要分成多張表。
前面的文章我們學會了: 如何找出個體和關係 為什麼要分成多張表 如何透過關聯避免重複資料 這篇文章會透過三個實際案例,從簡單到複雜,讓你練習如何把日常生活中的資訊轉換成資料表。你會發現,有些看似簡單的句子,背後其實藏著複雜的結構。
這篇文章進入資料庫系列文章的重要主題——架構設計。 架構設計在做什麼?簡單來說,就是在規劃你的表單要有哪些欄位、表單之間要怎麼關聯。而設計架構時,有一個最重要的核心精神: 避免資料重複。 為什麼資料重複這麼嚴重?讓我們從工程師常講的一個原則開
上一篇文章我們學到:好的資料庫架構要避免重複,方法是用「關聯」讓每筆資料只存在一個地方。 但實際設計的時候,你會遇到一個問題:怎麼判斷哪些欄位該放在同一個表單?哪些該分開? 這篇文章會用一個訂房網站的例子,帶你一步步學會「拆表單、刪欄位」的技巧,這個技巧背後的原則叫做第二正規化形式(Second N...
上一篇文章我們學到了「第二正規化形式」,知道怎麼透過拆表單、刪欄位來避免重複資料。 但你可能會好奇:為什麼叫「第二」正規化形式?還有第一、第三嗎?這些正規化形式到底是什麼? 這篇文章會解釋正規化形式的由來,以及什麼時候可以打破這些規則。
上一篇文章我們學到了第二正規化形式:把相依的欄位放在同一張表單,不相依的欄位拆到不同的表單。 例如「會員」和「會員信箱」是相依的(知道會員就知道信箱),所以放在同一張會員表單。 但有時候,表單裡還會有另一種「多餘」的欄位——它不是直接重複,而是可以計算出來的。 這篇文章會介紹第三正規化形式,教你怎麼...
前面的文章介紹了第二正規化和第三正規化,都是從「欄位之間的相依關係」來決定要不要拆表單、刪欄位。 這篇文章要介紹的第一正規化形式,角度不太一樣——我們要從「資料列」的層級來看,有沒有需要調整的地方。 先來看一個實際的例子。
上一篇文章介紹了第一正規化形式,我們知道「一個會員有多支電話」這種情況要拆表單。 但這種「一個對應到多個」的關係,在資料庫設計中有專門的名稱,叫做「一對多關係」。 除了一對多,還有「一對一」和「多對多」。這篇文章會教你怎麼判斷資料之間是哪種關係,以及不同的關係要怎麼設計表單。
上一篇文章介紹了一對一、一對多、多對多三種關係類型,也學會了怎麼設計表單來記錄這些關係。 但有個問題:我們怎麼確保這些關係是正確的? 例如會員和電話是「一對多」的關係,一支電話只能被一個會員持有。但如果有人不小心把同一支電話填了兩次,分別屬於不同會員,怎麼辦? 這篇文章會介紹資料庫的「限制」功能,幫...
前面的文章我們討論關係類型時,都在問「最多」: 一個會員最多可以有幾支電話? 一支電話最多可以被幾個會員持有? 但有沒有想過:最少呢?可不可以完全沒有? 例如一個會員可不可以完全沒有電話?一個人可不可以沒有配偶? 這篇文章會介紹資料庫中的「空值」(NULL),以及它的特殊性質。
上一篇文章介紹了 NULL,讓我們可以在欄位中表示「沒有資料」。 但反過來想:有些欄位是不是不應該允許空值? 例如會員的姓名。一個會員一定要有姓名吧?如果連姓名都沒有,這個會員資料就不完整了。 這篇文章會介紹 NOT NULL 限制,以及什麼時候該用、什麼時候不該用。
前面我們介紹了第二正規化、第三正規化,還有第一正規化的後半。 現在終於要進入第一正規化的前半,也就是整個正規化形式的最開頭。 第一正規化的前半告訴我們:表單要有一個欄位是主鍵(Primary Key)。 什麼是主鍵?為什麼需要它?我們來看一個例子。
前面我們介紹了主鍵(Primary Key),它幫助我們唯一識別每一筆資料。 有了主鍵之後,我們終於可以介紹另一個很重要的限制:外部鍵(Foreign Key)。 什麼是外部鍵?為什麼需要它?我們來看一個例子。
我們已經學了三種正規化形式: 第一正規化:表單要有主鍵,同一欄位只能存一筆資料 第二正規化:相依性高的欄位要拆表 第三正規化:可以從其他欄位推算出來的欄位要刪掉 也學了四種欄位限制:UNIQUE、NOT NULL、PRIMARY KEY、FOREIGN KEY。 現在問題來了:一對一、一對多、多對多...
學完正規化和限制之後,我們來做一個實戰練習。 這次的任務是:幫一間補習班設計班務系統的資料庫。 這個系統要記錄什麼? 有哪些課程(科目 + 年級) 有哪些老師 有哪些學生 老師在什麼時間、什麼教室上什麼課 學生選了哪些課 聽起來不難,但實際設計的時候,你會發現有很多細節要考慮。 讓我們一步步來。
前面幾篇我們討論的都是理論,像是資料庫的架構要怎麼設計。 從這篇開始,我們終於要動手操作資料表和資料了! 不過在寫程式之前,有一件事要先說明。 市面上有很多種資料庫系統,像是 MySQL、PostgreSQL、MSSQL 等等。 它們雖然都叫「關聯式資料庫」,語法也都是 SQL 風格,但細節上還是有...
上一篇我們介紹了 Pseudo Code 的表示方式,讓你知道接下來的語法要怎麼看。 從這篇開始,我們要正式學習如何操作資料庫了。 在資料庫裡面,操作分成兩個層級: 表單層級:對整張表做新增、修改、刪除 資料層級:對表裡面的每一筆資料做新增、查詢、修改、刪除 這篇文章會先從「表單操作」開始。
前幾篇介紹完新增、修改、刪除之後,這篇來講「讀取資料」。 你可能會想:讀取不是最簡單的嗎?為什麼放到後面才講? 其實讀取的操作本身不難,但在實際工作中,讀取資料的時間會比你想像中還要多。 因為你不是單純把資料讀出來就好,通常還需要做各種資料整理——這部分會在下一篇詳細說明。 這篇文章會先帶你了解 S...
上一篇我們學了如何用 SELECT 讀取資料,這篇來講如何「新增資料」。 新增資料用的是 INSERT 這個指令。 這篇文章會帶你了解 INSERT 的基本用法。
這篇來講如何「刪除資料」。 刪除資料用的是 DELETE 這個指令。 在所有資料操作中,刪除是最需要謹慎的。 因為刪除在資料庫中是真的消失,沒有資源回收桶可以讓你復原。 這篇文章會帶你了解 DELETE 的用法,以及刪除資料時必須注意的事項。
學會建立資料庫之後,接下來最重要的技能就是「把資料撈出來整理」。 這篇文章會帶你了解 SQL SELECT 的核心觀念,讓你知道它是怎麼幫你把一張表單轉換成另一張表單。
學 SQL 的時候,你可能會有一個疑惑: 為什麼我寫的順序是 SELECT → FROM → WHERE,但有些語法卻好像不是按照這個順序執行? 這是因為 SQL 的「撰寫順序」和「執行順序」是不一樣的。 這篇文章會帶你了解資料庫真正的執行順序,讓你知道為什麼有些寫法可以,有些不行。
你有沒有想過,SELECT 這個關鍵字到底在做什麼? 很多人會說「查詢資料」,但這個說法不夠精確。 SELECT 真正在做的事情是「輸出」——把資料呈現出來。 理解這個觀念之後,你會發現 SELECT 其實可以單獨執行,不一定要搭配 FROM 和 WHERE。
如果你有寫過程式,處理大量資料時,你可能會習慣用「迴圈」把資料一筆一筆拿出來處理。 但資料庫不是這樣運作的。 這篇文章會帶你理解資料庫的運算方式,以及為什麼這會影響到你寫 SQL 的效能。
前面提到,WHERE 篩選條件可以有效減少資料量,讓後續運算更快。 那除了 =(等於)之外,還有哪些好用的篩選條件呢? 這篇文章會介紹幾個常用的布林運算子,讓你的 WHERE 條件更靈活。
前面學了很多篩選條件的布林運算子,但那些都還是在 WHERE 裡面用的。 現在終於要學一個新的指令了:ORDER BY(排序)。 排序在日常生活中很常見,誰的收入比較高?誰的成績比較好?這些都是排序。 在資料庫中,排序也是整理資料的重要方式。
前面學了 ORDER BY 排序,接下來要學一個常常跟排序搭配使用的指令:LIMIT(限制筆數)。 當資料量很大的時候,你可能只想看前幾筆,或是做分頁顯示,這時候就需要用到 LIMIT。
這種「把很多筆資料放在一起,用一個值來代表」的運算,叫做聚合運算(Aggregate)。 為什麼叫「聚合」? 因為你把一堆資料「聚」在一起,「合」成一個結果。 舉個例子:台灣的平均月收入是 5 萬元。 這個「5 萬元」是怎麼來的? 是把全台灣所有人的月收入加起來,除以人數,得到一個數字。 這個數字「...
前面學過聚合運算,可以把整張表的資料「壓縮」成一筆。 但很多時候,你不只想知道「全部加起來是多少」。 比如說,老闆問你:「每個部門有幾個員工?」 這時候就需要用 GROUP BY 來「分組」。
前一篇學過 GROUP BY 可以把資料分組並壓縮。 但光是分組,能做的事情有限。 GROUP BY 真正強大的地方,是搭配聚合函數一起使用。 比如說,老闆問你:「每個客人的平均消費金額是多少?」 這時候你需要先把訂單按照客人分組,再對每一組計算平均金額。 這就是 GROUP BY 搭配聚合函數的威...
前一篇學過 GROUP BY 搭配聚合函數,可以算出每個客人的平均消費金額、每個部門的員工數量等等。 但有時候老闆不想看全部的結果。 比如說,老闆說:「資料太多了,你直接告訴我平均消費金額超過 10 萬的頂級客戶有哪些就好。」 這時候你需要在分組之後再做篩選,這就是 HAVING 的用途。