第3章学习笔记:SQL 基础:从模式到可靠查询
课程笔记掌握 DDL、DML、NULL、约束、排序与分页,让每条 SQL 都能解释结果与边界。
关联:章节 第3章 SQL 基础:从模式到可靠查询
第3章笔记:SQL 基础:从模式到可靠查询
本章不是七个并列名词
掌握 DDL、DML、NULL、约束、排序与分页,让每条 SQL 都能解释结果与边界。 学习顺序从《DDL:把模式写成可执行契约》开始,到《约束失败与可解释错误处理》闭合。每一节都要留下下一节能直接使用的对象:模式、关系、查询结果、页、计划、事务状态、日志记录或部署证据。若你只能逐条背定义,却说不清前一节输出怎样成为后一节输入,这一章还没有真正连起来。
七节依赖与例题
1. DDL:把模式写成可执行契约
要解决的问题: CREATE TABLE 不只是列清单,还应写类型、主键、唯一、检查、外键与删除更新动作。
跟着做: 设计 department 与 employee:employee.dept_id 引用部门,salary 检查非负,email 唯一,入职日期非空。
验收规则: 先声明实体内约束,再声明跨表引用;迁移前必须验证已有数据能满足新约束。
2. INSERT、UPDATE、DELETE 的影响范围
要解决的问题: 写操作必须先用同一谓词做 SELECT 预览,并在事务中检查受影响行数;缺失 WHERE 是工程事故而非语法小错。
跟着做: 把已离职且结清的员工归档:先查询目标主键,开启事务,插入归档表,再按主键删除并比对行数。
验收规则: 安全写入 = 精确谓词 + 行数断言 + 事务 + 可回滚证据。
3. SELECT 的逻辑执行顺序
要解决的问题: SQL 书写顺序不等于逻辑顺序;FROM/ON、WHERE、GROUP BY、HAVING、SELECT、DISTINCT、ORDER BY、LIMIT 依次塑造结果。
跟着做: 不能在同层 WHERE 中直接使用 SELECT 别名,因为过滤发生在投影之前;可改用子查询或重复表达式。
验收规则: FROM→WHERE→GROUP BY→HAVING→SELECT→DISTINCT→ORDER BY→LIMIT。
4. NULL 与三值逻辑
要解决的问题: NULL 表示未知或不适用,不等于 0、空串或任何值;比较结果可能是 UNKNOWN,WHERE 只保留 TRUE。
跟着做: bonus=NULL 的员工不会被 bonus<>0 选中;应按业务意图使用 IS NULL 或 COALESCE,且先说明缺失含义。
验收规则: TRUE、FALSE、UNKNOWN 构成三值逻辑;NOT UNKNOWN 仍是 UNKNOWN。
5. 表达式、CASE 与类型转换
要解决的问题: CASE 把分段业务规则放进查询,CAST 明确类型边界;隐式转换可能让索引失效或产生意外比较。
跟着做: 按成绩区间生成等级时应写互斥且覆盖完整的 CASE,并把 NULL 单独处理,避免落入 ELSE 假装零分。
验收规则: 分段条件应从最严格到最宽或显式互斥,并用边界值逐一反查。
6. ORDER BY、LIMIT 与稳定分页
要解决的问题: 没有 ORDER BY 的结果无承诺顺序;只按非唯一列排序会让分页在并发写入时重复或漏行。
跟着做: 按 created_at 倒序翻页时加入 id 作为稳定次键;大页码可用 (created_at,id) 的游标条件替代 OFFSET。
验收规则: 稳定全序需要排序键组合唯一;键集分页复杂度通常优于大 OFFSET。
7. 约束失败与可解释错误处理
要解决的问题: 应用应区分唯一冲突、外键冲突、检查失败和锁等待,并把数据库错误映射成可行动的业务反馈。
跟着做: 重复注册邮箱应返回‘账号已存在’,而不是笼统 500;重试只适用于瞬态冲突,不能掩盖永久约束错误。
验收规则: 先分类错误是否可重试,再决定回滚、重试或反馈;任何重试都要有次数上限和幂等键。
章内共同推理方法
先写“一行或一个状态代表什么”,再写它必须满足的键、约束、顺序或故障假设。遇到 SQL,先定结果粒度和重复/NULL 语义,再编码;遇到存储与优化,先估算页数、基数和 I/O,再看真实执行计划;遇到事务与分布式,先画时间线和允许历史,再讨论隔离级别、日志或共识。任何公式都要带单位、数据分布和适用边界。
可复现练习
从本章七个例题中任选两个,用 SQLite 或课程给定模型从空环境重做。保存建表/输入、执行步骤、实际输出和断言;随后故意加入一个重复键、NULL、并发交错、崩溃点、倾斜分布或网络分区,记录第一个被破坏的不变量。只截成功界面、只贴 SQL 或只报告耗时不算完成。
闭卷验收
用十分钟画出本章七节箭头图;任选一条箭头解释传递的具体字段、状态或证据。再为《约束失败与可解释错误处理》写一个最小失败案例,并追溯它需要《DDL:把模式写成可执行契约》中的哪条定义才能修复。最后列出三道题:一道唯一答案判断、一道多条件选择、一道必须计算或写 SQL/状态轨迹的问题,且每题都写清为什么其他答案错。