日拱一卒,功不唐捐
数据库学习笔记

前置

  1. Why:为什么需要 DBMS? 文件已经可以保存数据,但当应用需要共享、查询和修改这些数据时,还需要解决下面的问题:

    问题 没有 DBMS 时,应用需要自己处理什么?
    数据完整性 阻止年份被写成无效字符串;避免同一艺人的信息互相矛盾;处理删除艺人后的引用
    数据建模 怎样表达“一张专辑有多位艺人,一位艺人有多张专辑”?
    数据访问与共享 自己解析文件、查找记录、修改记录;多个应用还可能重复实现这些逻辑
    并发访问 两个线程同时修改数据时,避免修改互相覆盖
    崩溃与可靠性 更新到一半机器崩溃,怎样恢复?已经报告保存成功的数据,怎样保证重启后仍然存在?
    存储方式变化 文件格式、数据布局或访问方式改变时,怎样减少对业务代码的影响?
  2. What?:什么是 DBMS? DBMS 是管理数据库的软件,为应用提供定义、创建、查询、修改和管理数据的能力。

    概念 含义 例子
    数据库 Database 被组织、保存的数据集合 学生、课程、选课记录
    数据模型 Data Model 描述数据如何组织、受什么约束、支持哪些操作的概念体系 关系模型、文档模型、键值模型
    数据库管理系统 DBMS 按某种数据模型管理数据的软件 MySQL、PostgreSQL
  3. How:DBMS 怎样组织和操作数据? 第一讲主要从逻辑设计层面回答,以关系模型为例,分成三个方面:

    方面 解决的问题 对应我们的练习
    结构 Structure 数据长什么样? 用 student、course、enrolled 三个关系组织数据;每行是元组,每列是属性,属性有取值域
    完整性 Integrity 什么样的数据才合法? 主键唯一标识记录;外键保证引用有效;其他约束规定非空、取值范围等
    操作 Manipulation 可以怎样查询和修改数据? 选择、投影、并集、交集、差集、笛卡尔积、连接等关系运算

基础概念

  1. 关系数据模型三大概念:

    1. 结构(Structure): 定义关系及其内容,而不依赖它们的物理表示。每个关系都有一组属性,每个属性都有一个取值域(Domain)。
    2. 完整性(Integrity): 保证数据库内容满足特定约束。例如,一个人的年龄不能是负数。
    3. 操作(Manipulation): 提供声明式 API,通过关系,也就是集合,来访问和修改数据库内容。程序员只需指定期望的结果;数据库系统决定执行查询时最有效的计划;
  2. 结构:定义数据如何组织表示

    概念 定义 示例
    关系 Relation 元组组成的无序集合,用来表达一类事实;通常可以对应为一张表 student 表
    元组 Tuple 关系中的一条记录,由各个属性对应的值组成 (1, '张三', 20)
    属性 Attribute 描述数据的一个字段,通常对应表中的一列 sid、name、age
    取值域 Domain 某个属性允许取值的集合或类型范围 age 的值采用整数类型
    n 元关系 n-ary Relation 具有 n 个属性的关系 student(sid, name, age) 是三元关系
    关系模式 Relation Schema 对关系名称、属性及其取值域等结构的定义 定义 student 有哪些列、各列是什么类型
  3. 完整性:规定什么样的数据状态是合法的。

    约束 作用 示例
    主键 Primary Key 唯一标识关系中的一个元组;主键值必须唯一且非 NULL student.sid
    外键 Foreign Key 约束记录之间的引用,保证参照完整性 enrolled.sid 引用 student.sid
    唯一约束 UNIQUE 要求指定属性或属性组合的值具有唯一性;NULL 的处理依数据库规则而定 student.login
    非空约束 NOT NULL 要求属性必须有值,不能为 NULL course.name
    检查约束 CHECK 要求属性值或一条记录满足指定条件 CHECK (age >= 0)
  4. 数据操纵语言(Data Manipulation Languages,DML):

    1. 声明式;(只表明结果,不表明过程)

      1
      2
      3
      4
      SELECT:查询
      INSERT:插入
      UPDATE:修改
      DELETE:删除
    2. 关系代数:定义了关系上的基本运算。每个运算接收一个或多个关系作为输入,输出一个新的关系;

      运算 定义与作用 记法
      选择 Selection 保留满足条件的元组,即筛选行 σ条件(R)
      投影 Projection 保留指定属性,即选择列;经典关系代数会去除重复结果 π属性列表(R)
      并集 Union 返回至少出现在一个输入关系中的元组 R ∪ S
      交集 Intersection 返回同时出现在两个输入关系中的元组 R ∩ S
      差集 Difference 返回出现在 R 中、但没有出现在 S 中的元组 R − S
      笛卡尔积 Cartesian Product 将两个输入关系的元组全部两两组合 R × S
      连接 Join 按匹配规则组合两个关系中的元组 R ⋈ S 或带条件的连接记法

lecture 02

  1. 查看表结构

    1
    2
    3
    SHOW TABLES;
    DESCRIBE student;
    SELECT * FROM course;
  2. 基础查询

    1
    2
    3
    4
    5
    6
    7
    8
    SELECT ...
    FROM ...
    JOIN ... ON ...
    WHERE ...
    GROUP BY ...
    HAVING ...
    ORDER BY ...
    LIMIT ...;
    需求 写法
    等于、不等于 =、<>,不等于也可以用 !=
    同时满足、满足任意一个 AND、OR
    值为空、不为空 IS NULL、IS NOT NULL
    字符串模式匹配 LIKE
    任意长度的字符,包括零个 %
    恰好一个字符 _
    属于、不属于某个结果集合 IN、NOT IN
  3. 聚合与NULL:统计“行数”还是“有值的数量”

    表达式 含义 本轮学生表的结果
    COUNT(*) 统计行数 6
    COUNT(gpa) 统计 GPA 非 NULL 的行数 5
    AVG(gpa) 对非 NULL 的 GPA 求平均 3.50
    MAX(gpa) 最大的非 NULL GPA 3.90
    MIN(gpa) 最小的非 NULL GPA 2.80
  4. JOIN:连接方向、匹配条件与计数列;

    写法 结果含义
    CROSS JOIN 两边记录的所有组合
    JOIN ... ON ... 保留满足连接条件的组合
    LEFT JOIN ... ON ... 保留匹配结果,也保留未匹配的左表行,右侧字段补 NULL
  5. 子查询:区分“一个值”“一组值”“有没有行”

    用法 子查询提供什么
    gpa > (SELECT AVG(...)) 一个值,用于比较
    sid IN (SELECT sid ...) 一组值,用于判断归属
    EXISTS (SELECT ...) 判断是否至少返回一行
    FROM (SELECT ...) AS t 一张结果表,供外层继续查询
  6. CTE 与窗口函数:保留明细,再计算排名

    1
    2
    3
    4
    5
    WITH result_name AS (
    SELECT ...
    )
    SELECT ...
    FROM result_name;
    对比 GROUP BY 聚合 窗口中的 PARTITION BY
    每行代表什么 一个组 一条原始明细
    是否保留个人记录 汇总成每组一行 保留
    典型需求 每门课程有多少人 每个学生在课程中的名次
Google SRE 学习笔记
软件设计的哲学
© 2025–2026 Zhe-MingC
Powered by hexo | Theme is dewjo