设想一个教学场景:你想找出尚未提交作业的学生,请 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 当前课件。文中课时链接指向简体中文学习材料。名单、作业提交与换班情境均为帮助理解概念而构造的教学示例,不是学生案例或使用效果记录。