数据库考试 知识点汇总

一、数据库系统概述

1.1 数据库系统阶段数据管理的特点 (P5)

特点 说明
结构化 数据及其联系的集合,整体结构化
共享性高、冗余度低 多用户、多应用共享数据
数据独立性高 物理独立性和逻辑独立性
统一管理和控制 由DBMS统一管理,包括安全性、完整性、并发控制、恢复等

1.2 数据库系统的组成 (P7)

四部分:硬件系统、软件系统(DBMS、OS等)、数据库(DB)、数据库用户(DBA、开发者、终端用户)。

image-8a8d9b23

1.3 MySQL自带的系统数据库

数据库名 作用
mysql 存储用户账户、权限等系统信息
information_schema 存储所有数据库的元数据(表名、列名等)
performance_schema 存储性能监控数据

1.4 数据库文件类型

数据库在物理层面由多种文件组成:

文件类型 扩展名 说明
主数据文件 .mdf 包含数据库的启动信息和主要数据,每个数据库有且只有一个
次要数据文件 .ndf 存储主数据文件未包含的数据,可以有多个或没有
日志文件 .ldf 记录所有事务和数据库修改,用于恢复,至少有一个

各文件的作用:

  • 主数据文件 (Primary Data File)
    • 数据库的起点,包含数据库的启动信息
    • 存储系统表和用户数据
    • 每个数据库必须有且只有一个主数据文件
  • 次要数据文件 (Secondary Data File)
    • 用于扩展存储空间
    • 可以将数据分布到多个磁盘上,提高I/O性能
    • 可选,数量不限
  • 日志文件 (Transaction Log File)
    • 记录所有数据库修改操作(事务日志)
    • 用于数据库恢复和事务回滚
    • 支持事务的原子性和持久性
    • 每个数据库至少需要一个日志文件

MySQL的文件结构:

文件类型 说明
.frm 表结构定义文件
.ibd InnoDB表的数据和索引文件
.MYD MyISAM表的数据文件
.MYI MyISAM表的索引文件
redo log 重做日志,用于崩溃恢复
undo log 回滚日志,用于事务回滚
binlog 二进制日志,用于主从复制和数据恢复

二、三级模式与二级映像 (P11)

2.1 三级模式结构

image-a2d95f17
模式 数量 说明
外模式 可有多个 用户视图,描述用户看到的数据结构
模式 只有一个 全局逻辑结构,是所有用户的公共数据视图
内模式 只有一个 存储模式,描述数据的物理结构和存储方式

2.2 二级映像与数据独立性

映像 作用 独立性类型
外模式/模式映像 定义外模式与模式之间的对应关系 逻辑独立性
模式/内模式映像 定义模式与内模式之间的对应关系 物理独立性

核心:通过两层映像实现了数据与程序之间的解耦

diagram-1767728538269-23b5d0e0

三、实体联系与数据模型 (P14)

3.1 联系的定义与分类

定义:现实世界中事物内部或事物之间的联系在信息世界中的反映(即实体集之间的逻辑关系)。

分类

  • 一对一 (1:1):如班长与班级
  • 一对多 (1:n):如班级与学生
  • 多对多 (m:n):如学生与课程(需通过中间表实现)
image-5c0770db

四、关系的完整性 (P32)

完整性类型 定义 作用对象
实体完整性 主码的值不能为空或部分为空 主码
参照完整性 外码值必须是主表中存在的值或为NULL 表间关系
用户自定义完整性 反映具体应用的语义约束条件 具体应用

五、SQL数据定义语言

5.1 数据库操作 (P60)

-- 创建数据库
CREATE DATABASE 数据库名;

-- 修改数据库
ALTER DATABASE 数据库名 ...;

-- 删除数据库(删除整个数据库及其包含的所有表)
DROP DATABASE 数据库名;

-- 查看当前操作的数据库
SELECT DATABASE();

5.2 约束类型

唯一约束 UNIQUE (P70)

特性 说明
允许NULL 最多只允许出现一个NULL值
约束类型 既可作为表约束,又可作为列约束
数量限制 一个表可以有多个UNIQUE约束
字段范围 可定义在多个字段上

主码约束 PRIMARY KEY (P71)

特性 说明
作用 唯一标识每一行记录
NULL值 不能为NULL,不能重复
数量限制 一个表只能定义一个PRIMARY KEY
语法 <字段名> <数据类型> PRIMARY KEY

外码约束 FOREIGN KEY (P72)

特性 说明
作用 在两个表之间建立连接,保证参照完整性
值要求 必须是主表中存在的主码值,或者为NULL
级联选项 ON DELETE CASCADE可自动删除子表相关记录

