學生背得出「主鍵唯一」,但寫 SELECT 時會漏 WHERE、把 COUNT 寫成 COUNT(*),JOIN 更加直接放棄。這一堂把查詢拆成四個零件,寫錯時知道是哪一個零件出事。
本堂目標 學生能夠:① 指出主鍵與外鍵並解釋參照完整性;② 由需求寫出 SELECT … FROM … WHERE … ORDER BY 查詢;③ 用 COUNT、AVG、GROUP BY 做統計,並用 JOIN 由兩張表合成一張結果表。
01 先備知識(開課前 3 分鐘快檢)
以下任何一項未過關,本堂就會卡住,先補該項:
| 技能 |
快檢題 |
過關標準 |
| 表格讀法 |
一張表的欄叫甚麼 |
欄位(field) |
| 排序概念 |
ORDER BY 預設是升序還是降序 |
升序 ASC |
| 平均數 |
5 個分數的平均怎樣算 |
總和除以數量 |
02 課堂流程(60 分鐘)
| 時間 |
環節 |
導師做什麼 |
學生做什麼 |
| 0–10 分 |
表、記錄、欄位 |
關聯式數據庫的基本單位 |
講出三個名詞的分別 |
| 10–22 分 |
主鍵與外鍵 |
唯一、非空、指向另一張表的主鍵 |
指出兩張表的鍵 |
| 22–36 分 |
SELECT 四零件 |
SELECT、FROM、WHERE、ORDER BY |
寫出篩選加排序 |
| 36–48 分 |
聚合與 GROUP BY |
COUNT、AVG、每組一行的意思 |
算出 4A 班 2 人 |
| 48–56 分 |
JOIN 與正規化 |
ON 條件配對、重複資料的危害 |
JOIN 後 5 行 |
| 56–60 分 |
離場檢查 |
三題收回即批 |
獨立完成 |
03 講解腳本(照著說就可以)
第一幕:主鍵與外鍵:先畫兩張表,再講規則
一張表由欄位(field)與記錄(record)組成。主鍵是能唯一識別一行的欄,所以不可以重複、不可以空白;外鍵是另一張表的主鍵,放在這張表用來表示「屬於哪一個」。
本堂用兩張表:Students(學號、姓名、班別、分數)共 5 筆記錄,Classes(班別、班主任)共 3 筆。Students 的主鍵是學號,班別是外鍵,指向 Classes 的主鍵班別。所以 Students 裡不可以出現 Classes 沒有的班別,這條規則叫參照完整性。
要學生講:如果把班主任姓名直接寫入 Students,會有甚麼問題(同一位老師重複寫多次,改一次要改好多行)。
第二幕:SELECT 四個零件:缺一件就錯一種
SELECT 決定輸出哪幾個欄,FROM 決定由哪張表拿,WHERE 決定只要哪些行,ORDER BY 決定排序。四件零件各有各錯,所以寫錯時先問「是篩選錯、還是排序錯」。
例:SELECT Name FROM Students WHERE ClassID = “4A” ORDER BY Name;結果是 2 行,Chan Tai Man 與 Lee Ka Yan,按姓名升序。
再加條件:WHERE Mark > 70 得 3 行;WHERE Mark > 70 AND ClassID = “4B” 得 1 行(Ng Yuk)。留意字串要用引號,數字不用。
要學生寫:找出 4B 班分數最高的一位(Wong Hoi 58 與 Ng Yuk 90,答案是 Ng Yuk)。
第三幕:聚合與 JOIN:由幾行變成一個數
COUNT 數行數、AVG 算平均、MAX 找最大,配合 GROUP BY 可以每組出一行。SELECT ClassID, COUNT(*) FROM Students GROUP BY ClassID;得 4A 2 人、4B 2 人、5A 1 人。
全班平均分 = (72 + 65 + 58 + 81 + 90) ÷ 5 = 73.2,最高分 90(Ng Yuk)。
JOIN 是把兩張表按外鍵對齊:SELECT Students.Name, Classes.Teacher FROM Students JOIN Classes ON Students.ClassID = Classes.ClassID;結果仍然是 5 行,但每行多了班主任,Ms Cheung 帶 2 人、Mr Lau 帶 2 人、Dr Yip 帶 1 人。
提醒:漏寫 ON 條件會變成笛卡兒積,5 行乘 3 行得 15 行,是中六最常見的失分位。
04 必教題型與步驟
| 題型 |
例子 |
步驟 |
答案 |
| 設計 |
為補習班設計兩張表 |
找唯一欄做主鍵、重複資料搬去另一張表 |
Students 加 Classes |
| 查詢 |
列出 4A 班學生姓名,按分數由高到低 |
SELECT Name FROM Students WHERE ClassID = “4A” ORDER BY Mark DESC |
2 行 |
| 聚合 |
每班人數與平均分 |
GROUP BY ClassID 配 COUNT 與 AVG |
4A 2 人、4B 2 人、5A 1 人 |
| 解釋 |
為何要正規化 |
消除重複、避免更新異常 |
改一處不用改多處 |
合理性檢查(一定要教):查詢結果行數一定不可以超過表的總行數 5,多過就是漏了 ON 條件。COUNT(*) 的答案一定是整數,出現 73.2 就是把 COUNT 與 AVG 混淆。平均分應該在最低分 58 與最高分 90 之間,超出範圍就是加錯行。
05 獨立練習三題
| 題目 |
答案 |
想觀察什麼 |
| 4B 班人數 |
2 |
WHERE ClassID = “4B” 再 COUNT |
| 全表平均分 |
73.2 |
AVG(Mark) |
| JOIN 後行數 |
5 |
一對多但每名學生只屬一班 |
06 學生常見錯誤與糾正句
| 錯誤 |
學生通常這樣寫 |
導師這樣說 |
| 漏寫 WHERE 就當已篩選 |
SELECT Name FROM Students 之後以為只有 4A |
「WHERE 係篩選,冇佢就係全表。」 |
| COUNT 與 AVG 混用 |
想數人數卻寫 AVG(*) |
「COUNT 數行,AVG 算平均,兩個唔可以調轉。」 |
| JOIN 漏 ON 條件 |
兩表相乘得 15 行 |
「冇 ON 就係笛卡兒積,行數會爆。」 |
| 把班主任姓名存入 Students |
同一老師名重複多次 |
「重複資料一改就要改好多行,所以拆表。」 |
07 家課建議(直接指到練習卷題號)
08 離場檢查(最後 5 分鐘)
| 題目 |
答案 |
判定 |
| 4A 班人數 |
2 人 |
三題全對=可進正規化 |
| JOIN 後應有幾行 |
5 行 |
答 15 就是漏 ON |
| 全表平均分 |
73.2 |
錯兩題以上=回到第二幕 |
09 導師常問
主鍵可以用姓名嗎?
不理想。姓名會重複亦會改,通常用一個沒有意思的學號或編號做主鍵。
GROUP BY 之後還可以用 WHERE 嗎?
WHERE 在分組前篩選行,分組後要再篩選就用 HAVING,兩者時序不同。
正規化是不是越多層越好?
不是。拆到第三正規化通常夠用,拆得太散查詢要不斷 JOIN,讀取變慢。
立即免費搵導師導師登記 →
本頁為 TutorZone 導師備課指引,內容由 TutorZone 團隊編寫;題目與流程為原創,並非任何學校或出版社的教材。