第2课 检索数据

依据第5版完整目录覆盖9个节点:用SELECT精确声明目标列、去重、限制结果和注释

第2课 检索数据

本页对应Ben Forta《SQL in 10 Minutes a Day》第5版及钟鸣、刘晓霞译《SQL必知必会》第5版,人民邮电出版社2020年8月出版,239页,ISBN 9787115539168。课程依据原版出版社完整目录与中文版目录交叉核对后独立重构,不复制原文;正式分母为22课、4个附录与常用语句速查,另设学习地图和总复习,共24页。

这不是MySQL专册。原书以可跨数据库理解的SQL为主,同时提醒函数、限制行、拼接、过程、游标等存在DBMS差异。本课程统一使用Customers、Vendors、Products、Orders和OrderItems样例模型;标准写法与DB2、MariaDB/MySQL、SQL Server、Oracle、PostgreSQL、SQLite方言分开记录。

学习目标

  • 能解释“第2课 检索数据”的9个正式节点,并把它们连接到“用SELECT精确声明目标列、去重、限制结果和注释”主线。
  • 能复现SELECT结果合同、列投影对照和限制语法方言表,保存样例数据、SQL、预期结果、实际结果、错误和版本。
  • 能比较至少两种DBMS的语法与行为,证明“结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义”。
  • 能设计反例推翻“在应用接口中长期使用SELECT星号,或把LIMIT、TOP、FETCH FIRST当成通用标准写法”,并给出可重放修复和回退条件。

从结果问题开始

先预测结果合同:需要哪些列、哪些行、是否去重、NULL如何处理、按什么顺序、预计多少行。再写SQL,并在至少一个边界样本上推翻错误查询。SQL声明的是结果,不保证存储顺序,也不会自动替你定义业务口径。

学习合同与证据

构成本页的核心词汇。主线是“用SELECT精确声明目标列、去重、限制结果和注释”,交付物是SELECT结果合同、列投影对照和限制语法方言表。最小不变量是:结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义。每次实验都记录DBMS名称与版本、样例脚本版本、会话设置和完整结果,避免同一句语句因方言或数据不同而无法比较。

第5版目录逐节点映射

2.1 SELECT语句

节点合同 1/9 · 定义输入。 先说明“2.1 SELECT语句”改变的是列、行、组、对象还是事务状态,再把它接入“用SELECT精确声明目标列、去重、限制结果和注释”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义”为准;只背关键字而无法用样例表证明结果,不算掌握。

2.2 检索单个列

节点合同 2/9 · 预测行集。 先说明“2.2 检索单个列”改变的是列、行、组、对象还是事务状态,再把它接入“用SELECT精确声明目标列、去重、限制结果和注释”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义”为准;只背关键字而无法用样例表证明结果,不算掌握。

2.3 检索多个列

节点合同 3/9 · 构造SQL。 先说明“2.3 检索多个列”改变的是列、行、组、对象还是事务状态,再把它接入“用SELECT精确声明目标列、去重、限制结果和注释”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义”为准;只背关键字而无法用样例表证明结果,不算掌握。

2.4 检索所有列

节点合同 4/9 · 核对结果。 先说明“2.4 检索所有列”改变的是列、行、组、对象还是事务状态,再把它接入“用SELECT精确声明目标列、去重、限制结果和注释”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义”为准;只背关键字而无法用样例表证明结果,不算掌握。

2.5 检索不同的值

节点合同 5/9 · 注入失败。 先说明“2.5 检索不同的值”改变的是列、行、组、对象还是事务状态,再把它接入“用SELECT精确声明目标列、去重、限制结果和注释”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义”为准;只背关键字而无法用样例表证明结果,不算掌握。

2.6 限制结果

节点合同 6/9 · 比较方言。 先说明“2.6 限制结果”改变的是列、行、组、对象还是事务状态,再把它接入“用SELECT精确声明目标列、去重、限制结果和注释”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义”为准;只背关键字而无法用样例表证明结果,不算掌握。

2.7 使用注释

节点合同 7/9 · 定义输入。 先说明“2.7 使用注释”改变的是列、行、组、对象还是事务状态,再把它接入“用SELECT精确声明目标列、去重、限制结果和注释”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义”为准;只背关键字而无法用样例表证明结果,不算掌握。

