學生看得明數據庫圖表,但一到寫 SQL 就把 SELECT 與 WHERE 的內容倒轉,聚合題又忘記 GROUP BY。這一堂把查詢拆成「揀欄、篩列、分組、排序」四個固定位置。
本堂目標 學生能夠:① 講出資料表、記錄、欄位、主鍵的分別,並指出兩表關聯的欄位;② 寫出含 WHERE 條件的 SELECT,正確分辨「揀邊幾欄」與「篩邊幾行」;③ 用 COUNT、AVG、MAX 配合 GROUP BY 做聚合,並用 HAVING 篩分組結果;④ 在 5 分鐘內對本堂 6 行樣本表寫出「4A 班平均分」查詢(答案 77.0)。
01 先備知識(開課前 3 分鐘快檢)
以下任何一項未過關,本堂就會卡住,先補該項:
| 技能 |
快檢題 |
過關標準 |
| 欄位與記錄 |
一行代表一個實體還是屬性? |
答「一個實體」 |
| 主鍵 |
學號可否作主鍵? |
答「可以,唯一且不為空」 |
| 比較運算 |
WHERE mark >= 60 是篩欄還是篩行? |
答「篩行」 |
02 課堂流程(60 分鐘)
| 時間 |
環節 |
導師做什麼 |
學生做什麼 |
| 0–8 分 |
快檢三題 |
抽問記錄、主鍵、WHERE 作用 |
口頭答,錯即補 |
| 8–20 分 |
表結構 |
畫出兩表並標出關聯欄位 |
自行標主鍵 |
| 20–34 分 |
SELECT 與 WHERE |
示範揀欄與篩行,兩者分開講 |
改寫三條查詢 |
| 34–46 分 |
聚合與分組 |
COUNT、AVG 加 GROUP BY、HAVING |
寫一條分組查詢 |
| 46–56 分 |
限時實作 |
三條查詢由淺到深 |
獨立完成不查書 |
| 56–60 分 |
離場檢查 |
按四個位置逐題問 |
自評並圈錯處 |
03 講解腳本(照著說就可以)
第一幕:一句 SELECT 只有四個位置
所有中學階段的查詢都可以拆成四格:SELECT 後面寫「要顯示邊幾欄」,FROM 寫「邊張表」,WHERE 寫「只要邊幾行」,ORDER BY 寫「點排」。學生最常把欄名寫入 WHERE、把條件寫入 SELECT。教的時候要求他們先讀題目問「要顯示甚麼」,把欄名圈起來,再讀「只要符合甚麼條件」,把條件畫線,兩個圈分開之後才落筆寫 SQL,錯誤率會即刻降。
每條題目先要學生講「顯示甚麼」與「條件是甚麼」兩句,講清才准寫。
第二幕:篩行靠比較,字串要引號
WHERE 只做篩行,寫法固定:數值直接比(mark >= 60),字串要加單引號(class = ‘4A’),日期用 YYYY-MM-DD 格式。多個條件用 AND/OR,AND 的優先級高於 OR,混用一定要加括號,否則「4A 或 4B 而及格」會被解讀成完全不同的意思。若要用範圍,BETWEEN 比連續兩個比較清楚。示範時故意寫一條沒有括號的 OR 查詢,讓學生數出多出的行,印象會很深。
要求學生寫完 WHERE 之後口頭讀一次「只要…而且…」,確認意思與題目一致。
第三幕:聚合:先分組,再計數,最後才篩
聚合函數一次只處理一組,所以 GROUP BY 是主角。以本堂樣本表為例:6 行、及格 4 人,4A 班三人平均 77.0,最高分是 S03 的 91 分。要寫「每班平均分」,就要 SELECT class, AVG(mark) FROM … GROUP BY class;要再篩「平均分高過 70 的班」,就用 HAVING 而不是 WHERE,因為 WHERE 在分組之前執行。這一句通常就是整題的關鍵分。
問學生「WHERE 同 HAVING 邊個先跑」,答錯即重講執行次序。
04 必教題型與步驟
| 題型 |
例子 |
步驟 |
答案 |
| 單表篩選 |
列出符合條件的記錄 |
圈欄名 → 寫 WHERE → 檢查引號 |
行數與條件一致 |
| 排序與限行 |
最高分的三人 |
ORDER BY mark DESC + LIMIT 3 |
排序方向正確 |
| 聚合 |
平均分、人數 |
選函數 → GROUP BY 分組欄 |
每組一行 |
| 關聯查詢 |
兩表取資料 |
找出共同欄位 → JOIN … ON |
關聯欄位對得上 |
合理性檢查(一定要教):用樣本表驗算:6 行中及格 60 分以上有 4 人,所以 COUNT 應該回 4;4A 班三人(78、65、88)平均 77.0;全表最高分是 S03 的 91。學生交答案之後,最短的檢查方法是把結果行數與自己數到的行數對比:若查詢回 6 行而題目只要 4 行,通常是漏了 WHERE;若回 1 行而題目要每班一行,就是漏了 GROUP BY。
05 獨立練習三題
| 題目 |
答案 |
想觀察什麼 |
| 列出所有及格學生的學號與姓名(≥60 分) |
4 行 |
有無寫 WHERE mark >= 60 |
| 求 4A 班平均分 |
77.0 |
有無用 AVG + WHERE class |
| 每班最高分 |
4A:88、4B:91 |
有無 GROUP BY class 配 MAX |
06 學生常見錯誤與糾正句
| 錯誤 |
學生通常這樣寫 |
導師這樣說 |
| SELECT 與 WHERE 倒轉 |
SELECT class WHERE mark,把條件寫入 SELECT |
「SELECT 揀欄,WHERE 篩行,你掉轉咗。」 |
| 字串漏引號 |
WHERE class = 4A |
「4A 係字串,要加單引號,唔加資料庫會當佢係欄名。」 |
| 聚合漏 GROUP BY |
SELECT class, AVG(mark) 而無 GROUP BY |
「你要每班一行,就要先分組,唔係只會得一行總平均。」 |
| WHERE 當 HAVING 用 |
WHERE AVG(mark) > 70 |
「WHERE 喺分組前跑,聚合結果要用 HAVING 篩。」 |
07 家課建議(直接指到練習卷題號)
08 離場檢查(最後 5 分鐘)
| 題目 |
答案 |
判定 |
| 四個位置 |
SELECT/FROM/WHERE/ORDER BY |
講不出:重教第一幕 |
| 篩行語法 |
數值直接比、字串加引號 |
漏引號即重寫 |
| 聚合次序 |
WHERE → GROUP BY → HAVING |
倒轉即回第三幕 |
09 導師常問
一定要用大寫關鍵字嗎?
SQL 不分大小寫,但慣例大寫關鍵字、小寫欄名,考試時較易給分。
JOIN 一定要寫 ON 嗎?
要,ON 指定兩表哪一欄相等,漏了就會變成笛卡兒積,行數暴增。
COUNT(*) 與 COUNT(欄名) 有分別嗎?
有,COUNT(欄名) 不計 NULL,COUNT(*) 計所有行。
立即免費搵導師導師登記 →
本頁為 TutorZone 導師備課指引,內容由 TutorZone 團隊編寫;題目與流程為原創,並非任何學校或出版社的教材。