5.0 導入與本頁工具
本頁會循序介紹必修單元 A 之「數據庫」範圍,並配合一個可即時操作的數據庫工具,讓你可以邊學邊做。 你會練習:建立簡單數據表、利用表單輸入資料、進行單表查詢(選取/篩選/排序)、製作基本報表,以及解讀簡單 SQL(結構化查詢語言)語句。
重點提醒:本頁的練習以「單表」為主(符合必修要求),但你亦會在頁末看到「同一個數據庫可以包含多張數據表」的完成品示例。
練習方式:每個課題設有獨立練習區
- 數據庫工具的引擎只會載入一次,操作更流暢。
- 每一個課題都有自己的練習區(sandbox):你在某一節所做的改動,不會影響其他課題。
- 每一節都提供「重置」按鈕:需要回到起點時,一按即可清除該練習區的改動。
- 工具右上角提供「顯示其他數據表」開關:預設只顯示本節需要的重點數據表;如課堂需要或你想延伸探索,可打開以查看其他表。
5.1 DBMS 實作:簡單表、欄類型、基本輸入
重點
-
理解數據庫管理系統(DBMS)在「儲存、管理、查詢」資料上的角色,以及「數據庫 → 數據表 → 欄 → 紀錄」的層次。
操作教學:
- 按上方「開啟本節練習」打開工具,工具會停留在 Tables 分頁。
- 在左側列表觀察:目前練習區是空白的(刻意設計),你將由零開始建立一張新數據表。
- 你建立好數據表後,左側會出現表名;點擊表名即可進入該表的資料檢視(Datasheet)。
-
能建立一張簡單數據表,設定欄名與資料類型,並為重要欄加入基本約束(例如:必填、唯一)。
操作教學(示例:建立
students表):- 在 Tables 分頁按 + Table。
- 在「Table Name」輸入:
students。 - 依次加入以下欄(每列一個欄):
-
建議欄設計
- StudentID:Type 選 TEXT;勾選 PK(主關鍵碼)及 NN(不可留空)
- Name:Type 選 TEXT;勾選 NN
- ClassID:Type 選 TEXT;勾選 NN
- Score:Type 選 INTEGER;可先不勾 NN(允許暫時空白)
- 按 Save 儲存數據表。
- 成功後,你會在左側看到
students,點擊它進入資料檢視。
-
能在資料檢視(Datasheet)輸入基本資料,並分辨「一格是欄值、一行是一筆紀錄」。
操作教學:
- 在左側點選
students。 - 在右側選擇子分頁 Datasheet(如未顯示,請先確認你已點選該數據表)。
- 嘗試新增 2–3 筆紀錄,例如:
-
示例紀錄
StudentID =S101,Name =陳小華,ClassID =4A,Score =76 - 若你輸入了重複的 StudentID(已設為主關鍵碼),系統會提示錯誤;這正是約束保護數據一致性的例子。
- 在左側點選
-
懂得用簡單約束提升數據質素,例如用 CHECK 限制數值範圍。
操作教學(為 Score 加入範圍約束):
- 在 Tables 分頁選擇
students,切到子分頁 Design。 - 找到
Score那一行,在「CHECK」欄輸入:Score BETWEEN 0 AND 100 - 按 Save。
- 回到 Datasheet,嘗試輸入 Score =
120,觀察系統如何阻止不合理數值。
- 在 Tables 分頁選擇
定義:數據庫管理系統是一套軟件,用來建立、儲存、整理及存取數據庫中的資料;它提供介面與規則,讓使用者可以安全地新增、修改、查詢資料。
原理 / 運作:DBMS 會把資料以「數據表」形式儲存,並以約束(例如主關鍵碼、不可留空)維持一致性;當你查詢資料時,DBMS 會按查詢條件從資料中找出符合的紀錄,再把結果呈現。
例子:學校用一個數據庫管理學生資料:新增學生、查詢某班的成績、按分數排序等,都由 DBMS 代勞。
比較:用試算表亦可儲存資料,但 DBMS 更適合多人共用、資料量大、需要一致性與查詢效率的情境;而且 DBMS 有更嚴格的結構與約束。
常見錯誤:把 DBMS 當成「只有一張表」;其實 DBMS 管理的是整個數據庫(可以包含多張數據表、查詢、報表等)。
定義:數據表(Table)是一組有結構的資料集合;欄(Field)描述資料的「種類/屬性」;紀錄(Record)是一筆完整資料。
原理 / 運作:每一筆紀錄會在每個欄都有一個欄值(value)。DBMS 會按欄定義的資料類型與約束檢查欄值,並把每筆紀錄一致地存放。
例子:students 表可有欄:StudentID、Name、ClassID、Score。每一行就是一位學生的紀錄。
比較:試算表也有列與欄,但 DBMS 的欄有固定資料類型與約束,並可用查詢語句快速篩選與排序。
常見錯誤:把「欄名」寫成資料(例如把某位學生名字當作欄名);欄名應代表資料類別,不應是某一筆資料內容。
定義:資料類型用來描述欄值應該是甚麼形式(例如文字、整數、日期)。
原理 / 運作:當欄定義為整數,DBMS 可以進行數學比較與排序;若把數字當文字存放,排序可能變得不合理(例如把 100 排在 20 前面)。
例子:Score 用 INTEGER;StudentID、Name 用 TEXT。這樣可對 Score 做「>= 60」的篩選或由高至低排序。
比較:同一個資料(例如分數)用 TEXT vs INTEGER:TEXT 更像字串;INTEGER 是數值,便於計算與比較。
常見錯誤:所有欄都選 TEXT,導致排序/比較結果奇怪;或把 StudentID 設成 INTEGER,令需要前置零(例如 S001)時難以處理。
定義:約束是 DBMS 用來限制欄值/紀錄必須符合的規則,例如 PK(主關鍵碼)、NN(不可留空)、UQ(不可重複)、CHECK(必須符合條件)。
原理 / 運作:當你輸入或更新資料時,DBMS 會先檢查所有約束;若違反,操作會被拒絕並顯示錯誤,避免錯誤資料流入數據庫。
例子:StudentID 設為 PK 可以避免重複;Score 加上 Score BETWEEN 0 AND 100 可阻止 120 這類不合理分數。
比較:表單有效性檢驗(Form validation)可提示使用者,但最終仍應由 DBMS 約束把關,因為資料可能從不同途徑進入(例如匯入、SQL)。
常見錯誤:只靠人手小心輸入而不設約束;或把 CHECK 寫錯語法,導致規則無法生效。
定義:Datasheet 是直接在數據表格狀畫面輸入資料;表單(Form)是為輸入而設的介面,可加入提示與限制。
原理 / 運作:兩者最終都會把資料寫入同一張數據表;差別在於表單能更清晰地引導輸入流程,減少漏填與錯填。
例子:新增學生紀錄時,Datasheet 需要你自己對準欄;表單則會逐項顯示欄名與輸入框。
比較:大量批次輸入可用 Datasheet;需要準確與易用可用表單。
常見錯誤:在 Datasheet 直接改動大量資料而不察覺錯行;或以為表單資料不會受約束限制(其實一樣要受約束)。
在必修範圍內,你不需要建立非常複雜的數據庫結構,但你必須理解 DBMS 如何把資料變成「可管理」的形式。最核心的概念是: DBMS 不是單純儲存資料,而是透過「數據表結構(欄)+規則(約束)」把資料整理成一致而可靠的狀態,方便之後查詢與輸出。
建表時,先想清楚「你要記錄甚麼」:例如學生資料最少要有 StudentID、Name、ClassID。然後再想「哪一些欄必須唯一、必須存在」, 例如 StudentID 不應重複,所以適合做主關鍵碼;Name 不能空白,所以可設為不可留空。
最後一步是把資料放進去並檢查約束是否有效。若你發現系統能夠阻止重複 StudentID 或不合理的分數, 代表你的表設計已能協助你維持資料的正確性,後續做查詢與報表時就會更可靠。
Check Point 5.1:概念快測
5.2 表單輸入(Form)
重點
-
明白表單(Form)的用途:用較友善的介面把資料寫入數據表,減少漏填與錯填。
操作教學:
- 按「開啟本節練習」打開工具,系統會載入有示例資料的
students表。 - 在分頁列選擇 Forms,你會看到以
students表為基礎的輸入介面。 - 表單每一項輸入框對應數據表的一個欄,提交後會新增一筆紀錄。
- 按「開啟本節練習」打開工具,系統會載入有示例資料的
-
能用表單新增紀錄,並懂得回到 Datasheet 驗證資料是否成功寫入。
操作教學:
- 在 Forms 分頁填寫:
-
StudentID =
S200,Name =何家明,ClassID =4B,Score =61 - 按表單的提交按鈕(Submit / Add / Insert)。
- 切換到 Tables → Datasheet,檢查是否出現新紀錄(可用排序或查詢協助尋找)。
-
能理解表單輸入仍會受數據表約束影響,並能根據錯誤訊息修正輸入。
操作教學(故意觸發一次錯誤):
- 在表單中嘗試輸入一個已存在的 StudentID(例如
S001)並提交。 - 觀察系統提示:因 StudentID 是主關鍵碼,不能重複。
- 把 StudentID 改為新值(例如
S201)後再提交。
- 在表單中嘗試輸入一個已存在的 StudentID(例如
-
能把「輸入介面」與「資料設計」連繫:資料設計越清晰(欄名、約束越合理),表單越容易正確輸入。
操作教學:
- 回到 Tables → Design 檢視
students的欄設計(PK、NN、CHECK 等)。 - 思考:若 Score 沒有範圍約束,表單便難以阻止 999 這類輸入;相反,有約束時 DBMS 會替你把關。
- 回到 Tables → Design 檢視
定義:表單是一個以使用者為中心的輸入介面,用來新增或修改數據表中的紀錄。
原理 / 運作:表單會把你輸入的值對應到數據表的各個欄,提交後由 DBMS 執行插入/更新;若違反約束,DBMS 會拒絕並回報錯誤。
例子:在學生資料表單中輸入 StudentID、Name、ClassID、Score,提交後新增一位學生。
比較:Datasheet 是直接對表格輸入;表單更適合逐項輸入、需要提示或限制的情況。
常見錯誤:以為表單一定能防止錯誤;其實若數據表本身沒有約束,表單也未必能判斷資料是否合理。
定義:表單欄位(輸入框)對應數據表的欄;一次提交通常等於新增或更新一筆紀錄。
原理 / 運作:DBMS 以數據表結構作為「真實規格」;表單只是讓你更容易填寫。換言之,表單的「正確輸入」要回到數據表規格確認。
例子:StudentID 是主關鍵碼 → 表單必須輸入且不能與現有紀錄重複。
比較:如果把規則只寫在表單,資料由匯入或 SQL 進入時可能繞過檢查;把規則寫在數據表約束,所有途徑都會一致受控。
常見錯誤:只檢查「表單看起來沒問題」而不回到 Datasheet 驗證;結果資料未成功寫入也不自知。
定義:輸入有效性檢驗(validation)是確保輸入資料符合規則的檢查機制。
原理 / 運作:表單可做「介面層」有效性檢驗(例如提示必填),DBMS 則做「資料層」有效性檢驗(例如主關鍵碼唯一、CHECK 範圍)。兩者配合可最大限度降低錯誤。
例子:Score 只能 0–100:表單可提示範圍;DBMS 用 CHECK 強制限制。
比較:只靠表單有效性檢驗:若有人用 SQL 插入 120 仍可能成功(視乎有否約束);加入 DBMS 約束後就能統一把關。
常見錯誤:把「可以提交」誤當「資料一定正確」;其實仍要檢查資料的一致性(例如 ClassID 是否按學校命名規則)。
定義:良好的輸入流程能提升準確度與效率。
原理 / 運作:先決定欄的命名與規格(資料類型、必填、唯一),再設計表單順序與提示,最後用少量測試資料驗證(包括刻意測試錯誤)。
例子:先在 tables 設定 StudentID 為主關鍵碼,再在表單輸入重複 StudentID 測試,確認系統會阻止。
比較:未做測試就投入使用,常導致資料表已累積錯誤後才補救;相反,先測試可及早發現問題。
常見錯誤:測試只輸入「看起來正確」的資料,而沒有測試「錯誤資料」;結果規則失效也不知道。
表單的價值不只是「看起來比較易輸入」,而是它能讓輸入流程更一致、降低錯誤率。當數據表設計清晰, 表單就能直接反映你的設計:哪些欄必須填、哪些值不合理、哪些欄不可重複。
但要注意:表單不是萬能。最可靠的做法,是把關鍵規則放到數據表的約束中(例如主關鍵碼、CHECK), 表單則負責提供清晰的輸入介面。這樣即使資料由其他方式進入(例如匯入或 SQL),依然能保持一致。
完成表單輸入後,請養成習慣回到 Datasheet 驗證資料是否真的寫入,以及是否符合預期。 這是最簡單但最有效的「自我檢查」。
Check Point 5.2:表單輸入判斷題
5.3 單表 Query:select / filter / sort
重點
-
掌握單表查詢的三件事:選取(SELECT 取哪些欄)、篩選(WHERE 留哪些紀錄)、排序(ORDER BY 以甚麼次序顯示)。
操作教學:
- 按「開啟本節練習」進入工具,切到 Queries 分頁。
- 在「Base table」選擇
students(如已預設選好可略過)。 - 在 fields 區把需要顯示的欄勾選(例如 StudentID、Name、ClassID、Score)。
- 先不加任何條件,按 Preview 查看「純選取」結果。
-
能做基本篩選(filter):只顯示符合條件的紀錄,例如某班學生或及格學生。
操作教學(例:只看 4A 並且 Score ≥ 60):
- 在 criteria 區新增條件:
-
- Field:
ClassID;Op:=;Value:'4A' - Field:
Score;Op:>=;Value:60
- Field:
- 按 Preview,觀察結果是否只剩下符合條件的紀錄。
- 如果沒有結果,請檢查:ClassID 是否有加單引號、Score 是否打錯比較符號。
-
能做基本排序(sort):例如以分數由高至低,並以姓名作第二排序。
操作教學:
- 在 sort 區設定:
-
- 第一排序:Field =
Score,Direction =DESC - 第二排序(可選):Field =
Name,Direction =ASC
- 第一排序:Field =
- 按 Preview 檢查排序是否符合預期。
-
懂得把查詢保存(save)以供之後的報表使用,並知道查詢本身是「結果」,不是「新資料」。
操作教學:
- 完成查詢後,在右側的「Saved Queries」按 Save current query。
- 輸入名稱(例:
q_4A_pass)並確定。 - 你可按 Saved query 旁的 Load 將 SQL 送到 SQL Console(方便你學 SQL)。
定義:SELECT 決定輸出哪些欄;WHERE 決定保留哪些紀錄;ORDER BY 決定顯示次序。
原理 / 運作:你可以把查詢想成「先找資料(FROM)→ 篩選(WHERE)→ 選欄(SELECT)→ 排序(ORDER BY)」的流程(實際邏輯次序會在 SQL 節詳述)。
例子:SELECT Name, Score FROM students WHERE ClassID='4A' ORDER BY Score DESC;
比較:只用 SELECT(無 WHERE)=不篩選;只用 ORDER BY(無 WHERE)=不刪走任何紀錄,只改次序。
常見錯誤:把排序當成篩選(以為 ORDER BY 會「只保留」某些紀錄);或忘記文字要加單引號。
定義:篩選是用條件挑選符合的紀錄,例如等於、不等於、大於、包含文字等。
原理 / 運作:WHERE 條件會逐筆檢查紀錄是否符合;符合才保留到結果中。
例子:Score >= 60(及格);ClassID='4B'(某班);Name LIKE '陳%'(姓陳)。
比較:數值比較(>=、<)用於 INTEGER;文字比較(LIKE)用於 TEXT。
常見錯誤:把數值寫成帶引號的文字(雖然有時仍可運作,但容易引發理解混亂);或把 LIKE 寫成 =。
定義:排序是決定輸出結果的排列次序,ASC 為由小至大(或 A→Z),DESC 為由大至小(或 Z→A)。
原理 / 運作:ORDER BY 可寫多個欄:先按第一欄排序;若相同,再按第二欄排序。
例子:ORDER BY Score DESC, Name ASC:先顯示分數較高者;同分時按姓名字母順序。
比較:排序不會改動原數據表的儲存次序;它只影響「查詢結果」的顯示次序。
常見錯誤:以為排序會改變表本身次序;或把 DESC/ASC 寫反。
定義:保存查詢是把你常用的查詢語句記下來,方便日後重用。
原理 / 運作:保存的是「查詢規則/語句」,不是把結果複製成新資料;當數據表更新,查詢結果會跟著改變。
例子:保存 q_4A_pass 後,下一次只要載入再 preview,就能得到最新 4A 及格名單。
比較:保存查詢 vs 另存結果成新表:前者保持動態更新;後者容易出現過期資料(除非你定期更新)。
常見錯誤:以為保存查詢會永久固定當刻結果;或把查詢名改得不清晰,日後難以辨認。
單表查詢是數據庫最常用的能力之一:即使只有一張表,只要你懂得「選取、篩選、排序」,便可以從大量紀錄中找出需要的資訊。 在 DSE 層面,尤其要熟悉 SELECT / WHERE / ORDER BY 的用途與基本語法。
學習查詢時,建議先做「只選取」:把需要的欄顯示出來;再加入 WHERE 條件縮小範圍;最後才 ORDER BY 讓結果更易閱讀。 這種由簡到繁的建構方式,有助你快速找出錯誤位置。
此外,請把查詢視為「從現有資料產生的結果」。你不用改動原始數據表,就可以得到不同角度的輸出;這也是數據庫比單純表格更強的地方。
Check Point 5.3:SQL 關鍵字配對
5.4 Report(基本格式化)
重點
-
理解報表(Report)的定位:把查詢結果整理成易讀、可展示/列印的格式。
操作教學:
- 按「開啟本節練習」進入工具,先到 Queries 建立一個簡單查詢(例如顯示 StudentID、Name、ClassID、Score)。
- 按 Preview 確認查詢結果合理。
- 然後切換到 Reports 分頁。
-
能用「From Query Builder」把剛剛的查詢結果輸出成報表。
操作教學:
- 在 Reports 分頁,Source 選 From Query Builder。
- 按 Run Report 生成報表。
- 如你回到 Queries 修改查詢欄/條件,再回來 Run Report,報表內容會跟著變動。
-
能做最基本的格式化:加入標題、分組(group),令報表更易閱讀。
操作教學(以 ClassID 分組):
- 在 Reports 的「Group field」選擇
ClassID。 - 再次按 Run Report,觀察報表按班別分段顯示。
- 可在標題欄輸入報表名稱(例如「各班成績表」)。
- 在 Reports 的「Group field」選擇
-
分辨「查詢」與「報表」:查詢是取數據的規則;報表是輸出格式。
操作教學:
- 同一個查詢結果,可以用不同報表格式呈現(例如不同排序、不同分組)。
- 報表通常用於展示/列印;不應把報表當作儲存資料的方法。
定義:報表是把資料以整齊、可閱讀、可列印的方式呈現的輸出。
原理 / 運作:報表通常以某個查詢結果為資料來源,再套上版面格式(標題、欄順序、分組、總計等)。
例子:把 students 的查詢結果輸出為「各班成績表」,並以 ClassID 分組。
比較:查詢關心「取哪些資料」;報表關心「如何展示」。
常見錯誤:未確認查詢就先做格式,結果報表漂亮但資料錯;或把報表當作「新資料表」。
定義:分組是在報表中把同一類的紀錄放在同一段落,並在段落之間加上標題或空行。
原理 / 運作:系統會按你指定的 group field(例如 ClassID)把結果分段顯示;通常會配合排序,使同一組的紀錄相鄰。
例子:先按 ClassID 排序,再以 ClassID 分組,報表會先顯示 4A 的學生,再顯示 4B。
比較:分組不是篩選;分組會保留所有紀錄,只是把它們按類別分段呈現。
常見錯誤:忘記排序,導致同一組被拆散;或以為分組能取代 WHERE 篩選。
定義:格式化是提升可讀性的方法,例如標題、欄名清晰、排序合理、分組適當。
原理 / 運作:報表的使用者往往不是數據庫操作者,所以版面應清楚呈現「讀者想知道甚麼」。
例子:成績表通常分數由高至低;若要找及格名單,可先篩選 Score ≥ 60,再輸出報表。
比較:同一份資料,不同呈現方式可以服務不同需要(例如「總覽」vs「詳細」)。
常見錯誤:欄太多導致報表難讀;或沒有標題/日期/篩選條件說明,令讀者無法理解報表背景。
報表是一個「由資料到展示」的橋樑:你先用查詢把需要的資料整理好,再用報表把結果做成容易閱讀的格式。 在必修範圍內,你不需要做非常複雜的版面設計,但必須理解報表是「輸出」,不是「儲存」。
做報表時,建議把工作分兩步:第一步在 Queries 確保資料正確(欄、條件、排序);第二步在 Reports 做格式化(標題、分組)。 若報表內容不對,通常應回到查詢修正,而不是在報表「硬改」。
最後,請留意分組通常需要配合排序,否則同一組資料可能分散在不同位置,令報表難以閱讀。
Check Point 5.4:查詢 vs 報表
5.5 SQL:解讀簡單語句(trace & interpret)
重點
-
知道 SQL(結構化查詢語言)用來向 DBMS 發出指令;能讀懂簡單 SELECT 語句。
操作教學:
- 按「開啟本節練習」打開工具,切到 SQL Console 分頁。
- 在輸入框輸入(或貼上)一個簡單語句,例如:
-
SELECT StudentID, Name, Score FROM students;
- 按 Run (Ctrl+Enter) 觀察輸出。
-
能追蹤(trace)一條 SQL 的執行邏輯,並解釋每一段子句的作用。
操作教學(加入 WHERE + ORDER BY):
- 輸入:
-
SELECT StudentID, Name, Score FROM students WHERE ClassID = '4A' AND Score >= 60 ORDER BY Score DESC;
- 按 Run,觀察結果是否只出現 4A 及格學生,並由高分到低分排列。
- 嘗試把 ORDER BY 刪走,再 Run 一次,體會「排序」與「篩選」的分工。
-
懂得把 Query Builder 與 SQL 互相轉換:用 Query Builder 產生思路,再用 SQL 精準表達。
操作教學:
- 到 Queries 建立一個你熟悉的查詢(例如 4A 及格名單)。
- 在右側「Saved Queries」把查詢保存;然後按該查詢旁的 Load,系統會把 SQL 送到 SQL Console。
- 在 SQL Console 中閱讀這段 SQL,嘗試逐句解釋其作用(SELECT/WHERE/ORDER BY)。
-
避免常見語法錯誤:文字要加單引號、語句以分號結尾、子句順序正確。
操作教學(自我檢查清單):
- 若條件是文字:
ClassID = '4A'(有單引號)。 - 若條件是數值:
Score >= 60(通常不加引號)。 - WHERE 要放在 ORDER BY 之前。
- 每條語句最後加
;,避免一次 Run 多條時混亂。
- 若條件是文字:
定義:SQL 是一套標準語言,用來建立、修改、查詢數據庫中的資料。
原理 / 運作:你向 DBMS 發出 SQL,DBMS 解析語句後執行相應操作(例如搜尋、排序、插入資料),最後回傳結果或訊息。
例子:SELECT * FROM students; 會取出 students 表所有欄與所有紀錄。
比較:Query Builder 是圖形介面;SQL 是文字語言。兩者做的事相同,但 SQL 更精準、更通用。
常見錯誤:把 SQL 當成「背句子」;其實應理解子句的角色與組合方式。
定義:Trace 是按一個合理的次序,解釋 SQL 如何一步步產生結果。
原理 / 運作:常用的邏輯理解次序是:FROM → WHERE → SELECT → ORDER BY。先決定資料來源(FROM),再篩選(WHERE),再選欄(SELECT),最後排序(ORDER BY)。
例子:FROM students 取出學生資料 → WHERE ClassID='4A' 留下 4A → SELECT Name 只顯示姓名 → ORDER BY Name ASC 排序。
比較:寫 SQL 的次序是 SELECT…FROM…WHERE…ORDER BY…;但解釋時用 FROM→WHERE→SELECT→ORDER BY 會較清晰。
常見錯誤:把「寫法次序」當成「理解次序」,導致解釋混亂;或誤以為 ORDER BY 會先於 WHERE 執行。
定義:在 SQL 中,文字(TEXT)通常要用單引號包住;數值(INTEGER)通常不用。
原理 / 運作:單引號告訴 DBMS「這是一段文字常數」。若漏了引號,DBMS 可能把它當成欄名或關鍵字,導致錯誤。
例子:ClassID='4A' 正確;ClassID=4A 可能會出錯或被誤解。
比較:Score >= 60 是數值比較;Name='陳大文' 是文字比較。
常見錯誤:用雙引號代替單引號(在不同系統行為可能不同);或把數值也加引號而造成理解混亂。
定義:語法錯誤是指 SQL 不符合規則,DBMS 無法解析。
原理 / 運作:DBMS 解析失敗會回報錯誤位置;你應逐一檢查關鍵字、括號、引號、分號、子句順序。
例子:把 WHERE 放到 ORDER BY 後面;或漏了 AND/OR 連接條件。
比較:語法錯誤(syntax error)vs 邏輯錯誤(logic error)。前者會直接報錯;後者能跑但結果不對(例如條件寫錯)。
常見錯誤:只看報錯不看語句;或一次改很多地方,反而找不到問題源頭。建議一次只改一處並重新 Run。
在必修範圍中,你未必需要寫非常複雜的 SQL,但你必須能夠「閱讀」與「解釋」一條簡單 SELECT 語句, 尤其是 WHERE(篩選)與 ORDER BY(排序)。這種能力也能幫助你理解 Query Builder 背後的運作。
建議你用「trace」方式解釋:先指出資料來源(FROM),再說明篩選條件(WHERE)如何刪走不符合的紀錄, 接着解釋輸出欄(SELECT)為何只顯示某些欄,最後說明排序(ORDER BY)如何改變顯示次序。
當你能清楚說出每一段子句的作用,你就不容易被「記錯句子」困住;即使遇到陌生題目,也能靠理解推理出答案。
Check Point 5.5:SQL 解讀判斷題
5.6 完成品:同一個數據庫包含多張數據表
重點:
- 按實體分拆數據表:把班別與學生分別儲存在
classes和students,令每張數據表只集中描述一類事物。 - 以鍵碼建立連結:
classes.ClassID是班別的主關鍵碼;students.ClassID應作為外鍵碼,指向所屬班別。 - 理解一對多關係:一個班別可以對應多名學生,但每筆學生記錄只會指向一個班別。
- 維持參照完整性:外鍵碼的值必須有相應的班別記錄,並應避免隨意刪除仍被學生記錄引用的班別。
- 減少重複與更新矛盾:班名及班主任等班別資料只需儲存一次;連結欄位的數據類型亦必須一致。
定義:多表數據庫是在同一個數據庫內,以兩張或以上的數據表分別儲存不同實體的資料。關聯是數據表之間有意義的連結,通常透過一張表的主關鍵碼與另一張表的外鍵碼建立。
原理/運作:設計時先辨認實體,例如「班別」與「學生」,再把每個實體的屬性放入相應數據表。兩表不必把所有資料放在同一行,而是以共同鍵碼值互相對應;查詢時可按這個對應關係合併所需資料。
例子:classes 儲存班別資料,students 儲存學生資料。學生記錄中的 ClassID = '4A',會對應 classes 內主關鍵碼同為 '4A' 的班別記錄。
比較:兩張互不相干的數據表只是同時存在於數據庫;兩張有關聯的數據表則共享具明確含義的鍵碼,讓系統知道哪些記錄彼此相屬。
常見錯誤:以為兩張表只要有相同欄名便自動建立關聯。欄名相同只是一個提示;真正的關聯還要有一致的鍵碼含義、相容的數據類型,以及在需要時宣告外鍵碼約束。
定義:主關鍵碼用來唯一識別一筆記錄;外鍵碼儲存另一張數據表的主關鍵碼值;參照完整性確保外鍵碼不會指向不存在的記錄;一對多關係表示「一」方的一筆記錄可被「多」方的多筆記錄引用。
原理/運作:在本例中,classes 是「一」方,students 是「多」方。新增或修改學生記錄時,students.ClassID 應先在 classes.ClassID 找到對應值;刪除班別前,亦要處理所有引用該班別的學生記錄。
例子:classes.ClassID = '4A' 只出現一次,但 students.ClassID = '4A' 可在多名學生的記錄中重複出現,形成一個班別對多名學生的一對多關係。
比較:主關鍵碼必須唯一,通常亦不可留空;外鍵碼則可以在多筆記錄中重複,但每個非空值都應對應被參照數據表中的有效主關鍵碼。兩者用途不同,不應因欄內都存放代碼而混淆。
常見錯誤:把外鍵碼誤設為唯一,令同一班別只能有一名學生;或只建立同名欄而沒有檢查對應值,結果產生沒有班別記錄可供對應的「孤立記錄」。
定義:合理的欄位設計應讓每個欄只表示一項清楚、可驗證的資料,並為每張數據表選擇穩定而唯一的主關鍵碼。
原理/運作:classes 可包含 ClassID TEXT PRIMARY KEY、ClassName TEXT NOT NULL、ClassTeacher TEXT;students 可包含 StudentID TEXT PRIMARY KEY、Name TEXT NOT NULL、ClassID TEXT NOT NULL 及 Score INTEGER。其中 students.ClassID 應參照 classes.ClassID。
例子:班別記錄可以是 ('4A', '中四甲班', '陳老師');學生記錄可以是 ('S001', '陳大文', '4A', 78)。兩筆記錄透過 '4A' 建立連結,而不是在學生表內再次輸入班名及班主任。
比較:ClassID 是供系統連結及識別的穩定代碼;ClassName 和 ClassTeacher 是可顯示、亦可能更改的描述資料。以代碼連結通常比以顯示文字連結可靠。
常見錯誤:把 classes.ClassID 設為文字,但把 students.ClassID 設為整數;或把班主任姓名、班房等班別屬性重複放進每一筆學生記錄,令日後更新容易不一致。
定義:單表設計把學生與班別資料全部放在同一張表,會令同一班別資料在多筆學生記錄中重複;分表設計則把班別資料抽出至 classes,學生表只保留用作連結的 ClassID。
原理/運作:分表可減少數據冗餘性,並降低更新、插入及刪除時出現矛盾的機會。需要同時顯示學生與班別資料時,再透過共同的 ClassID 進行聯結查詢。
例子:若 4A 有三十名學生,單表可能把「中四甲班、陳老師」輸入三十次;分表後只需在 classes 儲存一次,學生表的三十筆記錄只保存 '4A'。
比較:單表較容易開始,但資料愈多,重複及更新矛盾愈嚴重;分表需要理解鍵碼及聯結,卻能令結構更清晰,亦較容易維持一致。
常見錯誤:以為分表後所有資料會自動一起顯示。分表只是改善儲存結構;要把學生姓名、班名和班主任放在同一結果中,仍需使用查詢按關聯聯結兩表。
定義:鍵碼設計錯誤會令記錄無法被可靠識別或連結;參照完整性錯誤則表示外鍵碼指向不存在、已刪除或不能正確比較的主關鍵碼值。
原理/運作:排錯時可依次檢查四項:主關鍵碼是否唯一而穩定、外鍵碼是否有對應記錄、被引用記錄是否仍存在,以及兩邊欄位的數據類型與格式是否一致。
例子:以姓名作主關鍵碼會遇到同名或改名;輸入 students.ClassID = '6Z' 而沒有相應班別會造成孤立記錄;刪除仍被學生引用的 '4A' 會破壞連結;一邊存文字 '04'、另一邊存整數 4 亦可能無法正確對應。
比較:姓名屬於可重複及可更改的描述資料,學生編號則較適合作主關鍵碼;人手檢查只能降低錯誤機會,外鍵碼及參照完整性約束才能由數據庫在每次新增、修改或刪除時一致地把關。
常見錯誤:以姓名作主關鍵碼、外鍵碼沒有對應記錄、直接刪除被引用的班別,以及把兩邊的連結欄設定為不一致的數據類型。遇到這些情況,應先修正結構或相關記錄,而不是繞過驗證。
把所有學生和班別資料放進單一數據表,會令班名、班主任等資料隨每名學生重複儲存。當班主任更改時,使用者可能只修改了部分學生記錄,造成同一班別出現多個版本。把班別獨立成 classes,並把學生獨立成 students,可讓每項事實只儲存在最合適的位置,減少重複和更新矛盾。
兩張數據表透過 ClassID 連結:classes.ClassID 是主關鍵碼,唯一識別每個班別;students.ClassID 則應作為外鍵碼,保存學生所屬班別的代碼。由於同一個 ClassID 可出現在多筆學生記錄中,這是一對多關係。要維持參照完整性,兩邊欄位應採用一致的數據類型,而且每個學生的班別代碼都應在 classes 找到相應記錄。
在完成品工具中,先按「載入完成品概覽」,再分別選擇 classes 和 students,觀察兩表的欄位、主關鍵碼、示例記錄及重複出現的 students.ClassID。同時展開建表語句,檢查是否真的宣告了外鍵碼約束;只有共同欄值而沒有外鍵碼宣告,仍可供查詢時聯結,但不能單憑欄名證明數據庫已自動執行參照完整性。
完成品概覽
按「載入完成品概覽」後,這裡會顯示數據表結構與示例資料。
總結 課文腦圖總結
重點:
- 腦圖把全課重新歸納為數據模型、完整性控制、輸入流程、查詢邏輯、SQL 及資訊輸出六條主線,並移除純粹介紹練習工具的節點。
- 可使用右上角「樹狀圖導覽」快速前往節點,或開啟「聚焦模式」以動畫移動及放大所選概念。
- 學生可新增、編輯、刪除或拖動節點,並把個人版本匯出為
.ictmap檔案。
先由置中的根課題開始,再沿連線由上向下閱讀主題、概念、公式、比較、例子及常見錯誤。可在樹狀圖導覽點擊任一項,畫布會以動畫前往並聚焦相應節點。
可新增、編輯、刪除或拖動節點以改變父子關係。修改會暫存在目前瀏覽器;完成後應匯出 .ictmap 作備份,日後可重新匯入。
先把現實資料轉成表、欄和紀錄,再比較主關鍵碼、約束、表單檢查及多表關係如何維持完整性;其後把資訊問題拆成選取、篩選和排序,最後連結 SQL 與報表輸出。
以下腦圖在完整閱讀全課後,沿數據生命週期重新分類:由現實屬性建立數據表模式,以主關鍵碼、約束和共同欄維持完整性,再經表單或資料檢視輸入及核對紀錄。
查詢與 SQL 不再被視為兩段孤立內容,而是同一邏輯的圖形及文字表達;報表則放在資訊輸出主線,強調數據來源必須先正確,版面才有意義。