闭卷说明“内连接与外连接的保留侧”的对象、成立条件和一个失败反例。
数据库系统 · 小纸条
选一章打印。双面打印(按长边翻页)后沿虚线剪开,每张卡片正面题目、背面答案。
闭卷说明“多表连接与重复放大”的对象、成立条件和一个失败反例。
闭卷说明“GROUP BY 与 HAVING”的对象、成立条件和一个失败反例。
闭卷说明“相关子查询与 EXISTS”的对象、成立条件和一个失败反例。
闭卷说明“CTE 与递归查询”的对象、成立条件和一个失败反例。
闭卷说明“窗口函数保留明细粒度”的对象、成立条件和一个失败反例。
闭卷说明“综合 SQL:先定义粒度再编码”的对象、成立条件和一个失败反例。
应覆盖:一对多再连接另一张一对多表会产生乘法放大;聚合前必须明确结果粒度并先分别汇总;规则:若 A 对 B 平均 b 条、对 C 平均 c 条,直接三表连接约产生 |A|·b·c 行;并能围绕“订单同时连接订单项和支付记录会把金额重复累加,应先把 item 按 order 汇总、payment 按 order 汇总,再回连订单”给出可执行或可计算的反查。
应覆盖:内连接只保留匹配对,外连接保留指定一侧的未匹配行;把右表过滤写进 WHERE 可能把左连接悄悄变回内连接;规则:外连接过滤右表条件通常放 ON;COUNT(*) 与 COUNT(right.id) 在空匹配组上不同;并能围绕“列出所有课程及选课人数时用 course LEFT JOIN enrollment,并在 COUNT 中数 enrollment 的非空键”给出可执行或可计算的反查。
应覆盖:EXISTS 关心证据是否存在而非返回多少列;相关子查询对外层每个候选绑定参数,优化器常可改写为半连接;规则:EXISTS 子查询的 SELECT 列无语义作用;NOT EXISTS 是可靠的反存在表达;并能围绕“找至少有一门挂科的学生用 EXISTS;找从未挂科用 NOT EXISTS,能自然避开 NOT IN 遇 NULL 的陷阱”给出可执行或可计算的反查。
应覆盖:GROUP BY 定义结果粒度,聚合函数压缩每组;WHERE 过滤原始行,HAVING 过滤聚合后的组;规则:SELECT 中非聚合列必须由分组键函数决定;先写一句‘一行代表什么’;并能围绕“找至少选 3 门且平均分≥85 的学生:WHERE 排除无效成绩,按 student_id 分组,再 HAVING COUNT 与 AVG”给出可执行或可计算的反查。
应覆盖:窗口函数在不折叠行的前提下计算分区排名、累计和与前后值;PARTITION BY 与 ORDER BY 分别定义组和序;规则:窗口值 = f(当前行所属分区及窗口框架),ROWS 与 RANGE 的同值行边界不同;并能围绕“求每个部门薪资前 3 名用 DENSE_RANK;若并列都应保留,不能用任意 LIMIT 3”给出可执行或可计算的反查。
应覆盖:CTE 为复杂查询命名中间关系,递归 CTE 由锚点和递归步组成,并必须保证终止或限制深度;规则:R_0 为锚点,R_{k+1}=step(R_k);到新增集合为空时达到不动点;并能围绕“沿组织树查某经理全部下属:锚点选直接对象,递归步连接 parent_id,额外维护 path 检测脏数据环”给出可执行或可计算的反查。
应覆盖:复杂 SQL 应分阶段写出候选集、事实汇总、资格判断和最终展示,每层都有可单独运行的断言;规则:每个 CTE 写清主键候选、行代表的对象与预期行数,最终再格式化比例;并能围绕“生成月度留存表:先定义 cohort 月,再定义活跃月,计算月份差并按 cohort 聚合;不要直接在事件明细上盲目 COUNT”给出可执行或可计算的反查。