設想一個教學場景:你想找出尚未提交作業的學生,請 AI 幫忙寫了一段 SQL。程式順利運行,螢幕上出現一份整齊的名單。
沒有報錯,列名也對得上。你正準備發出提醒,卻發現一位根本沒有提交記錄的學生,沒有出現在結果裡。
問題可能藏在連接方式中。查詢只保留了兩張表裡能夠匹配的記錄,那個「還沒有記錄的人」,從一開始就被排除在外。
這類錯誤很安靜。資料庫完成了你寫下的操作,真正需要檢查的,是這些操作有沒有表達你原本的意思。
香港理工大學 DSAI2202《Database Principles》(資料庫原理)涉及資料建模、SQL、交易管理與資料庫安全等內容。帶著「結果為什麼少了一個人」這樣的問題進入課程,抽象的概念便有了可以追查的線索。PolyU 官方課程說明
名單裡沒有他,是沒有記錄,還是沒有這個人?
先把開頭的例子縮小。
學生表裡有三個人:阿明、小欣、阿傑。提交表裡只有阿明和小欣的記錄,阿傑尚未提交。
如果先用內連接把兩張表拼起來,再尋找「沒有提交」的學生,阿傑已經不在中間結果裡了。後面的篩選再仔細,也找不回一個早先被排除的人。
一種思路是從完整的學生名單出發,保留每一位學生,再檢查是否存在對應的提交記錄。左連接可以幫助表達這種關係,但還要繼續核對作業範圍、匹配欄位和後續篩選條件。換一個連接詞,並不自動保證答案正確。PostgreSQL 官方連接教學
在 EvoClass 的 Lab 7:跨關係推理 中,學習者核對學生註冊名單與學習平台名單,觀察不同連接方式如何保留或排除記錄。
這裡值得練習的,是在寫查詢之前先說清楚:結果中的一行代表誰?哪些人必須保留?找不到匹配記錄時,意味著什麼?
有了這幾句話,SQL 才有一個可以對照的目標。
查詢之前,先決定怎樣記錄世界
繼續看這份名單。一個學生可能選多門課,一門課可能有多份作業,每份作業又可能允許多重提交。
如果把它們全部塞進一張大表,姓名、課程名和教師資訊就可能反覆出現。改了其中一處,其他地方卻還留著舊值;統計學生人數時,又可能把同一個人重複算進去。
這時,問題已經發生在查詢之前:表裡的每一行究竟在記錄什麼?
Lab 2:從現實世界到 PostgreSQL 資料表 從平面表格的冗餘與更新問題進入關聯式資料庫設計,Lab 9:規範化報名表 則進一步涉及規範化。
可以先用紙筆做一個小練習:把「學生」「課程」「選課關係」分別寫在三張紙上,再說明它們怎樣連接。一個學生轉了主修,需要改哪裡?一門新課還沒有人選,能不能先記錄下來?
這些追問讓資料結構接受日常變化的檢驗。表拆得是否合適,要看它能不能清楚表達關係,並在修改時保持一致。
回到開頭的查詢,你也會更容易判斷:眼前多出來的幾行,是幾位不同的學生,還是同一位學生的幾次提交?
一條語句正確,整個操作仍可能只完成一半
查出結果之後,系統往往還要修改資料。
例如,一位學生申請換班,需要從原班移出,再加入新班。假如第一步已經儲存,第二步卻因故失敗,學生可能暫時不屬於任何一個班。分開看兩條語句,它們都可能寫得正確;合起來看,系統卻留下了一個不完整的狀態。
交易為這種問題提供了基本工具:把需要共同完成的步驟組織起來,讓它們作為一個整體提交,或在失敗時撤銷。這個「整體」怎樣劃定,仍然需要理解具體任務。PostgreSQL 官方交易教學
Lab 10 的交易與並發實驗 將主題推進到交易邊界與並發控制,以選課登記台的名額處理為背景,觀察兩個工作階段同時操作時會發生什麼。
練習時,可以在兩步操作之間主動製造一次失敗,再查看資料庫究竟留下了什麼。接著讓兩個工作階段同時操作同一份資料,觀察原先順暢的步驟是否還成立。
一次實驗由此多了一層意義:除了看到事情怎樣成功,也要知道它會怎樣失敗。
請 AI 寫 SQL 之後,自己負責驗證什麼?
有了前面的經歷,再看 AI 給出的查詢,關注點會發生變化。
開頭那份漏人的名單,可以用三條虛構學生記錄檢查;重複計數的問題,可以加入一位有兩次提交的學生再檢查;換班操作,則可以在中途失敗時檢查資料狀態。
這些小例子為判斷提供了依據。解釋寫得流暢,不能代替對結果的核對。
Lab 12:驗證 AI 生成的 SQL 將審查納入練習:能運行嗎?回答了問題嗎?可能破壞什麼?誰有權運行它?
學習者可以沿著一個具體任務逐步追問:這段查詢會保留哪些記錄?修改會影響多少行?如果預期只改一個人,怎樣在執行前發現範圍寫錯了?工具擁有修改權限,又是否意味著當前任務允許它這樣做?
對於正在接觸關聯式資料庫、或已經開始借助 AI 寫查詢的人,EvoClass 的 DSAI2202 課程入口 提供了從基礎操作繼續深入的路徑。可以先準備一組自己能夠手工核對的小資料,再帶著預期結果進入練習。
下一次螢幕上出現一份整齊的名單時,先找一找那個最容易被遺漏的人。
能夠說明他為什麼出現、為什麼缺席,你才開始知道,這個答案是否值得相信。
課程定位依據 PolyU 官方課程說明,實驗介紹依據 EvoClass 當前課件。文中課時連結指向簡體中文學習材料。名單、作業提交與換班情境均為幫助理解概念而構造的教學示例,不是學生案例或使用效果記錄。