注意:外键建在""的一方,指向"一"的一方

image-c27fba8c

非空约束 NOT NULL

要求某列的值不能为空。

检查约束 CHECK

CHECK (Price > 0)  -- 价格必须大于0

六、SQL数据操作语言

6.1 数据操作语句

添加数据 (P79)

INSERT INTO 表名(字段1, 字段2...) VALUES(值1, 值2...);
-- 只有当插入全部字段且顺序一致时,才可省略字段名

-- 插入多条数据
INSERT INTO 表名(字段列表) VALUES
(值1, 值2...),
(值1, 值2...);

修改数据 (P80)

UPDATE 表名 SET 字段名 = 新值 WHERE 条件;
-- ⚠️注意:不加WHERE会修改全表!

删除数据 (P81)

DELETE FROM 表名 WHERE 条件;
-- ⚠️注意:不加WHERE会清空全表!

-- 快速清空表(不记录日志,速度更快)
TRUNCATE TABLE 表名;

DELETE vs TRUNCATE

  • DELETE:逐行删除,记录日志,可回滚
  • TRUNCATE:直接清空,不记日志,不可回滚,速度快

七、SQL查询语句 (P85-95)

7.1 查询语法结构

SELECT [DISTINCT] 字段列表
FROM 表名
[WHERE 条件]
[GROUP BY 分组字段]
[HAVING 分组后条件]    -- 必须在GROUP BY之后
[ORDER BY 排序字段 [ASC|DESC]]
[LIMIT n];             -- 限制返回前n行

7.2 条件查询示例 (P88)

  • 比较运算score >= 90
  • 范围查询BETWEEN 30 AND 40(包含边界)
  • 集合查询NOT IN ('c4', 'c6')
  • 模糊查询LIKE '%程序%'(%代表任意个字符,_代表一个字符)
  • 正则匹配REGEXP '正则表达式'
  • 空值判断IS NULL / IS NOT NULL(不能用 = NULL)
-- 比较运算符
SELECT * FROM sc WHERE score >= 90;

-- AND条件
SELECT tno AS 教师号, tn AS 姓名, prof AS 职称
FROM t
WHERE age >= 30 AND age <= 40;

-- BETWEEN...AND
SELECT cno, cn, ct
FROM c
WHERE ct BETWEEN 30 AND 40;

-- NOT IN
SELECT sno, cno, score
FROM sc
WHERE cno NOT IN ('c4', 'c6');

-- LIKE模糊查询
SELECT cno AS 课程号, cn AS 课程名, ct AS 课时
FROM c
WHERE cn LIKE '%程序%';

注意:任何与NULL的比较运算结果都是NULL

7.3 分组查询示例 (P95)

聚合函数COUNT(), SUM(), AVG(), MAX(), MIN()

MIN vs LEAST

  • MIN():聚合函数,用于求一列的最小值
  • LEAST():普通函数,用于求参数列表中的最小值,如 LEAST(10, 2, 5) 返回 2

重点区别:WHERE 筛选行(分组前);HAVING 筛选组(分组后)

-- 统计每门课程选课人数
SELECT cno AS 课程号, COUNT(*) AS 选课人数
FROM sc
GROUP BY cno;

-- HAVING过滤分组
SELECT sno AS 学号, COUNT(*) AS 选课门数
FROM sc
GROUP BY sno
HAVING COUNT(*) >= 3;

-- 排序(DESC降序,ASC升序默认可不写)
SELECT sno, cno, score
FROM sc
WHERE sno = 's2'
ORDER BY score DESC;

-- LIMIT限制行数
SELECT * FROM tb_student LIMIT 30;  -- 显示前30行

7.4 字段别名

SELECT cn AS 课程名 FROM c;
SELECT cn 课程名 FROM c;  -- AS可以省略

7.5 合并查询结果

关键字 说明
UNION 合并结果集,自动去除重复记录
UNION ALL 合并结果集,保留所有记录(含重复)

7.6 运算表达式

SELECT 0 OR (4>3);   -- 结果为 14>3为真即10 OR 1 = 1SELECT 20/5*2;       -- 结果为 8.0000(MySQL除法默认转浮点)

八、连接查询与子查询

8.1 连接查询 vs 子查询

子查询是嵌套的SELECT语句,从内向外逐层执行,结果通常来自一个表,适用于条件值来自其他表的场景,可能执行较慢。

连接查询是多表通过JOIN连接,同时处理多表,结果可来自多个表,适用于需要显示多表字段的场景,通常性能更高。

