LESSON 6.2 / DATABASE & STATE

SQL 与关系型数据库直觉

SQL 用明确语句读取和改变关系数据库。练习时先预测影响范围,再执行并核对行数,尤其是更新和删除。

预计阅读约 25 到 40 分钟
完成结果能完成任务记录的新增、查询和更新,并在执行前用条件确认会影响哪些行。
本课目标
  • 能完成任务记录的新增、查询和更新,并在执行前用条件确认会影响哪些行。
  • SELECT、INSERT、UPDATE、DELETE
  • 验证SQL 与关系型数据库直觉后,应当能完成任务记录的新增、查询和更新,并在执行前用条件确认会影响哪些行,并保留查询结果、影响行数、迁移记录和缓存命中情况作为可重复检查的依据。
开始之前
  • 完成 6.1「为什么需要数据库」
01

FOUNDATION

必须理解

SQL(Structured Query Language,结构化查询语言)让你声明想读取或修改什么数据,由关系型数据库决定执行方式。理解表、行、列和关系后,ORM 生成的操作才可解释。

本课依次讲清SELECT、INSERT、UPDATE、DELETE、WHERE、ORDER BY、JOIN 与聚合和约束、索引、事务和唯一性,最后通过“故意使用不存在用户查询空结果,确认不是数据库错误”检查学习结果。

先建立整体直觉

表像格式统一的登记册,行是一条记录,列是一项属性,主键是唯一档案号,外键是指向另一册档案的编号。查询像向档案馆提出条件。

贯穿本课的实际场景

users 表保存用户,tasks 表通过 owner_id 指向用户;SELECT 查询当前用户未完成任务,UPDATE 按 id 与 owner_id 修改状态。

概念 1

SELECT、INSERT、UPDATE、DELETE

先用白话理解

关系型数据库用表来组织结构,每一行是一条记录。主键像唯一档案号,外键则把这条记录和另一张表里的记录连起来。

基础概念

SQL(Structured Query Language,结构化查询语言)用声明式语句描述要读取或改变的数据。SELECT 查询,INSERT 新增,UPDATE 修改,DELETE 删除。

进一步理解

声明式表示你说明目标集合,数据库选择执行方式。列名、表名和条件共同决定范围,修改语句会真实改变持久数据。

执行 UPDATE 或 DELETE 前,先用相同 WHERE 做 SELECT,检查行数和具体记录;生产修改还应放入事务并准备回退。

放进实际场景

先查询 `owner_id` 与任务 id 同时匹配的记录,再更新 done;返回影响行数为 0 时,说明不存在或不属于当前用户。

容易混淆的地方

DELETE 与“从页面隐藏”不同,前者改变数据库;没有 WHERE 的 UPDATE/DELETE 可能作用整张表。

这一小节记住:任何修改语句都先确认目标集合,再执行并核对影响行数。

概念 2

WHERE、ORDER BY、JOIN 与聚合

先用白话理解

SELECT 负责查,INSERT 负责新增,UPDATE 用来改,DELETE 用来删。WHERE 决定到底作用在哪几行,忘记它可能一下改完整张表。

基础概念

WHERE 筛选行,ORDER BY 排序,JOIN 按关系组合多张表,聚合函数把多行计算成计数、总和或平均等结果。

进一步理解

执行顺序的直觉是先确定来源和连接,再筛选,随后分组聚合,最后选择输出与排序。实际优化由数据库负责。

JOIN 条件缺失会产生大量组合行;聚合与普通列混用通常需要 GROUP BY。NULL 代表缺失值,比较时有专门语义。

放进实际场景

统计每个项目未完成任务数:连接 projects 与 tasks,筛选 done=false,按项目分组 count,并按数量降序。

容易混淆的地方

JOIN 不是把两张表永久合并,查询结束后原表仍独立;ORDER BY 也不改变表内物理顺序。

这一小节记住:查询先确定想得到的行与列,再逐步加入连接、筛选、分组和排序。

概念 3

约束、索引、事务和唯一性

先用白话理解

索引像书的目录,找常用内容会快很多,但它也占空间并拖慢写入。事务则保证一组操作要么都成功,要么一起撤销,不留下半成品。

基础概念

约束在数据库层阻止非法数据,索引建立额外查找结构提升特定查询,事务把一组操作作为整体提交或撤销,唯一性保证目标值不重复。

进一步理解

主键、外键、NOT NULL、CHECK 与 UNIQUE 把关键规则靠近数据执行,即使多个入口写入也要遵守。

索引以存储空间和写入维护换读取速度;事务保证原子性,但并发隔离级别仍影响彼此可见范围。所有字段都加索引会拖慢写入。

放进实际场景