2.8 小结

节点合同 8/9 · 预测行集。 先说明“2.8 小结”改变的是列、行、组、对象还是事务状态,再把它接入“用SELECT精确声明目标列、去重、限制结果和注释”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义”为准;只背关键字而无法用样例表证明结果,不算掌握。

2.9 挑战题

节点合同 9/9 · 构造SQL。 先说明“2.9 挑战题”改变的是列、行、组、对象还是事务状态,再把它接入“用SELECT精确声明目标列、去重、限制结果和注释”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义”为准;只背关键字而无法用样例表证明结果,不算掌握。

机制推演:集合、结果与方言

第一层是集合语义。FROM确定候选行源,WHERE过滤行,GROUP BY形成组,HAVING过滤组,SELECT计算输出列,DISTINCT去重,ORDER BY最后建立显示顺序。虽然优化器可以改变物理执行方式,但不能改变合法SQL的结果语义。定位错误时先找口径属于哪一层,避免靠不断追加条件碰运气。

第二层是基数。单表过滤、子查询、联结和分组都会改变行数。写SQL前估算最小、典型和最大行数;执行后核对总行数、主键去重数与关键金额。多表联结尤其要标注一对一、一对多和多对多,否则重复行可能在聚集时放大,却仍给出看似合理的数字。

第三层是NULL与三值逻辑。未知值既不等于普通值,也不等于另一个NULL。比较、NOT IN、外联结、聚集和字符串拼接都可能传播或忽略NULL。每课至少保留一个NULL样本,并明确结果是TRUE、FALSE还是UNKNOWN;缺少这一项,查询只能在理想数据上成立。

第四层是方言账本。LIMIT、TOP和FETCH FIRST,双竖线、加号和CONCAT,日期函数、过程体、游标、触发器和标识符引用都有差异。先写语义合同,再为目标DBMS实现语法;迁移时保持数据与期望结果不变,一次替换一个方言点,记录不支持、改写和回退。

证据解释

数据证据证明输入一致。保存建表脚本、插入脚本、表行数、主键去重数和关键外键计数。相同SQL在不同数据上得到不同结果毫无可比性;样例数据一旦变化,先更新基线而不是修改查询迎合新输出。

结果证据证明口径正确。对查询保存列、行、顺序、NULL和重复值;对写入保存前后快照和影响行数;对DDL保存元数据与依赖。用独立对账查询验证总数、分组数和金额,不让待测SQL自己证明自己。

失败证据证明边界有效。准备空集、NULL、重复键、孤立引用、一对多放大、权限拒绝和事务回滚样本。预期失败要记录错误码或状态;意外成功通常意味着约束、谓词、权限或事务边界缺失。

方言证据证明可移植范围。至少选择两种DBMS,用同一输入和结果合同运行;若语法不同,分别保存实现。若语义不同,明确无法移植的原因与调用方处理方式,而不是把差异隐藏在注释中。

本章回顾

重新完成“用SELECT精确声明目标列、去重、限制结果和注释”:先定义结果合同和基数,选择正式目录节点,写最小SQL,加入NULL与重复值反例,核对完整结果,再切换DBMS。最终交付SELECT结果合同、列投影对照和限制语法方言表,由另一位学习者证明“结果列由投影显式确定,DISTINCT作用于完整行,限制语法不改变查询含义”。

复习与独立交接

练习

问题 1:为什么“第2课 检索数据”必须覆盖9个正式节点?

问题 2:本页最小正确性合同是什么?

问题 3:怎样设计能推翻错误SQL的反例?

问题 4:为什么只看前几行输出不够?

问题 5:如何验证跨DBMS可移植性?

问题 6:独立交接至少包含什么?

名词解释

本章出现的专业名词,用大白话再讲一遍。

SELECT

SELECT必须由样例输入、结果集合和失败边界共同定义。

投影

投影必须由样例输入、结果集合和失败边界共同定义。

DISTINCT

DISTINCT必须由样例输入、结果集合和失败边界共同定义。

结果限制

结果限制必须由样例输入、结果集合和失败边界共同定义。

注释

注释必须由样例输入、结果集合和失败边界共同定义。

← 上一页:第1课 了解SQL · 下一页:第3课 排序检索数据 →

资料与写作方式声明

本章以《SQL必知必会》第5版权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…