注意:子查询不仅可以在WHERE子句中,也可以在FROM子句、SELECT列表中使用。

比较项 子查询 连接查询
结构 嵌套的SELECT语句 多表通过JOIN连接
执行方式 从内向外逐层执行 同时处理多表
结果来源 通常来自一个表 可来自多个表
适用场景 条件值来自其他表 需要显示多表字段
性能 可能较慢(多次执行) 通常更高效
image-936c093d

8.2 INNER JOIN vs LEFT JOIN

INNER JOIN是内连接,只返回两表中匹配的记录,不匹配的记录不显示。

LEFT JOIN是左外连接,返回左表所有记录,如果右表没有匹配的记录则显示为NULL。

类型 说明 结果
INNER JOIN 内连接 只返回两表中匹配的记录
LEFT JOIN 左外连接 返回左表所有记录,右表无匹配则为NULL

示例

-- INNER JOIN:只显示有选课记录的学生
SELECT s.sno, s.sn, sc.cno
FROM s INNER JOIN sc ON s.sno = sc.sno;

-- LEFT JOIN:显示所有学生,没选课的也显示(课程号为NULL)
SELECT s.sno, s.sn, sc.cno
FROM s LEFT JOIN sc ON s.sno = sc.sno;
image-59d30bcd

九、视图 (P115-122)

9.1 视图的创建与使用

-- 创建视图(需要CREATE VIEW权限和相关SELECT权限)
CREATE VIEW s_view
AS SELECT * FROM s
WHERE dept = '信息学院';

-- 带检查选项的视图
CREATE VIEW view_name
AS SELECT ...
WITH CHECK OPTION;  -- 更新数据时检查是否满足视图条件

9.2 视图的特点

数据表是实际存储数据的物理结构,占用存储空间,存储真实数据,可直接修改。

视图是虚拟表,只存储查询定义的SQL语句,不存储实际数据,数据动态从基表获取,更新有限制条件。

选择建议:需要永久存储数据用表,需要简化查询、限制访问或提供不同视角时用视图。

比较项 数据表 视图
本质 实际存储数据的物理结构 虚拟表,只存储查询定义
存储 占用物理存储空间 不存储数据,只存SQL语句
数据 真实数据 动态从基表获取
更新 直接修改 有限制条件
用途 永久存储数据 简化查询、控制访问权限
  • 需要存储数据 → 表
  • 简化复杂查询、限制数据访问、提供不同视角 → 视图

9.3 视图更新

可使用 INSERT、UPDATE、DELETE 语句更新视图数据

WITH CHECK OPTION 参数会限制更新操作必须满足视图定义条件

视图定义中若包含以下内容,则不能通过视图修改基表数据:

  • GROUP BY 子句
  • 聚合函数(SUM、COUNT等)
  • DISTINCT 关键字
  • UNION 操作

9.4 查看视图

DESC 视图名;           -- 查看视图结构
SHOW CREATE VIEW 视图名;  -- 查看视图定义

注意:DESC 和 SHOW 查看视图的显示结果不相同


十、索引

索引是提高数据库查询效率的数据结构,类似于书籍的目录。

10.1 索引操作

-- 创建索引
CREATE INDEX idx_title ON Book(Title);
-- 或者
ALTER TABLE Book ADD INDEX idx_title(Title);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_isbn ON Book(ISBN);

-- 创建复合索引(多列索引)
CREATE INDEX idx_name_age ON Student(name, age);

-- 查看索引
SHOW INDEX FROM 表名;

-- 删除索引
DROP INDEX idx_title ON Book;

10.2 聚集索引与非聚集索引

image-db0c4158
特性 聚集索引 (Clustered Index) 非聚集索引 (Non-clustered Index)
物理存储 决定数据在磁盘上的物理存储顺序 不影响数据的物理存储顺序
数量限制 一个表只能有一个 一个表可以有多个
叶子节点 存储实际的数据行 存储指向数据行的指针
查询效率 范围查询效率高 可能需要"回表"操作
默认创建 主键默认创建聚集索引 普通索引默认为非聚集索引

聚集索引 (Clustered Index):

  • 表中数据按照聚集索引的顺序物理存储
  • 就像字典按拼音顺序排列,数据本身就是有序的
  • 一个表只能有一个聚集索引(因为数据只能有一种物理排列方式)
  • InnoDB中,主键默认就是聚集索引

非聚集索引 (Non-clustered Index):

  • 索引和数据分开存储
  • 就像书后的索引,索引指向数据的位置
  • 查询时先找索引,再根据指针找数据(可能需要"回表")
  • 一个表可以有多个非聚集索引

