第1课 了解SQL
依据第5版完整目录覆盖9个节点:以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇
第1课 了解SQL
本页对应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方言分开记录。
学习目标
- 能解释“第1课 了解SQL”的9个正式节点,并把它们连接到“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”主线。
- 能复现样例库对象字典、主键检查和跨DBMS环境卡,保存样例数据、SQL、预期结果、实际结果、错误和版本。
- 能比较至少两种DBMS的语法与行为,证明“每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象”。
- 能设计反例推翻“把数据库、DBMS和表混为一谈,或者把显示顺序误认为数据本身的固有顺序”,并给出可重放修复和回退条件。
从结果问题开始
先预测结果合同:需要哪些列、哪些行、是否去重、NULL如何处理、按什么顺序、预计多少行。再写SQL,并在至少一个边界样本上推翻错误查询。SQL声明的是结果,不保证存储顺序,也不会自动替你定义业务口径。
学习合同与证据
↡用于以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇的第1个核心概念;必须用样例数据、结果和失败边界定义、↡用于以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇的第2个核心概念;必须用样例数据、结果和失败边界定义、↡用于以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇的第3个核心概念;必须用样例数据、结果和失败边界定义、↡用于以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇的第4个核心概念;必须用样例数据、结果和失败边界定义、↡用于以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇的第5个核心概念;必须用样例数据、结果和失败边界定义 构成本页的核心词汇。主线是“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”,交付物是样例库对象字典、主键检查和跨DBMS环境卡。最小不变量是:每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象。每次实验都记录DBMS名称与版本、样例脚本版本、会话设置和完整结果,避免同一句语句因方言或数据不同而无法比较。
第5版目录逐节点映射
1.1 数据库基础
节点合同 1/9 · 定义输入。 先说明“1.1 数据库基础”改变的是列、行、组、对象还是事务状态,再把它接入“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象”为准;只背关键字而无法用样例表证明结果,不算掌握。
1.1.1 数据库
节点合同 2/9 · 预测行集。 先说明“1.1.1 数据库”改变的是列、行、组、对象还是事务状态,再把它接入“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象”为准;只背关键字而无法用样例表证明结果,不算掌握。
1.1.2 表
节点合同 3/9 · 构造SQL。 先说明“1.1.2 表”改变的是列、行、组、对象还是事务状态,再把它接入“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象”为准;只背关键字而无法用样例表证明结果,不算掌握。
1.1.3 列和数据类型
节点合同 4/9 · 核对结果。 先说明“1.1.3 列和数据类型”改变的是列、行、组、对象还是事务状态,再把它接入“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象”为准;只背关键字而无法用样例表证明结果,不算掌握。
1.1.4 行
节点合同 5/9 · 注入失败。 先说明“1.1.4 行”改变的是列、行、组、对象还是事务状态,再把它接入“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象”为准;只背关键字而无法用样例表证明结果,不算掌握。
1.1.5 主键
节点合同 6/9 · 比较方言。 先说明“1.1.5 主键”改变的是列、行、组、对象还是事务状态,再把它接入“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象”为准;只背关键字而无法用样例表证明结果,不算掌握。
1.2 什么是SQL
节点合同 7/9 · 定义输入。 先说明“1.2 什么是SQL”改变的是列、行、组、对象还是事务状态,再把它接入“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象”为准;只背关键字而无法用样例表证明结果,不算掌握。
1.3 动手实践
节点合同 8/9 · 预测行集。 先说明“1.3 动手实践”改变的是列、行、组、对象还是事务状态,再把它接入“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象”为准;只背关键字而无法用样例表证明结果,不算掌握。
1.4 小结
节点合同 9/9 · 构造SQL。 先说明“1.4 小结”改变的是列、行、组、对象还是事务状态,再把它接入“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”。执行前写出结果列、预计行数、排序、NULL和重复值口径;执行后保存SQL、输出、影响行数、警告与错误。验收以“每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象”为准;只背关键字而无法用样例表证明结果,不算掌握。
机制推演:集合、结果与方言
第一层是集合语义。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,用同一输入和结果合同运行;若语法不同,分别保存实现。若语义不同,明确无法移植的原因与调用方处理方式,而不是把差异隐藏在注释中。
本章回顾
重新完成“以数据库、表、列、数据类型、行和主键建立关系数据的最小词汇”:先定义结果合同和基数,选择正式目录节点,写最小SQL,加入NULL与重复值反例,核对完整结果,再切换DBMS。最终交付样例库对象字典、主键检查和跨DBMS环境卡,由另一位学习者证明“每行可由稳定主键识别,列值服从数据类型,所有SQL都指向已确认的数据库对象”。
复习与独立交接
练习
问题 1:为什么“第1课 了解SQL”必须覆盖9个正式节点?
问题 2:本页最小正确性合同是什么?
问题 3:怎样设计能推翻错误SQL的反例?
问题 4:为什么只看前几行输出不够?
问题 5:如何验证跨DBMS可移植性?
问题 6:独立交接至少包含什么?
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 数据库
数据库必须由样例输入、结果集合和失败边界共同定义。
- 表
表必须由样例输入、结果集合和失败边界共同定义。
- 列
列必须由样例输入、结果集合和失败边界共同定义。
- 数据类型
数据类型必须由样例输入、结果集合和失败边界共同定义。
- 主键
主键必须由样例输入、结果集合和失败边界共同定义。