SQL 与关系型数据库直觉
SQL 用明确语句读取和改变关系数据库。练习时先预测影响范围,再执行并核对行数,尤其是更新和删除。
- 能完成任务记录的新增、查询和更新,并在执行前用条件确认会影响哪些行。
- SELECT、INSERT、UPDATE、DELETE
- 验证SQL 与关系型数据库直觉后,应当能完成任务记录的新增、查询和更新,并在执行前用条件确认会影响哪些行,并保留查询结果、影响行数、迁移记录和缓存命中情况作为可重复检查的依据。
- 完成 6.1「为什么需要数据库」
FOUNDATION
必须理解
SQL(Structured Query Language,结构化查询语言)让你声明想读取或修改什么数据,由关系型数据库决定执行方式。理解表、行、列和关系后,ORM 生成的操作才可解释。
本课依次讲清SELECT、INSERT、UPDATE、DELETE、WHERE、ORDER BY、JOIN 与聚合和约束、索引、事务和唯一性,最后通过“故意使用不存在用户查询空结果,确认不是数据库错误”检查学习结果。
表像格式统一的登记册,行是一条记录,列是一项属性,主键是唯一档案号,外键是指向另一册档案的编号。查询像向档案馆提出条件。
users 表保存用户,tasks 表通过 owner_id 指向用户;SELECT 查询当前用户未完成任务,UPDATE 按 id 与 owner_id 修改状态。
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 可能作用整张表。
这一小节记住:任何修改语句都先确认目标集合,再执行并核对影响行数。
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 也不改变表内物理顺序。
这一小节记住:查询先确定想得到的行与列,再逐步加入连接、筛选、分组和排序。
约束、索引、事务和唯一性
索引像书的目录,找常用内容会快很多,但它也占空间并拖慢写入。事务则保证一组操作要么都成功,要么一起撤销,不留下半成品。
基础概念
约束在数据库层阻止非法数据,索引建立额外查找结构提升特定查询,事务把一组操作作为整体提交或撤销,唯一性保证目标值不重复。
进一步理解
主键、外键、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 让调用方知道是否真的更新了记录。
- UPDATE 只修改 tasks 表中的 done 字段。
- WHERE 同时限制任务 id 与当前用户 id,形成资源归属边界。
- RETURNING 返回确实被更新的记录;空结果可映射为不存在或无权访问。
匹配 id 与 ownerId 时返回一条已完成任务;ownerId 不匹配时影响 0 行,其他用户的记录保持不变。
AI COLLABORATION
AI 如何参与
在SQL 与关系型数据库直觉这一课,AI 负责根据真实材料解释SELECT、INSERT、UPDATE、DELETE并指出遗漏,学习者负责控制范围、执行修改和核对查询结果、影响行数、迁移记录和缓存命中情况。
推荐协作顺序
- 1
先用自然语言告诉 AI 你想查哪几行、改什么字段。
- 2
让它把 SQL 拆成 SELECT 验证和最终修改两步。
- 3
检查参数占位符与 WHERE 后,再在练习数据上执行。
这是表结构和练习数据。请为目标操作写 SQL,并逐句解释读取范围。任何 UPDATE 或 DELETE 先给同条件 SELECT,不使用无条件写操作,不接触生产数据。
每条修改语句都有明确条件,查询考虑用户归属,示例使用参数化而不是字符串拼接;SQL 与关系型数据库直觉的人工验收必须回到真实页面、请求、终端、测试或数据结果,不能用 AI 的文字说明代替。
人工检查清单
- 重点检查 UPDATE/DELETE 的 WHERE、owner_id 权限边界和 SQL 注入风险。
- 让 AI 在每条修改 SQL 前给出等价 SELECT、预计影响行数与事务边界。
- 在测试数据上查看真实返回、约束错误和查询计划,不因语句语法正确就认为安全高效。
COMMON TRAPS
常见误区
下面三类问题会让任务看似完成,却经不起刷新、错误输入或真实环境检查。先看现象,再找原因和修正方法。
无 WHERE 执行更新
- 你会看到
- 整张表的状态被一起修改
- 为什么发生
- 没有筛选条件时,数据库会把更新应用到表中的每一行。
- 怎样纠正
- 先用同条件 SELECT 核对范围
只看语句成功
- 你会看到
- 影响行数远大于预期
- 为什么发生
- SQL 成功只表示语法和执行没有报错,不表示影响范围符合意图。
- 怎样纠正
- 比较预期与实际行数
在生产库直接练习
- 你会看到
- 错误操作影响真实用户数据
- 为什么发生
- 生产数据承载真实业务,误写和误删会立刻影响用户且可能不可逆。
- 怎样纠正
- 使用独立练习数据库和可恢复备份
HANDS-ON
动手任务
能完成任务记录的新增、查询和更新,并在执行前用条件确认会影响哪些行。
- 完成 6.1「为什么需要数据库」
跟着做
- 01
创建本地练习数据库与 users、tasks 表。
- 02
插入一名用户和三条任务。
- 03
用 SELECT 查询未完成任务并排序。
- 04
在事务中更新一条任务,先观察再提交。
- 05
故意使用不存在用户查询空结果,确认不是数据库错误。
能完成任务记录的新增、查询和更新,并在执行前用条件确认会影响哪些行。
为 owner_id、done 组合查询思考索引,并用 EXPLAIN 观察计划,不要求立即优化。
离开本课前,自问四件事
- SELECT、INSERT、UPDATE 与 DELETE 分别改变什么?
- 执行 UPDATE 前怎样用 SELECT 验证目标范围?
- WHERE、JOIN、GROUP BY 和 ORDER BY 各解决什么问题?
- 约束、索引与事务为何不能互相替代?
确认完成后,会同步更新学习中心的课程学习进度。