CalcGuide · 技术博客主页 / 一页纸学习计划
🔥极高

关系模型与 SQL:从 SELECT 到 JOIN

分类:计算机基础 · 路径:docs/topics/relational-model-and-sql/README.md

#database#sql#relational

理解关系代数、SQL 语法、JOIN 类型、聚合与窗口函数

父主题

数据库原理与 SQL:从关系模型到事务隔离

子主题(0)

关系模型与 SQL:从 SELECT 到 JOIN

0. 元信息

1. 学习路线

关系定义 → SQL 表达式 → JOIN → 聚合 → 窗口函数

2. 阶段周数分配

本子主题按实验推进,不固定周数。每完成一个概念就留下 SQL、输入数据、输出和解释。

3. 九阶段表(精简)

阶段核心知识实践产出学会标准
1. 建模relation、tuple、attribute、key、NULL、JOIN、aggregation、window概念图与最小 schema能说清每个概念解决什么问题
2. 实验PostgreSQL 行为、错误与边界可重跑 SQL能预测正常和异常结果
3. 对照MySQL/SQLite 差异差异表能区分标准语义和实现行为
4. 工程版本、数据规模、可观测输出技术报告能用证据解释选择

4. 第一周任务

精简版不固定 Day 1~7。执行约定是 PostgreSQL 16+、psql -v ON_ERROR_STOP=1、脚本可在空库重复运行。

5. 阶段通用验收

以 §3 的可观察标准和 §9.4 题目为验收。

6. 最终验收

独立完成一份最小实验、三组数据、一份解释和一次 PostgreSQL/MySQL 行为对照。

7. 综合项目

并入父主题“小型电商数据库”,本子主题负责 SQL 查询正确性 的设计、实验与报告。

本主题贡献

交付物清单

  1. sql/01_schema.sql:5 张核心表 DDL,约束覆盖 PK / UK / FK / CHECK,建索引 ≥ 8 条,附 SELECT version() 输出;
  2. sql/02_select_joins.sql:≥ 25 条 SELECT 含 JOIN 的用例,覆盖 INNER / LEFT / CROSS / SELF 与 WHERE / HAVING,含 bag 与 NULL 边界用例(NOT IN (NULL)count(*) vs count(col)WHERE col = NULL);
  3. sql/03_window.sql:≥ 8 条窗口函数用例(ROW_NUMBER / RANK / DENSE_RANK / LAG / LEAD / NTILE / SUM() OVER / AVG() OVER)+ 边界用例(PARTITION BY 单分组、frame 子句);
  4. reports/pg_vs_mysql.md:≥ 3 条 SQL 在 PostgreSQL 16+ 与 MySQL 8.4 下的差异(如 INSERT ... ON CONFLICT vs INSERT IGNOREFILTER (WHERE …) vs 反连接、GROUP BY 隐式列、字符序与 UTF8 默认 collation)。

验收标准

8. 推荐资料

见 §9.3。先用 PostgreSQL 官方文档和课程实验,书用于补理论。

9. 学习资料汇聚(v0.3 自包含)

9.1 背景与动机

Codd 关系模型、SQL 与关系代数之间的差异。真实系统还要处理数据规模、失败和并发。我们用 PostgreSQL 实验观察语义,再用 MySQL 核对实现差异。

9.2 概念地图

flowchart LR
  A[需求与数据] --> B[关系与约束]
  B --> C[SQL]
  C --> D[Planner / Transaction]
  I[Index / Statistics] --> D
  D --> E[执行与并发]
  E --> F[结果 / 延迟 / 锁等待]
  F --> G[验证与修改]
  G --> C

核心概念:relation、tuple、attribute、key、NULL、JOIN、aggregation、window。图中从业务不变量出发,经 SQL、计划或事务到可观察结果,再用相同数据验证修改。

9.3 基础知识讲解

9.3.1 经典论文

资料贡献读法
Codd, A Relational Model of Data for Large Shared Data Banks关系模型与 data independence读定义与例子
Selinger et al., Access Path Selection in a Relational DBMS成本优化器对照 EXPLAIN
Gray et al., Granularity of Locks and Degrees of Consistency锁与一致性画锁兼容和事务 schedule

9.3.2 经典书籍

侧重用法
Silberschatz, Korth & Sudarshan, Database System Concepts全景教材读本子主题对应章
C. J. Date, Database Design and Relational Theory关系理论核对键、依赖与范式
Joe Celko, SQL for Smarties高级 SQL复做集合式查询

9.3.3 优秀博客与文档