10.3 索引的优缺点

优点:

  • 大大加快数据检索速度
  • 加速表与表之间的连接
  • 使用分组和排序时,可以显著减少时间

缺点:

  • 占用额外的存储空间
  • 增删改操作时需要维护索引,降低写入速度
  • 创建和维护索引需要时间

10.4 索引使用原则

适合创建索引 不适合创建索引
经常用于WHERE条件的列 很少查询的列
经常用于连接的列(外键) 数据值很少的列(如性别)
经常需要排序的列 频繁更新的列
主键列 数据量很小的表

十一、权限管理 (P147)

11.1 权限授予 GRANT

GRANT 权限名称 [(字段列表)]
ON 授权级别及对象
TO '用户名'@'主机信息'
[WITH GRANT OPTION];  -- 允许被授权者继续授权给其他用户

11.2 权限回收 REVOKE

REVOKE 权限名称
ON 授权级别及对象
FROM '用户名'@'主机信息';

11.3 MySQL用户管理基本操作

操作 说明
创建用户 CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';
删除用户 DROP USER '用户名'@'主机';
修改密码 ALTER USER '用户名'@'主机' IDENTIFIED BY '新密码';
授予权限 GRANT 权限 ON 对象 TO 用户;
回收权限 REVOKE 权限 ON 对象 FROM 用户;
查看权限 SHOW GRANTS FOR '用户名'@'主机';

11.4 MySQL中可授予的权限类型

  • 数据操作权限:SELECT, INSERT, UPDATE, DELETE(针对表数据)
  • 数据定义权限:CREATE, ALTER, DROP, INDEX(针对库表结构)
  • 管理权限:CREATE USER, GRANT OPTION, SHUTDOWN, ALL PRIVILEGES(针对服务器管理)

十二、事务 (P156)

12.1 事务的ACID特性

image-708b5cf5
  • A - 原子性 (Atomicity):事务是不可分割的最小工作单位,要么全部成功,要么全部失败回滚
  • C - 一致性 (Consistency):事务执行前后,数据库必须从一个一致性状态变到另一个一致性状态
  • I - 隔离性 (Isolation):并发执行的事务之间互不干扰,一个事务的中间状态对其他事务不可见
  • D - 持久性 (Durability):事务一旦提交,对数据的修改就是永久的,即使系统故障也不会丢失

12.2 事务的标准状态

活动的(Active)、部分提交的、失败的(Failed)、中止的、提交的(Committed)

注意:"挂起的(Pending)"不是事务的标准状态

12.3 并发问题

问题 说明
丢失更新 两事务同时读取同一数据并修改,后提交的覆盖了先提交的修改
脏读 读取到另一事务尚未提交的数据
不可重复读 同一事务内两次读取结果不同
幻读 同一事务内两次查询记录数不同

丢失更新的解决方法:提高事务隔离级别(如可重复读)或使用锁机制

12.4 事务隔离级别