创建任务与增加项目计数放进同一事务;ownerId 外键保证用户存在;常用的 ownerId 与 createdAt 组合查询再评估索引。

容易混淆的地方

事务不是自动撤销业务错误,索引也不是查询越多越快。规则、查询计划和真实负载都需要验证。

这一小节记住:约束保护数据合法,事务保护操作完整,索引服务已证明的重要查询。

带归属边界的更新
运行前先确认
  • 在测试数据库和事务中先用相同 WHERE 执行 SELECT。
  • `$1` 与 `$2` 由数据库客户端作为参数绑定,不用字符串拼接。
UPDATE tasks
SET done = TRUE
WHERE id = $1 AND owner_id = $2
RETURNING id, title, done;
这段代码在做什么

阅读SQL 与关系型数据库直觉示例时,同时限制任务 id 和当前用户 id,RETURNING 让调用方知道是否真的更新了记录。

  1. UPDATE 只修改 tasks 表中的 done 字段。
  2. WHERE 同时限制任务 id 与当前用户 id,形成资源归属边界。
  3. RETURNING 返回确实被更新的记录;空结果可映射为不存在或无权访问。
你应该观察到

匹配 id 与 ownerId 时返回一条已完成任务;ownerId 不匹配时影响 0 行,其他用户的记录保持不变。

02

AI COLLABORATION

AI 如何参与

在SQL 与关系型数据库直觉这一课,AI 负责根据真实材料解释SELECT、INSERT、UPDATE、DELETE并指出遗漏,学习者负责控制范围、执行修改和核对查询结果、影响行数、迁移记录和缓存命中情况。

推荐协作顺序

  1. 1

    先用自然语言告诉 AI 你想查哪几行、改什么字段。

  2. 2

    让它把 SQL 拆成 SELECT 验证和最终修改两步。

  3. 3

    检查参数占位符与 WHERE 后,再在练习数据上执行。

可直接使用的 Prompt
这是表结构和练习数据。请为目标操作写 SQL,并逐句解释读取范围。任何 UPDATE 或 DELETE 先给同条件 SELECT,不使用无条件写操作,不接触生产数据。
应该得到什么

每条修改语句都有明确条件,查询考虑用户归属,示例使用参数化而不是字符串拼接;SQL 与关系型数据库直觉的人工验收必须回到真实页面、请求、终端、测试或数据结果,不能用 AI 的文字说明代替。

人工检查清单

  • 重点检查 UPDATE/DELETE 的 WHERE、owner_id 权限边界和 SQL 注入风险。
  • 让 AI 在每条修改 SQL 前给出等价 SELECT、预计影响行数与事务边界。
  • 在测试数据上查看真实返回、约束错误和查询计划,不因语句语法正确就认为安全高效。
03

COMMON TRAPS

常见误区

下面三类问题会让任务看似完成,却经不起刷新、错误输入或真实环境检查。先看现象,再找原因和修正方法。

误区 1

无 WHERE 执行更新

你会看到
整张表的状态被一起修改
为什么发生
没有筛选条件时,数据库会把更新应用到表中的每一行。
怎样纠正
先用同条件 SELECT 核对范围
误区 2

只看语句成功

你会看到
影响行数远大于预期
为什么发生
SQL 成功只表示语法和执行没有报错,不表示影响范围符合意图。
怎样纠正
比较预期与实际行数
误区 3

在生产库直接练习

你会看到
错误操作影响真实用户数据
为什么发生
生产数据承载真实业务,误写和误删会立刻影响用户且可能不可逆。
怎样纠正
使用独立练习数据库和可恢复备份
04

HANDS-ON

动手任务

能完成任务记录的新增、查询和更新,并在执行前用条件确认会影响哪些行。

准备条件
  • 完成 6.1「为什么需要数据库」

跟着做

  1. 01

    创建本地练习数据库与 users、tasks 表。

  2. 02

    插入一名用户和三条任务。

  3. 03

    用 SELECT 查询未完成任务并排序。

  4. 04

    在事务中更新一条任务,先观察再提交。

  5. 05

    故意使用不存在用户查询空结果,确认不是数据库错误。

完成标志

能完成任务记录的新增、查询和更新,并在执行前用条件确认会影响哪些行。

加餐挑战

为 owner_id、done 组合查询思考索引,并用 EXPLAIN 观察计划,不要求立即优化。

离开本课前,自问四件事

  • SELECT、INSERT、UPDATE 与 DELETE 分别改变什么?
  • 执行 UPDATE 前怎样用 SELECT 验证目标范围?
  • WHERE、JOIN、GROUP BY 和 ORDER BY 各解决什么问题?
  • 约束、索引与事务为何不能互相替代?
完成本课了吗?

确认完成后,会同步更新学习中心的课程学习进度。