资料特点用法
PostgreSQL Documentation权威行为说明查目标版本
Use The Index, LukeMarkus Winand 的索引与 SQL 案例复现实验
MySQL Reference ManualMySQL/InnoDB 对照核对方言和默认值

9.3.4 核心人物

人物影响材料
Edgar F. Codd关系模型1970 论文
C. J. Date关系理论与教学关系理论著作
Andy Pavlo数据库系统教学与研究CMU 15-445 课程

9.3.5 开发与学习方法

方法动作何时用
Query-first先写期望结果和业务不变量正确性设计
Single-variable experiment每次只改一处 SQL、索引或事务设置因果验证
Differential testPostgreSQL 与 MySQL 对跑识别标准与实现差异

课程补充:CMU 15-445 适合数据库实现,Berkeley CS186 适合系统课程与实验。Andy Pavlo 的课堂讲解用于连接论文、实现与计划输出。

9.4 经典问题与经典案例

问题为什么重要最简答案
为什么 SQL 不是纯关系代数防止概念或工程误判SQL 有 bag、NULL、排序等扩展
INNER 与 LEFT JOIN 差在哪防止概念或工程误判LEFT 保留左侧未匹配行
WHERE 和 HAVING 差在哪防止概念或工程误判WHERE 在聚合前,HAVING 在分组后
窗口函数为何不减少行数防止概念或工程误判它对窗口计算并保留输入行
如何避免 JOIN 后重复计数防止概念或工程误判先按目标粒度聚合或修正连接键
NOT IN 为何被 NULL 影响防止概念或工程误判UNKNOWN 会让谓词不为 TRUE

9.5 学习难点

概念难点

难点为什么会卡突破路径
抽象语义与产品实现教材定义和默认行为容易混在一起先写标准概念,再查目标版本文档
多个概念同时影响结果单看 SQL 文本不够画数据、计划或事务时间线
NULL、重复或并发边界正常样例会隐藏问题强制加入边界数据和双会话实验

思维难点

难点为什么会卡突破路径
集合与状态推理容易按应用循环想问题先写结果关系或状态不变量
从相关性到因果改动后变快不代表改动有效固定数据与环境,每次只改一项
正确性与性能并看快结果可能是错结果先断言结果,再比较计划和耗时

工程难点

难点为什么会卡突破路径
数据形状不真实小样本计划没有代表性测规模、选择性、倾斜和 NULL
版本差异默认值与语法会变保存 SELECT version() 和引用日期
实验不可重跑手工操作丢步骤DDL、seed、query、cleanup 全写脚本

9.6 技术标准与接口

9.6.1 Entity

名称主流版本发布组织状态许可证 / 可访问性
PostgreSQL16~18PGDG活跃PostgreSQL License;文档公开
MySQL8.4 LTS / 9.xOracle活跃GPLv2 Community / 商业版
SQLite3.xSQLite Consortium活跃Public Domain
Oracle Database19c / 23aiOracle活跃商业许可
SQL Server2022 / 2025Microsoft活跃商业/Developer
SQLISO/IEC 9075ISO/IEC JTC 1/SC 32持续修订正文通常收费

9.6.2 Scope

本子主题处理 SQL 查询正确性。SQL 标准描述通用语义,产品文档描述 planner、storage、locking 等实现。不要把 PostgreSQL 扩展当成所有数据库的共同保证。

9.6.3 Structure

必须掌握的接口:DDL/DML、约束、SELECT/JOIN、事务控制、EXPLAIN (ANALYZE, BUFFERS)、system catalog 与统计视图。具体重点是:relation、tuple、attribute、key、NULL、JOIN、aggregation、window。

9.6.4 Ecosystem

PostgreSQL 是主实验环境。MySQL 用于 InnoDB 和 optimizer 对照。SQLite 适合单文件实验。Oracle 与 SQL Server 用来了解企业产品的方言、执行计划和并发差异。JDBC、ODBC、DB-API 是常见客户端接口。

9.6.5 Depth Tiers

层级能力可观察标准
L0知道存在能说出核心名词
L1看得懂示例能读 SQL、计划或事务脚本
L2能正确调用能完成正常与边界实验
L3能解释与排错能用结果、计划、锁或日志解释问题并验证修改
L4能设计与扩展能修改优化器、存储或并发控制实现

本计划要求达到 L3

9.6.6 Source

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言
  2. 数据结构与算法
  3. 计算机基础
  4. 工程技术
  5. Web 与后端
  6. 前端与客户端
  7. 数据与人工智能
  8. 项目与职业能力
  9. 安全与可靠性

本计划归属:计算机基础 主 + Web 与后端 辅。


直接依赖(0)

查看知识图谱 · 热度 🔥极高