隔离级别 说明
READ UNCOMMITTED 读未提交
READ COMMITTED 读已提交
REPEATABLE READ 可重复读(MySQL默认
SERIALIZABLE 串行化

十三、数据库备份与恢复 (P173)

13.1 备份类型

备份类型 说明
完整备份 备份整个数据库
差异备份 备份上次完整备份后的所有变化
增量备份 备份上次任意备份后的变化

13.2 备份策略

  • 备份内容:数据、日志、代码、服务器配置文件等
  • 系统数据库:修改后立即备份
  • 用户数据库:周期性备份
  • 恢复基础:日志文件(记录数据库的所有变更操作)

13.3 数据导入导出 (P184)

# 使用mysqlimport导入文件(是LOAD DATA INFILE的命令行接口)
mysqlimport [选项] 数据库名 文件名

十四、数据库设计范式

14.1 三大范式

image-055d9575
  • 1NF:属性不可分(原子性)
  • 2NF:消除了非主属性对码的部分函数依赖(即:非主属性必须完全依赖于主键)
  • 3NF:消除了非主属性对码的传递函数依赖

第二范式 (2NF):在1NF基础上,非主属性完全函数依赖于主码,即消除非主属性对主码的部分函数依赖。解决的问题:减少数据冗余,避免插入异常、删除异常、更新异常。

项目 说明
定义 在1NF基础上,非主属性完全函数依赖于主码(消除部分依赖)
解决问题 消除非主属性对主码的部分函数依赖
作用 减少数据冗余,避免更新异常

第三范式 (3NF):在2NF基础上,消除非主属性对主码的传递函数依赖(即不存在 A→B→C 的传递依赖)。作用:进一步减少数据冗余,提高数据一致性,便于维护。

项目 说明
定义 在2NF基础上,非主属性不传递依赖于主码(消除传递依赖)
条件 每个非主属性都直接依赖于主码,不存在 A→B→C 的传递依赖
作用 进一步减少数据冗余,提高数据一致性,便于维护

判断技巧:如果主码是单字段(如学号),不存在组合主键,自然不存在部分依赖,所以自动满足2NF。

14.2 逻辑结构设计 (P234)

E-R图转换为关系模式的原则

  • 实体转换为表: 属性即列,标识符即主码。
  • 1:1 联系: 可以转换为独立的关系,也可以与任意一端实体对应的关系模式合并(通常合并到访问更频繁的那一端)。
  • 1:n 联系: 将“1”方的主码纳入“n”方作为外码。
    • 联系本身的属性也放在“n”方。
  • m:n 联系: 必须转换为一个新的独立关系模式(新表)。
    • 新表的属性 = 双方实体的主码 + 联系本身的属性。
    • 新表的主码 = 双方主码的组合。

十五、MySQL编程 (P257)

15.1 注释方式

-- 单行注释(注意--后有空格)
# 单行注释
/*
   多行注释
*/

15.2 SQL语句结束符

符号 作用
; 标准结束符
\g 等同于分号
\G 垂直显示结果

注意:. 不能用作SQL语句结束符

15.3 变量类型

变量类型 前缀 说明
局部变量 无或@ 需用DECLARE声明,在BEGIN...END中使用
用户会话变量 @ 当前会话有效
系统变量 @@ MySQL自动创建,分为全局(Global)和会话(Session)两类

15.4 常用函数

函数 作用
CONCAT() 将多个参数连接成一个字符串
IFNULL(字段, '默认值') 空值替换
RAND() 返回0到1之间的随机浮点数

十六、存储过程与触发器

16.1 存储过程 (P280)

-- 创建存储过程
DELIMITER &&
CREATE PROCEDURE 过程名([IN/OUT/INOUT 参数名 参数类型])
BEGIN
    -- SQL语句
END &&
DELIMITER ;

-- 调用存储过程
CALL 过程名([参数]);

16.2 存储函数

-- 创建存储函数
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
    -- 必须有RETURN语句
    RETURN ;
END;

存储过程与存储函数的区别

比较项 存储过程 存储函数
参数类型 支持 IN、OUT、INOUT 通常只支持 IN
返回值 可以不返回 必须返回一个值
调用方式 使用 CALL 语句独立调用 作为表达式在SQL中调用(如 SELECT func())

16.3 触发器 (P308)

类型 执行时机
BEFORE 在INSERT/UPDATE/DELETE之前执行
AFTER 在INSERT/UPDATE/DELETE之后执行
CREATE TRIGGER 触发器名
BEFORE|AFTER INSERT|UPDATE|DELETE
ON 表名 FOR EACH ROW
BEGIN
    -- 触发器逻辑
END;

注意

  • 触发事件只包括 INSERT、UPDATE、DELETE,不包含 SELECT
  • 触发器是自动触发的,不能用 CALL 调用

触发器的作用

  1. 强制实施复杂的业务规则和约束(安全性)
  2. 实现级联更新或删除(完整性)
  3. 跟踪数据变化,记录审计日志
  4. 在写入数据前自动进行数据校验或转换

十七、Python数据库访问 (P323)

  • Python所有数据库接口程序遵守 Python DB API 规范
  • MySQL常用连接库:mysql-connector-pythonpymysql
import pymysql

# 连接数据库
conn = pymysql.connect(host='localhost', user='root',
                       password='pwd', database='db')
cursor = conn.cursor()          # 获取cursor对象
cursor.execute("SELECT * FROM table_name")  # 执行SQL语句
results = cursor.fetchall()     # 获取结果
conn.close()

十八、数据库系统 vs 文件系统

文件系统中数据记录内有结构但整体无结构,共享性差、冗余度大,数据独立性差,由应用程序管理和控制数据。

数据库系统中数据整体结构化,共享性高、冗余度低,数据独立性高,由DBMS统一管理并提供安全性、完整性、并发控制等功能。

比较项 文件系统 数据库系统
数据结构 记录内有结构,整体无结构 整体结构化
数据共享 共享性差,冗余度大 共享性高,冗余度低
数据独立性 独立性差 独立性高
数据管理 由应用程序管理 由DBMS统一管理
数据控制 应用程序控制 DBMS提供安全性、完整性、并发控制