数据库
一、数据库系统概述
1.1 数据库系统阶段数据管理的特点 (P5)
| 特点 | 说明 |
|---|---|
| 结构化 | 数据及其联系的集合,整体结构化 |
| 共享性高、冗余度低 | 多用户、多应用共享数据 |
| 数据独立性高 | 物理独立性和逻辑独立性 |
| 统一管理和控制 | 由DBMS统一管理,包括安全性、完整性、并发控制、恢复等 |
1.2 数据库系统的组成 (P7)
- 四部分: 硬件系统、软件系统(DBMS、OS等)、数据库(DB)、数据库用户(DBA、开发者、终端用户)。
二、三级模式与二级映像(P11)
2.1 三级模式结构
| 模式 | 数量 | 说明 |
|---|---|---|
| 外模式 | 可有多个 | 用户视图,描述用户看到的数据结构 |
| 模式 | 只有一个 | 全局逻辑结构,是所有用户的公共数据视图 |
| 内模式 | 只有一个 | 存储模式,描述数据的物理结构和存储方式 |
2.2 二级映像与数据独立性
| 映像 | 作用 | 独立性类型 |
|---|---|---|
| 外模式/模式映像 | 定义外模式与模式之间的对应关系 | 逻辑独立性 |
| 模式/内模式映像 | 定义模式与内模式之间的对应关系 | 物理独立性 |
核心:通过两层映像实现了数据与程序之间的解耦
请简述数据库系统的三级模式结构及其如何实现数据独立性。
- 三级模式:外模式(用户视图)、模式(全局逻辑结构)、内模式(物理存储结构)
- 数据独立性实现:
- 当模式改变时,只需修改外模式/模式映像,外模式不变 → 逻辑独立性
- 当内模式改变时,只需修改模式/内模式映像,模式不变 → 物理独立性
三、实体联系与数据模型 (P14)
3.1 两个实体之间的联系
- 一对一 (1:1):如 班长与班级。
- 一对多 (1:n):如 班级与学生。
- 多对多 (m:n):如 学生与课程(需通过中间表实现)。
四、关系的完整性 (P32)
| 实体完整性 | 主码的值不能为空或部分为空 | 主码 |
| 参照完整性 | 外码值必须是主表中存在的值或为NULL | 表间关系 |
| 用户自定义完整性 | 反映具体应用的语义约束条件 | 具体应用 |
- 实体完整性: 主码(Primary Key)不能为空,且不能重复。
- 参照完整性: 外码(Foreign Key)要么取空值,要么必须等于主表中存在的主码值。
- 用户自定义完整性: 针对具体业务的约束(如:年龄必须>0,性别只能是男/女)。
五、SQL数据定义语言
5.1 数据库操作 (P60)
-- 创建数据库
CREATE DATABASE 数据库名;
-- 修改数据库
ALTER DATABASE 数据库名 ...;
-- 删除数据库
DROP DATABASE 数据库名;
5.2 约束类型
唯一约束 UNIQUE (P70)
| 特性 | 说明 |
|---|---|
| 允许NULL | 最多只允许出现一个NULL值 |
| 约束类型 | 既可作为表约束,又可作为列约束 |
| 数量限制 | 一个表可以有多个UNIQUE约束 |
| 字段范围 | 可定义在多个字段上 |
主码约束 PRIMARY KEY (P71)
| 特性 | 说明 |
|---|---|
| 作用 | 唯一标识每一行记录 |
| NULL值 | 不能为NULL,不能重复 |
| 数量限制 | 一个表只能定义一个PRIMARY KEY |
| 语法 | <字段名> <数据类型> PRIMARY KEY |
外码约束 FOREIGN KEY (P72)
六、SQL数据操作语言
6.1 数据操作语句
-
添加数据 (P79):
INSERT INTO 表名(字段1, 字段2...) VALUES(值1, 值2...); -- 只有当插入全部字段且顺序一致时,才可省略字段名 -
修改数据 (P80):
UPDATE 表名 SET 字段名 = 新值 WHERE 条件; -- ⚠️注意:不加WHERE会修改全表! -
删除数据 (P81):
DELETE FROM 表名 WHERE 条件; -- ⚠️注意:不加WHERE会清空全表!
七、SQL查询语句 (P85-95)
7.1 查询语法结构
SELECT [DISTINCT] 字段列表
FROM 表名
[WHERE 条件]
[GROUP BY 分组字段]
[HAVING 分组后条件] -- 必须在GROUP BY之后
[ORDER BY 排序字段 [ASC|DESC]];
7.2 条件查询示例 (P88)
- 比较运算:
score >= 90 - 范围查询:
BETWEEN 30 AND 40(包含边界) - 集合查询:
NOT IN ('c4', 'c6') - 模糊查询:
LIKE '%程序%'(%代表任意个字符,_代表一个字符)- 例子:
SELECT cno, cn, ct FROM c WHERE cn LIKE '%程序%';
- 例子:
-- 比较运算符
-- 查询成绩在90分及以上的选课信息
SELECT * FROM sc WHERE score >= 90;
-- AND条件
-- 查询年龄在30~40岁的教师的教师号、姓名和职称
SELECT tno AS 教师号, tn AS 姓名, prof AS 职称
FROM t
WHERE age >= 30 AND age <= 40;
-- BETWEEN...AND
-- 查询课时在30~40课时的课程的课程号、课程名和课时
SELECT cno, cn, ct
FROM c
WHERE ct BETWEEN 30 AND 40;
-- NOT IN
-- 查询除课程号“c4" 和 ”c6“之外其他课程的选课信息,包括学号、课程号和成绩
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 '%程序%';
7.3 分组查询示例 (P95)
- 聚合函数:
COUNT(),SUM(),AVG(),MAX(),MIN() - 分组:
GROUP BY - 分组后筛选:
HAVING- 重点区别:
WHERE筛选行(分组前);HAVING筛选组(分组后)。 - HAVING子句必须跟在GROUP BY之后。
- 重点区别:
-- 统计每门课程选课人数
-- 查询选课表sc中每门课程的课程号及其选课人数
SELECT cno AS 课程号, COUNT(*) AS 选课人数
FROM sc
GROUP BY cno;
-- HAVING过滤分组
-- 查询选修三门以上(含三门)课程的学生的学号和选课门数
SELECT sno AS 学号, COUNT(*) AS 选课门数
FROM sc
GROUP BY sno
HAVING COUNT(*) >= 3;
-- 排序
-- ORDER BY 字段名 [ASC|DESC] (DESC为降序)
-- 查询学号为”s2"的学生的选课信息,要求显示学号、课程号和成绩,并且按成绩降序排列
SELECT sno, cno, score
FROM sc
WHERE sno = 's2'
ORDER BY score DESC;
八、连接查询与子查询
8.1 连接查询 vs 子查询
请简述SQL查询中子查询与连接查询的主要区别
子查询是嵌套的SELECT语句,从内向外逐层执行,结果通常来自一个表,适用于条件值来自其他表的场景,可能执行较慢。
连接查询是多表通过JOIN连接,同时处理多表,结果可来自多个表,适用于需要显示多表字段的场景,通常性能更高。
| 比较项 | 子查询 | 连接查询 |
|---|---|---|
| 结构 | 嵌套的SELECT语句 | 多表通过JOIN连接 |
| 执行方式 | 从内向外逐层执行 | 同时处理多表 |
| 结果来源 | 通常来自一个表 | 可来自多个表 |
| 适用场景 | 条件值来自其他表 | 需要显示多表字段 |
| 性能 | 可能较慢(多次执行) | 通常更高效 |
8.2 INNER JOIN vs LEFT JOIN
| 类型 | 说明 | 结果 |
|---|---|---|
| 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;
请列举并简要说明 INNER JOIN和 LEFT JOIN的区别
INNER JOIN是内连接,只返回两表中匹配的记录,不匹配的记录不显示。
LEFT JOIN是左外连接,返回左表所有记录,如果右表没有匹配的记录则显示为NULL。
九、视图 (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 视图的更新
- 可使用 INSERT、UPDATE、DELETE 语句更新视图数据
WITH CHECK OPTION参数会限制更新操作必须满足视图定义条件
请简述视图与数据表的主要区别:
数据表是实际存储数据的物理结构,占用存储空间,存储真实数据,可直接修改。
视图是虚拟表,只存储查询定义的SQL语句,不存储实际数据,数据动态从基表获取,更新有限制条件。
选择建议:需要永久存储数据用表,需要简化查询、限制访问或提供不同视角时用视图。
| 比较项 | 数据表 | 视图 |
|---|---|---|
| 本质 | 实际存储数据的物理结构 | 虚拟表,只存储查询定义 |
| 存储 | 占用物理存储空间 | 不存储数据,只存SQL语句 |
| 数据 | 真实数据 | 动态从基表获取 |
| 更新 | 直接修改 | 有限制条件 |
| 用途 | 永久存储数据 | 简化查询、控制访问权限 |
选择建议:
- 需要存储数据 → 表
- 简化复杂查询、限制数据访问、提供不同视角 → 视图
十、权限管理 (P147)
10.1 权限授予 GRANT
GRANT 权限名称 [(字段列表)]
ON 授权级别及对象
TO '用户名'@'主机信息'
[WITH GRANT OPTION]; -- 允许被授权者继续授权给其他用户
10.2 权限回收 REVOKE
REVOKE 权限名称
ON 授权级别及对象
FROM '用户名'@'主机信息';
请简述MySQL用户管理的基本操作包括哪些
MySQL用户管理基本操作包括:使用CREATE USER创建用户,使用DROP USER删除用户,使用ALTER USER修改用户密码,使用GRANT授予权限,使用REVOKE回收权限,使用SHOW GRANTS查看用户权限。
| 操作 | 说明 |
|---|---|
| 创建用户 | CREATE USER '用户名'@'主机' IDENTIFIED BY '密码'; |
| 删除用户 | DROP USER '用户名'@'主机'; |
| 修改密码 | ALTER USER '用户名'@'主机' IDENTIFIED BY '新密码'; |
| 授予权限 | GRANT 权限 ON 对象 TO 用户; |
| 回收权限 | REVOKE 权限 ON 对象 FROM 用户; |
| 查看权限 | SHOW GRANTS FOR '用户名'@'主机'; |
十一、事务 (P156)
11.1 事务的ACID特性
- A (Atomicity) 原子性: 要么全做,要么全不做。
- C (Consistency) 一致性: 事务前后数据状态合法。
- I (Isolation) 隔离性: 并发事务互不干扰。
- D (Durability) 持久性: 提交后永久生效。
- 并发问题: 丢失更新、脏读、不可重复读、幻读。
11.2 并发问题
| 问题 | 说明 |
|---|---|
| 丢失更新 | 两事务同时更新,一个覆盖另一个 |
| 脏读 | 读取到未提交的数据 |
| 不可重复读 | 同一事务内两次读取结果不同 |
| 幻读 | 同一事务内两次查询记录数不同 |
十二、数据库备份与恢复 (P173)
12.1 备份类型
| 备份类型 | 说明 |
|---|---|
| 完整备份 | 备份整个数据库 |
| 差异备份 | 备份上次完整备份后的所有变化 |
| 增量备份 | 备份上次备份后的变化 |
12.2 备份策略
- 备份内容:数据、日志、代码、服务器配置文件等
- 系统数据库:修改后立即备份
- 用户数据库:周期性备份
12.3 数据导入导出 (P184)
# 使用mysqlimport导入文件
mysqlimport [选项] 数据库名 文件名
十三、数据库设计范式
13.1 三大范式
- 1NF:属性不可分(原子性)。
- 2NF:消除了非主属性对码的部分函数依赖(即:非主属性必须完全依赖于主键)。
- 3NF定义: 在2NF基础上,消除了非主属性对码的传递函数依赖。
- 通俗解释: 比如
学号 -> 系名,系名 -> 系主任。存在传递依赖学号 -> 系主任。要达到3NF,必须把系相关信息拆分成单独的表。
- 通俗解释: 比如
第二范式 (2NF)
| 项目 | 说明 |
|---|---|
| 定义 | 在1NF基础上,非主属性完全函数依赖于主码(消除部分依赖) |
| 解决问题 | 消除非主属性对主码的部分函数依赖 |
| 作用 | 减少数据冗余,避免更新异常 |
请简述第二范式(2NF)的定义及其解决的问题
定义:第二范式是指在满足1NF的基础上,非主属性完全函数依赖于主码,即消除非主属性对主码的部分函数依赖。
解决的问题:
(1)消除非主属性对主码的部分函数依赖
(2)减少数据冗余
(3)避免插入异常、删除异常、更新异常
第三范式 (3NF) (P217)
| 项目 | 说明 |
|---|---|
| 定义 | 在2NF基础上,非主属性不传递依赖于主码(消除传递依赖) |
| 条件 | 每个非主属性都直接依赖于主码,不存在 A→B→C 的传递依赖 |
| 作用 | 进一步减少数据冗余,提高数据一致性,便于维护 |
请简述第三范式(3NF)的定义及其作用
定义:在2NF基础上,消除非主属性对主码的传递函数依赖(即不存在 A→B→C 的传递依赖)
作用:
(1)进一步减少数据冗余
(2)提高数据一致性
(3)便于数据维护
13.2 逻辑结构设计 (P234)
E-R图转换为关系模式的原则:
- 实体转换为表: 属性即列,标识符即主码。
- 1:1 联系: 可以转换为独立的关系,也可以与任意一端实体对应的关系模式合并(通常合并到访问更频繁的那一端)。
- 1:n 联系: 将“1”方的主码纳入“n”方作为外码。
- 联系本身的属性也放在“n”方。
- m:n 联系: 必须转换为一个新的独立关系模式(新表)。
- 新表的属性 = 双方实体的主码 + 联系本身的属性。
- 新表的主码 = 双方主码的组合。
十四、MySQL编程 (P257)
14.1 注释方式
-- 单行注释(注意--后有空格)
# 单行注释
/*
多行注释
*/
14.2 变量类型
| 变量类型 | 前缀 | 说明 |
|---|---|---|
| 局部变量 | @ |
需用DECLARE声明 |
| 系统变量 | @@ |
MySQL自动创建 |
- 用户变量/局部变量:
DECLARE定义局部变量,必须在BEGIN...END中。- 名字通常以
@开头(用户会话变量)或无前缀(局部变量)。
- 系统变量:
- 前缀
@@(如@@version,@@identity)。
- 前缀
十五、存储过程与触发器
15.1 存储过程 (P280)
-- 创建存储过程
CREATE PROCEDURE 过程名([参数列表])
BEGIN
-- SQL语句
END;
-- 调用存储过程
CALL 过程名([参数]);
15.2 触发器 (P308)
| 类型 | 执行时机 |
|---|---|
| BEFORE | 在INSERT/UPDATE/DELETE之前执行 |
| AFTER | 在INSERT/UPDATE/DELETE之后执行 |
CREATE TRIGGER 触发器名
BEFORE|AFTER INSERT|UPDATE|DELETE
ON 表名 FOR EACH ROW
BEGIN
-- 触发器逻辑
END;
十六、Python数据库访问 (P323)
- Python所有数据库接口程序遵守 Python DB API 规范
- MySQL常用连接库:
mysql-connector-python、pymysql
import pymysql
# 连接数据库
conn = pymysql.connect(host='localhost', user='root',
password='pwd', database='db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM table_name")
results = cursor.fetchall()
conn.close()
十七、数据库系统 vs 文件系统
请简述数据库系统与文件系统的主要区别
文件系统中数据记录内有结构但整体无结构,共享性差、冗余度大,数据独立性差,由应用程序管理和控制数据。
数据库系统中数据整体结构化,共享性高、冗余度低,数据独立性高,由DBMS统一管理并提供安全性、完整性、并发控制等功能。
| 比较项 | 文件系统 | 数据库系统 |
|---|---|---|
| 数据结构 | 记录内有结构,整体无结构 | 整体结构化 |
| 数据共享 | 共享性差,冗余度大 | 共享性高,冗余度低 |
| 数据独立性 | 独立性差 | 独立性高 |
| 数据管理 | 由应用程序管理 | 由DBMS统一管理 |
| 数据控制 | 应用程序控制 | DBMS提供安全性、完整性、并发控制 |
💬 评论