第1节 数据库系统的基本概念
1.1 数据库系统的定义
数据库系统(Database System):在数据库系统中实现对数据进行管理的软件系统,是数据库系统的重要组成部分和核心,由五部分组成:
| 组成部分 | 说明 |
|---|---|
| 数据库(DB) | 统一管理的相关数据的集合 |
| 数据库管理系统(DBMS) | 对数据库进行管理的软件,是数据库系统的核心 |
| 数据库管理员(DBA) | 对数据库进行规划、设计、协调、维护和管理的 IT 技术人员 |
| 数据库应用程序 | 使用数据库语言开发的、能够满足数据处理需求的应用程序 |
| 用户 | 通过 DBMS 直接操纵数据库,或通过应用程序操纵数据库 |
例子:某高校的学籍管理系统就是一个典型的数据库系统:
- 数据库:存储全校学生、课程、成绩的数据集;
- DBMS:MySQL 或 SQL Server 软件,负责数据的增删改查;
- DBA:学校信息中心的数据库管理员,负责备份、调优、安全管理;
- 应用程序:学生选课网站、成绩查询系统;
- 用户:学生通过选课网站选课,教务处通过后台录入成绩。
1.2 数据库系统的组成
数据库 → 数据库管理系统(DBMS)→ 应用程序1 / 应用程序2 → 用户
↓
数据库管理员(DBA)
- DBMS 是连接数据库与应用程序的桥梁
- DBA 负责整个系统的规划与维护
1.3 数据管理技术的发展
| 阶段 | 特点 |
|---|---|
| 人工管理阶段 | 数据不保存、不共享,由应用程序自行管理 |
| 文件系统阶段 | 数据以文件形式存储,但共享性差、冗余度高 |
| 数据库阶段 | 数据集中管理,共享性高、冗余度低、具有数据独立性 |
| 高级数据库阶段 | 面向对象数据库、分布式数据库、数据仓库等 |
例子:早期学校用 Excel 表格存放学生成绩(文件系统阶段),各系各自维护自己的表格,同一个学生可能在多个 Excel 中出现(数据冗余);升级到数据库后,所有数据集中存储,任何系统通过统一的 DBMS 访问,数据一致不再重复。
1.4 数据库系统的体系结构(三级模式)
外模式A ─┐ ┌─ 应用程序A1
外模式B ──┤──外模式/概念模式映像──概念模式──概念模式/内模式映像──内模式──数据库│ ├─ 应用程序A2
外模式C ─┘ │ ├─ 应用程序B1
│ ├─ 应用程序C1
└─ 应用程序C2
| 层次 | 说明 |
|---|---|
| 外模式(用户模式) | 用户看到的数据视图,不同用户可见不同的数据子集 |
| 概念模式 | 数据库的全局逻辑结构,一个数据库只有一个概念模式 |
| 内模式(存储模式) | 数据的物理存储方式 |
两层映像实现了数据独立性:
- 外模式/概念模式映像 → 逻辑独立性(概念模式变了,外模式不用变)
- 概念模式/内模式映像 → 物理独立性(存储方式变了,概念模式不用变)
例子:同一个学生成绩数据库,学生通过选课系统只能看到自己的成绩(外模式A),教师通过教务系统可以看到所教课程的全部学生成绩(外模式B),教务处可以看到全校汇总数据(外模式C)。三组用户看到的视图不同,但底层是同一份物理数据。
1.5 数据库管理系统的功能
| 功能 | 说明 |
|---|---|
| 数据库定义 | 定义数据库结构(表、索引、视图等) |
| 数据库操纵 | 数据的增删改查 |
| 数据库事务管理 | 保证数据的一致性和完整性 |
| 数据库维护 | 备份、恢复、安全控制 |
| 其他 | 格式转换、网络通信 |
1.6 数据库管理系统的类型
| 类型 | 数据模型 | 特点 |
|---|---|---|
| 层次型数据库 | 树型结构 | 如 IBM IMS,适合一对多的层级数据 |
| 网状型数据库 | 有向图(网络)结构 | 比层次型灵活,可表示多对多关系 |
| 关系型数据库 | 二维表格 | 最广泛使用,有完备的关系代数理论支持 |
| 面向对象数据库 | 对象、类、继承等 | 适合复杂数据类型(如图形、多媒体) |
例子:
- 层次型:公司的组织架构------CEO → 部门经理 → 员工,天然是树形结构。
- 网状型:航班订票系统------一个乘客可订多个航班,一个航班有多个乘客,是多对多关系。
- 关系型:学生表(学号, 姓名, 年龄)和课程表(课程号, 课程名)通过选课表(学号, 课程号, 成绩)关联。MySQL、PostgreSQL、Oracle 都是关系型数据库。
- 面向对象:CAD 设计系统,每个零件是一个对象,有属性和方法,零件之间可以有继承关系。
1.7 数据库管理系统的构成(四层结构)
| 层次 | 功能 |
|---|---|
| 应用层 | 与用户和应用程序的界面 |
| 语言处理层 | DDL/DML/DCL 编译器、查询器、授权检验、完整性检查、查询优化 |
| 数据存取层 | 集合操作→记录操作(扫描、排序、查找、插入、删除、修改),并发控制 |
| 数据存储层 | 文件管理器 + 缓冲区管理器,负责页面存储和缓冲区管理 |
1.8 数据库语言
| 语言 | 全称 | 功能 |
|---|---|---|
| DDL | 数据定义语言(Data Definition Language) | 定义数据库的逻辑/物理结构、数据类型、约束 |
| DML | 数据操纵语言(Data Manipulation Language) | 数据录入、修改、删除、查询、统计 |
| SQL | 结构化查询语言(Structured Query Language) | 基于关系代数和关系演算的主流数据库语言 |
例子:
- DDL:
CREATE TABLE Student (...)--- 建表。- DML:
SELECT * FROM Student WHERE age > 20--- 查询。- SQL 同时包含了 DDL、DML、DCL(数据控制)的功能,是一种一体化的语言。
第2节 结构化查询语言 SQL 概述
2.1 SQL 的产生与发展
| 时间节点 | 事件 |
|---|---|
| 1974年 | Boyce 和 Chamberlin 提出 SQL,在 IBM 的 SYSTEM-R 上实现 |
| 1986年10月 | ANSI 将 SQL 定为美国标准 |
| 1987年6月 | ISO 将 SQL 定为国际标准 |
| 1992年 | ISO 颁布 SQL92(对 SQL89 进行修改和扩充) |
2.2 SQL 的特点
- 功能一体化:集 DDL、DML、DCL、嵌入式功能于一体
- 语法结构统一:所有 SQL 语句使用统一的语法范式
- 高度非过程化:用户只需要说"要什么",不需要说"怎么拿"
- 语言简洁:核心命令只有 9 个动词(CREATE、DROP、ALTER、SELECT、INSERT、UPDATE、DELETE、GRANT、REVOKE)
例子 (非过程化):执行
SELECT name FROM Student WHERE age > 20时,用户只需描述"我要年龄大于20的学生姓名",不需要关心底层是用 B+ 树索引扫描还是全表扫描,DBMS 会自动优化执行路径。
2.3 SQL 的功能
| 功能 | 说明 | 核心命令 |
|---|---|---|
| 数据定义 | 定义基本表、索引、视图 | CREATE、DROP、ALTER |
| 数据操纵 | 查询、插入、删除、修改 | SELECT、INSERT、DELETE、UPDATE |
| 数据控制 | 权限管理 | GRANT、REVOKE |
| 嵌入式 | SQL 嵌入到 C/Java/Python 等语言中使用 | EXEC SQL 等 |
第3节 SQL 的数据定义操作
3.1 定义基本表
sql
CREATE TABLE <基本表名>
(<属性名1> <数据类型1> [NOT NULL],
[<属性名2> <数据类型2> [NOT NULL]] ,
...
[<完整性约束>])
3.2 SQL 基本数据类型
| 数据类型 | 说明 |
|---|---|
| CHAR(n) | 长度为 n 的定长字符串 |
| VARCHAR(n) | 最大长度为 n 的变长字符串 |
| INTEGER | 全字长整数 |
| SMALLINT | 半字长整数 |
| NUMERIC(p,d) | 定点数,共 p 位数字,小数点后有 d 位 |
| REAL | 浮点数 |
| DOUBLE PRECISION | 双精度浮点数 |
| FLOAT(n) | 精度至少为 n 位的浮点数 |
| DATE | 日期,格式 YYYY-MM-DD |
| TIME | 时间,格式 HH:MM:SS |
例子:
- CHAR(10) 存
'ABC',实际占用 10 字符空间(右侧补空格);- VARCHAR(10) 存
'ABC',只占用 3 字符空间,更省存储。- 一般姓名用 VARCHAR,学号/课程号等固定长度编码用 CHAR。
3.3 定义基本表举例
【例6-1】 创建学生表 S、课程表 C 和学生选课成绩表 SC。
sql
-- (1) 学生表 S
CREATE TABLE S
(学号 CHAR(4) NOT NULL,
姓名 CHAR(8) NOT NULL,
年龄 SMALLINT,
性别 CHAR(2),
系别 CHAR(20),
PRIMARY KEY(学号))
-- (2) 课程表 C
CREATE TABLE C
(课程号 CHAR(4) NOT NULL,
课程名 CHAR(4) NOT NULL,
教师名 CHAR(8),
PRIMARY KEY(课程号))
-- (3) 选课成绩表 SC
CREATE TABLE SC
(学号 CHAR(4) NOT NULL,
课程号 CHAR(4) NOT NULL,
成绩 SMALLINT,
PRIMARY KEY(学号,课程号)
FOREIGN KEY(学号)REFERENCES S(学号),
FOREIGN KEY(课程号)REFERENCES C(课程号),
CHECK(成绩 IS NULL)OR(成绩 BETWEEN 0 AND 100))
解读:
- PRIMARY KEY 定义主键:S 表以「学号」唯一标识一行;SC 表以「学号 + 课程号」联合作为主键(一个学生可选多门课,同一门课有多个学生选,但同一学生不能重复选同一门课)。
- FOREIGN KEY 定义外键:SC.学号 引用 S.学号,SC.课程号 引用 C.课程号,确保参照完整性------不能录入一个不存在学生或不存在课程的成绩。
- CHECK 约束:成绩要么为 NULL(未录入),要么在 0-100 之间。
3.4 修改基本表
| 操作 | 语法 | 示例 |
|---|---|---|
| 增加列 | ALTER TABLE <表名> ADD <属性名> <数据类型> |
【例6-2】ALTER TABLE S ADD 家庭地址 VARCHAR(40) |
| 删除列 | ALTER TABLE <表名> DROP <属性名> <删除方式> |
【例6-3】ALTER TABLE S DROP 系别 CASCADE 或 RESTRICT |
删除方式说明:
CASCADE(级联):删除该列时,所有引用该列的视图、约束也一并删除。RESTRICT(限制):如果该列被其他对象引用,则拒绝删除。例子 :假设「系别」列被某视图
CS_Student引用:
- 用
RESTRICT→ 报错,需要先删除依赖的视图。- 用
CASCADE→ 删除列的同时自动删除CS_Student视图。
3.5 定义索引
sql
CREATE [UNIQUE] INDEX <索引名> ON <基本表名>
(<属性名1>[<次序>][ ,<属性名2>[<次序>]] ...)
[PCTFREE={<整数>}]
| 示例 | 说明 |
|---|---|
CREATE UNIQUE INDEX SNOINDEX ON S(学号 ASC) |
在 S 表的学号列上按升序建立唯一索引 |
CREATE INDEX GRADEINDEX ON SC(成绩 DESC, 学号 DESC) |
在 SC 表上按成绩降序、学号降序建立索引 |
例子 (索引的作用):在图书管理系统中,如果经常按「书名」搜索,在书名列上建索引后,查询
SELECT * FROM Books WHERE name = '数据库原理'可以从全表扫描(100万条记录逐条比较)变成 B+ 树索引查找(约 20 次磁盘 I/O),速度提升上万倍。但索引并非越多越好------每个索引需要额外存储空间,且 INSERT/UPDATE/DELETE 时需要同步维护索引,会降低写操作性能。
第4节 SQL 的数据查询操作
SQL 的数据查询是其核心功能,支持三种查询方式:简单查询 、连接查询 、嵌套查询。
4.1 数据查询语句的一般形式
sql
SELECT <目标属性>
FROM <基本表名或视图名>
[WHERE <条件表达式>]
[GROUP BY <属性名1> [HAVING <条件表达式>]]
[ORDER BY <属性名2> [<次序>]]
各子句含义:
| 子句 | 作用 |
|---|---|
| SELECT | 指定要输出的列(用 * 表示全部列) |
| FROM | 指定数据来源的表或视图 |
| WHERE | 筛选满足条件的行 |
| GROUP BY | 按指定列分组,每组产生一条汇总结果 |
| HAVING | 分组后的筛选条件(与 WHERE 区别:WHERE 在分组前筛选行,HAVING 在分组后筛选组) |
| ORDER BY | 排序(ASC 升序 / DESC 降序) |
例子 :
SELECT 系别, AVG(年龄) FROM S GROUP BY 系别 HAVING AVG(年龄) > 20 ORDER BY 系别 ASC这条语句的执行顺序:①从 S 表取数据 → ②按系别分组 → ③计算每组的平均年龄 → ④筛选平均年龄 > 20 的组 → ⑤按系别升序排列。
4.2 WHERE 子句可用的运算符
| 类别 | 运算符 |
|---|---|
| 算术 | + - * / |
| 比较 | < <= = >= > <>(或 !=) |
| 逻辑 | AND OR NOT |
| 集合 | UNION(并) INTERSECT(交) EXCEPT(差) |
| 集合成员 | IN(属于) NOT IN(不属于) |
| 谓词 | EXISTS ALL SOME UNIQUE |
4.3 常用系统内部函数(聚合函数)
| 函数 | 格式 | 含义 |
|---|---|---|
| AVG | AVG([DISTINCT] <属性名>) |
求平均值,DISTINCT 只算不同值 |
| SUM | SUM([DISTINCT] <属性名>) |
求和 |
| MAX | MAX(<属性名>) |
最大值 |
| MIN | MIN(<属性名>) |
最小值 |
| COUNT | COUNT(*) |
统计元组个数 |
| COUNT | COUNT(DISTINCT <属性名>) |
统计不同值的元组个数 |
例子:
SELECT COUNT(*) FROM S WHERE 性别 = '男'→ 统计男生总人数。SELECT COUNT(DISTINCT 系别) FROM S→ 统计有多少个不同的系(去重计数)。SELECT 系别, COUNT(*) AS 人数 FROM S GROUP BY 系别→ 按系统计人数。
4.4 简单查询举例(单表查询)
| 示例 | SQL 语句 | 说明 |
|---|---|---|
| 【例6-7】查询全部学生信息 | SELECT * FROM S |
等价于 SELECT 学号,姓名,年龄,性别,系别 FROM S |
| 【例6-8】查询计算机系和电气系学生的学号、姓名、年龄 | SELECT 学号,姓名,年龄 FROM S WHERE 系别='计科系' OR 系别='电气系' |
等价于 WHERE 系别 IN ('计科系','电气系') |
| 【例6-9】查询年龄在18~20岁学生的姓名和性别 | SELECT 姓名,性别 FROM S WHERE 年龄 >= 18 AND 年龄 <= 20 |
等价于 WHERE 年龄 BETWEEN 18 AND 20 |
| 【例6-10】查询所有男生的学号、姓名、出生年份 | SELECT 学号,姓名,2004-年龄 FROM S WHERE 性别='男' |
表达式 2004-年龄 在结果中生成新列(假设当年为2004) |
| 【例6-11】查询计算机系女生总人数和平均年龄 | SELECT COUNT(*), AVG(年龄) FROM S WHERE 系别='计科系' AND 性别='女' |
聚合函数 + 多条件筛选 |
| 【例6-12】查询选修 C001 课程学生的学号和成绩(按成绩降序) | SELECT 学号,成绩 FROM SC WHERE 课程号='C001' ORDER BY 成绩 DESC |
单表查询 + 排序 |
BETWEEN 补充例子 :
WHERE 成绩 BETWEEN 60 AND 80等价于WHERE 成绩 >= 60 AND 成绩 <= 80,注意边界是闭区间,60 分和 80 分都会被选入。
4.5 多表查询(连接查询)举例
当查询涉及两个或两个以上表时,需要通过连接条件(通常是外键 = 主键)将表关联起来。
| 示例 | SQL 语句 | 说明 |
|---|---|---|
| 【例6-13】查询选修 C001 课程学生的学号和姓名 | SELECT S.学号, 姓名 FROM S, SC WHERE S.学号=SC.学号 AND 课程号='C001' |
S 和 SC 通过 S.学号=SC.学号 连接 |
| 【例6-14】查询选修"操作系统"课程学生的学号和姓名 | SELECT S.学号, 姓名 FROM S, C, SC WHERE S.学号=SC.学号 AND C.课程号=SC.课程号 AND 课程名='操作系统' |
三表连接:S ⟷ SC ⟷ C |
| 【例6-15】查询选修 C001 且成绩 ≥ 80 的学生学号、姓名和成绩 | SELECT S.学号, 姓名, 成绩 FROM S, SC WHERE S.学号=SC.学号 AND SC.课程号='C001' AND 成绩 >= 80 |
连接 + 多条件筛选 |
连接查询执行过程(以例6-13为例):
- 对 S 和 SC 做笛卡尔积(S 的每一行与 SC 的每一行组合,假设 S 有 1000 行、SC 有 5000 行,则产生 500 万行中间结果)
- 用
S.学号=SC.学号条件过滤,只保留学号匹配的行- 用
课程号='C001'再筛选- 最后只取
S.学号和姓名两列输出实际上 DBMS 会做查询优化,通常不会真的生成笛卡尔积,而是使用索引高效地做连接。
4.6 嵌套查询举例
嵌套查询:在 WHERE 子句中包含另一个 SELECT 语句(子查询),SQL 允许多层嵌套。
| 示例 | SQL 语句 |
|---|---|
| 【例6-16】查询选修 C001 学生的学号和姓名 | SELECT 学号, 姓名 FROM S WHERE S.学号 IN (SELECT 学号 FROM SC WHERE 课程号='C001') |
| 【例6-17】查询选修"操作系统"课程学生的学号和姓名 | SELECT 学号, 姓名 FROM S WHERE 学号 IN (SELECT 学号 FROM SC WHERE 课程号 IN (SELECT 课程号 FROM C WHERE 课程名='操作系统')) |
嵌套 vs 连接 :
例6-16 的嵌套查询等价于例6-13 的连接查询。区别在于:
- 嵌套查询 :先执行内层子查询获得学号集合,再用
IN筛选外层,逻辑更贴近"分步思考"。- 连接查询:通过 JOIN 条件一次性关联两表。
- 实际执行时由 DBMS 优化器转换为等价的执行计划,性能取决于具体索引和表大小。
另一个常见嵌套例子:查询年龄大于全系平均年龄的学生:
sqlSELECT * FROM S AS s1 WHERE 年龄 > (SELECT AVG(年龄) FROM S AS s2 WHERE s2.系别 = s1.系别)这里用了相关子查询(内层引用了外层别名 s1),每处理外层一行就执行一次内层。
第5节 SQL 的数据更新操作
5.1 数据插入(INSERT)
形式1:直接插入值
sql
INSERT INTO <基本表名> [(<属性名1>[,<属性名2>] ...)]
VALUES(<常量1>[,<常量2>] ...)
形式2:从查询结果插入
sql
INSERT INTO <基本表名> [(<属性名1>[,<属性名2>] ...)]
<SELECT语句>
| 示例 | SQL 语句 | 说明 |
|---|---|---|
| 【例6-18】插入一条新学生记录 | INSERT INTO S VALUES ('20022503','周冰',22,'男','计算机科学与工程系') |
逐字段给出值 |
| 【例6-19】创建平均年龄表并存入查询结果 | ① CREATE TABLE DEPTAGE (系别 CHAR(20) NOT NULL, 平均年龄 SMALLINT, PRIMARY KEY(系别)) ② INSERT INTO DEPTAGE (系别, 平均年龄) SELECT 系别, AVG(年龄) FROM S GROUP BY 系别 |
形式2:将聚合查询的结果批量插入新表 |
例子(形式2的实际应用) :电商系统中,每日将订单表中当天的数据通过
INSERT INTO OrderHistory SELECT * FROM Orders WHERE order_date = CURDATE()归档到历史表,实现数据分离。
5.2 数据删除(DELETE)
sql
DELETE FROM <基本表名> [WHERE <条件表达式>]
注意事项:
- 删除的是整行元组,不能删除元组中的某些属性值
- 不带 WHERE 子句会删除全部元组,但表结构仍然保留
- 一次只能从一个基本表中删除
- 若要跨多表删除,需用多个 DELETE 语句
DELETE FROM <表名>会使表变为空表,需格外慎重
| 示例 | SQL 语句 |
|---|---|
| 【例6-20】删除学号为 20022502 的学生 | DELETE FROM S WHERE 学号='20022502' |
DELETE vs DROP vs TRUNCATE 的区别:
操作 效果 可回滚 DELETE FROM S WHERE ...删除符合条件的行 是(事务内) DELETE FROM S删除所有行,表结构保留 是 TRUNCATE TABLE S删除所有行,重置自增计数器 否(MySQL) DROP TABLE S删除整个表(结构+数据) 否
例子 :如果 SC 表中有学生的选课记录,直接删除 S 表中的学生会导致 SC 中出现"孤儿"记录(参照完整性被破坏)。正确做法是设置外键时指定
ON DELETE CASCADE,级联删除关联记录。
5.3 数据修改(UPDATE)
sql
UPDATE <基本表>
SET <属性名1> = <表达式1> [,<属性名2> = <表达式2>, ...]
[WHERE <条件表达式>]
| 示例 | SQL 语句 | 说明 |
|---|---|---|
| 【例6-21】将学号 20022501 学生的系别改为电气系 | UPDATE S SET 系别='电气工程系' WHERE 学号='20022501' |
修改单行的单个字段 |
| 【例6-22】所有学生年龄加 1 | UPDATE S SET 年龄 = 年龄 + 1 |
批量修改(无 WHERE 则修改全表) |
例子 (业务场景):每到新学期,学生年龄统一加一岁,就可以用
UPDATE S SET 年龄 = 年龄 + 1一次性更新所有行,而不需要逐条修改。又如电商系统中UPDATE Products SET price = price * 0.9 WHERE category = '图书'实现图书品类打九折的批量调价。
第6节 SQL 的视图操作
6.1 视图的概念
视图(View) :从多个基本表或其他视图构造出来的虚拟表。
- 定义视图时系统仅保存其定义(SQL 语句),不存储实际数据
- 当用户使用视图时,才从基本表中取出实际数据
- 视图可以像基本表一样被查询和(有限制地)更新
例子:学校里不同角色需要看到不同的数据:
- 学生视图:
CREATE VIEW StudentView AS SELECT 学号,姓名,年龄 FROM S--- 看不到他人的敏感信息- 教师视图:
CREATE VIEW TeacherView AS SELECT S.姓名,C.课程名,SC.成绩 FROM S,SC,C WHERE S.学号=SC.学号 AND C.课程号=SC.课程号--- 看到所教课程的学生成绩
所有视图都基于同一组基本表 S、C、SC,但不同角色看到不同的"虚拟表",实现了数据安全和访问控制。
6.2 定义视图
sql
CREATE VIEW <视图名> [(<属性名1> [,<属性名2>] ... )]
AS <SELECT 语句>
[WITH CHECK OPTION]
规则:
- SELECT 语句中不能 含有
UNION和ORDER BY - 列顺序由 SELECT 的目标列决定
WITH CHECK OPTION:对视图做 INSERT/UPDATE 时,必须满足视图定义中的条件
| 示例 | SQL 语句 |
|---|---|
| 【例6-23】创建计算机系学生视图 | CREATE VIEW CSS AS SELECT 学号, 姓名, 性别, 年龄 FROM S WHERE 系别='计算机科学与工程系' |
WITH CHECK OPTION 例子:
sqlCREATE VIEW CSS AS SELECT 学号, 姓名, 年龄, 系别 FROM S WHERE 系别 = '计算机系' WITH CHECK OPTION;如果执行
INSERT INTO CSS VALUES ('2024001', '李明', 20, '电气系'),尽管视图底层对应的是 S 表,但因为系别='电气系'不满足视图定义中的WHERE 系别='计算机系',操作会被拒绝。这保证了通过视图操作的数据始终符合视图的筛选条件。
6.3 视图的查询
| 示例 | SQL 语句 | 转换后的等价语句 |
|---|---|---|
| 【例6-24】查询计算机系年龄 > 22 的学生 | SELECT 学号,姓名,年龄 FROM CSS WHERE 年龄 > 22 |
SELECT 学号,姓名,年龄 FROM S WHERE 系别='计科系' AND 年龄 > 22 |
DBMS 在内部将视图查询自动转换 为对基本表的查询,这个过程称为视图消解。
6.4 视图的更新操作
视图支持 INSERT、DELETE、UPDATE 操作,但最终都转换为对基本表的操作。
| 示例 | SQL 语句 | 转换后的等价语句 |
|---|---|---|
| 【例6-25】修改视图中的姓名 | UPDATE CSS SET 姓名='赵立' WHERE 学号='20022602' |
UPDATE S SET 姓名='赵立' WHERE 系别='计科系' AND 学号='20022602' |
视图更新的限制 :并非所有视图都可更新。由多个表连接、聚合函数、GROUP BY、DISTINCT 等定义的视图通常不可更新(因为 DBMS 无法将更新操作正确映射回各个基本表)。
6.5 视图的撤销
sql
DROP VIEW <视图名>
| 含义 | 说明 |
|---|---|
DROP VIEW CSS |
删除视图 CSS 的定义 |
| 级联影响 | 由该视图导出的其他视图也自动被删除 |
| 基本表删除影响 | 如果基本表被删除,基于它的视图也自动被删除 |
例子 :假设定义了三个视图:
CSS(基于 S 表)、CSS_Female(基于 CSS,筛选女生)、CSS_Female_Young(基于 CSS_Female,筛选年龄 < 20)。执行DROP VIEW CSS后,CSS_Female 和 CSS_Female_Young 也会一并被自动删除,因为失去了依赖基础。
第7节 几种新型的数据库系统
7.1 分布式数据库(DDB)
| 项目 | 说明 |
|---|---|
| 定义 | 物理上分散在计算机网络各结点上,但逻辑上属于同一系统的数据集合 |
| 管理系统 | DDBMS,负责局部数据管理、数据通信、分布数据管理和数据字典管理 |
| 特点 | 数据分布性、逻辑相关性、局部自治与全局共享、数据冗余性、数据独立性、系统透明性 |
例子:某全国连锁超市,每个城市的门店有自己的数据库服务器存储本地销售数据(物理分散),但总部可以像查询一个统一数据库一样查询"全国今天总销售额"(逻辑统一)。DDBMS 自动将查询分解下发到各结点,汇总结果返回。各门店可以独立运营(局部自治),同时数据又能全局共享。
7.2 多媒体数据库(MDB)
| 项目 | 说明 |
|---|---|
| 定义 | 以数据库方式合理存储多媒体信息(文字、图形、图像、音频、视频等)的集合 |
| 管理系统 | MDBMS,负责多媒体对象的存储、处理、检索和输出 |
| 特点 | 媒体多样性、信息量大、管理复杂 |
| 主要研究内容 | 多媒体数据模型、MDBMS 体系结构、存取与组织技术、查询语言、同步控制、数据压缩 |
例子:一个在线教育平台的课程数据库不仅存储课程标题和描述(文本),还存储讲师视频(音频/视频)、课件截图(图像)、作业文件等。传统关系型数据库处理 BLOB 效率低,多媒体数据库专门优化了大对象存储、流媒体检索和同步播放。
7.3 并行数据库(PDB)
| 项目 | 说明 |
|---|---|
| 定义 | 数据库技术与并行技术相结合的产物,在并行体系结构支持下实现数据库操作处理的并行化 |
| 目标 | 提高数据库效率 |
| 主要研究内容 | 并行数据库体系结构、并行数据库机、并行操作算法、并行查询优化、并行数据库物理设计、数据加载和再组织技术 |
例子 :电商双11大促时,单台数据库服务器处理每秒数十万次查询会瘫痪。并行数据库将数据分散到如 100 个节点上,每个节点只存一部分数据(数据分区),一个
SELECT COUNT(*) FROM Orders查询会被分解为 100 个子查询并行执行,各节点独立统计自己的订单数,最终汇总------理论上可获得接近 100 倍的加速。
7.4 演绎数据库(DeDB)
| 项目 | 说明 |
|---|---|
| 定义 | 数据库技术与逻辑理论相结合的产物,支持演绎推理功能 |
| 组成 | 外延数据库 EDB (由关系组成的事实数据)+ 内涵数据库 IDB (由规则组成)+ 演绎推理机构 |
| 主要研究内容 | 逻辑理论与逻辑语言、递归查询处理与优化算法、演绎数据库体系结构 |
例子 :在一个家族数据库中,EDB 存储基本事实(parent(张三, 李四) 表示张三是李四的父亲),IDB 存储推理规则:
ancestor(X, Y) :- parent(X, Y)(父母是祖先)和ancestor(X, Z) :- parent(X, Y) AND ancestor(Y, Z)(父母的祖先是祖先)。用户查询ancestor(张三, ?)时,演绎推理引擎会递归展开规则,自动推导出张三的所有后代,而无需显式存储所有祖孙关系。
7.5 主动数据库(Active DB)
| 项目 | 说明 |
|---|---|
| 定义 | 除了传统被动服务功能外,还能根据当前状态主动作出反应,执行某些操作 |
| 实现方法 | 嵌入 ECA 规则(Event-Condition-Action,事件-条件-动作) |
| ECA 规则流程 | 事件发生 → 检测当前状态是否满足条件 → 若满足则触发动作 |
| 需解决的技术问题 | 知识模型、执行模型、事件监测和条件检测方法、事务调度、安全性和可靠性、体系结构、系统效率 |
例子:库存管理系统中设置 ECA 规则:
- 事件(E):库存量更新事件
- 条件(C):某商品库存 < 安全阈值(如 10 件)
- 动作(A):自动生成一张补货订单 + 发送告警邮件给采购部门
传统数据库只能被动响应查询
SELECT * FROM Inventory WHERE quantity < 10(需要用户主动查询才知道缺货),主动数据库则在库存下降低于阈值时自动触发补货流程,无需人工干预。
7.6 数据仓库(Data Warehouse)
| 项目 | 说明 |
|---|---|
| 定义 | 支持管理决策的面向主题的、集成的、稳定的、定期更新的数据集合 |
| 核心功能 | 对异构数据源的数据进行提取、过滤、加工、存储,响应查询和决策分析请求 |
| 数据组织方式 | 按主题 和维重组原始数据,转换为有用信息 |
| 管理系统组成 | 监控器、转换器、集成器、元数据管理器 |
| 工具层 | OLAP 工具、预测分析工具、数据挖掘工具 |
四大特征详解:
特征 说明 例子 面向主题 按业务主题组织数据,而非按应用 "销售"主题整合订单、退货、促销数据 集成 来自不同源系统的数据统一编码和命名 A 系统存性别为 M/F,B 系统存男/女,统一为男/女 稳定 数据一旦进入仓库就不轻易更改 历史销售数据在仓库中只追加,不修改 定期更新 按周期从业务系统刷新数据 每天凌晨 3 点从 ERP 系统同步前一天的数据
例子:某超市的数据仓库按"商品"、"门店"、"时间"三个维度组织销售数据。分析人员可以通过 OLAP 工具快速回答:"去年第四季度华东区饮料类商品中,哪种商品毛利最高?"------在传统业务数据库中做这种多维度分析可能需要编写几十行 SQL 且执行数小时,在数据仓库中通过预计算的立方体几秒就能出结果。
第8节 数据库系统的应用
8.1 信息及其基本特征
信息:经过加工而成为有一定意义和价值且具有特定形式的数据,对信息接收者的行为有一定影响。
| 特征 | 说明 |
|---|---|
| 时间性 | 信息有时效性,过时信息价值下降 |
| 事实性 | 信息应反映客观事实 |
| 明了性 | 信息应清晰易懂 |
| 完整性 | 信息应完整无缺失 |
| 多样性 | 信息表现形式多样(文本、图表、音视频) |
| 共享性 | 信息可多人共享而不损耗 |
| 模糊性 | 有些信息天然带有不确定性 |
例子:天气预报是典型的信息------原始数据是各气象站采集的温度、湿度、气压等数值(数据),经过气象模型加工后生成"明天上海有小雨,18-25°C"(信息)。这个信息有时效性(明天过后就没用了),可多人共享,但带有一定模糊性(可能预报不准)。
8.2 信息系统(IS)
信息系统(Information System):由人员、活动、数据、网络和技术等要素组成的集成系统,目的是对业务数据进行采集、存储、处理和交换,以支持日常业务运作和管理决策。
信息系统的分类(按管理层级):
战略规划层 ← DSS(决策支持系统) ← 高级管理人员 非结构化决策
管理规划层 ← MIS(管理信息系统) ← 中层管理人员
操作规划层 ← EDP/TPS(事务处理系统) ← 基层管理人员 结构化决策
例子(三层系统在公司中的实际应用):
- TPS/EDP(操作层):收银系统扫描商品条码 → 更新库存 → 记录交易,处理的是高度结构化的日常事务。
- MIS(管理层):汇总各门店日销售数据,生成周报/月报------销售额趋势、库存周转率等,帮助店长和区域经理做运营决策。
- DSS(战略层):基于历史 5 年的销售数据和外部市场数据,帮助 CEO 分析"是否应该在华东开设新门店",涉及的因素复杂且没有标准答案(半结构化/非结构化决策)。
8.3 事务处理系统(TPS)
| 项目 | 说明 |
|---|---|
| 定义 | 利用计算机对具体业务进行处理的信息系统 |
| 又称 | 电子数据处理系统(EDP) |
| 基础 | 计算机 + 网络 |
| 功能 | 对业务数据进行采集、存储、检索、加工和传输 |
分类维度:
- 按处理作业方式分类
- 按联机方式分类
- 按系统的组织和数据存储方式分类
- 按面向管理工作的层次分类
例子:银行的 ATM 系统是典型的 TPS------持卡人插入银行卡、输入密码、选择取款,系统实时验证账户余额、扣款、出钞、记录交易日志。整个过程是高度结构化的重复性事务处理,要求高并发、高可靠和事务一致性(不能出现钱扣了但没吐钞的情况)。
8.4 管理信息系统(MIS)
| 项目 | 说明 |
|---|---|
| 定义 | 全面的以计算机为基础的集成化人机系统,具有分析、计划、预测、控制和决策功能 |
| 核心能力 | 将数据处理功能与管理模型的优化计算、仿真等功能结合,提供决策信息 |
| 面向 | 管理层(战术规划),处理结构化或半结构化问题 |
MIS 的特点:
| 特点 | 说明 |
|---|---|
| 以计算机为基础的人机系统 | 计算机处理数据,人做判断和决策 |
| 集成化系统 | 各子系统数据互通,避免信息孤岛 |
| 提供管理信息 | 输出报表和指标,辅助管理者决策 |
| 支持多职能 | 涵盖作业、管理、分析和决策 |
例子:一个企业的 ERP 系统就是典型的 MIS------它集成了财务、采购、生产、仓储、销售、人力资源等模块。当销售部录入一笔订单后,系统自动检查库存 → 不足则触发采购建议 → 安排生产计划 → 核算成本和利润。各部门在统一平台上协作,管理者可随时查看各环节的关键绩效指标(KPI),发现异常(如某产品库存周转天数突然上升)及时调整。
8.5 决策支持系统(DSS)
| 项目 | 说明 |
|---|---|
| 定义 | 计算机科学、行为科学和系统科学相结合的产物,支持半结构化和非结构化决策 |
| 面向 | 高级管理人员的战略规划和宏观决策 |
| 核心能力 | 提供分析问题、构造模型、模拟决策过程、评价决策效果的决策支持环境 |
决策过程三阶段模型:
- 信息阶段:收集和识别问题相关信息
- 设计阶段:构造和分析可能的方案
- 选择阶段:从备选方案中选择最优方案
决策问题类型:
| 类型 | 说明 | 例子 |
|---|---|---|
| 结构化决策 | 规则明确、可编程 | 根据库存低于阈值自动生成采购单 |
| 半结构化决策 | 部分规则明确,部分需判断 | 制定年度预算(有历史数据和公式,但需要根据市场变化调整) |
| 非结构化决策 | 无成熟规则,依赖经验和直觉 | 是否进入新市场、是否收购某公司 |
例子:某零售企业考虑在 A 城市开设 3 个新门店,DSS 发挥作用的过程:
- 信息阶段:DSS 从数据仓库调取 A 城市人口分布、消费水平、竞争对手分布、交通流量等数据,可视化展示。
- 设计阶段:利用选址模型,输入租金、人流量、预计客单价等参数,生成多个候选方案并模拟各方案的 3 年营收预测。
- 选择阶段 :高管对比各方案的 ROI(投资回报率)、风险等指标,结合经验判断最终选定方案。DSS 不做决定,而是提供数据和模型辅助人做决定。
8.6 DSS 的组成
| 子系统 | 功能 |
|---|---|
| 数据库管理子系统 | 存放决策所需数据,具有维护、控制和快速选择抽取数据的能力 |
| 模型库管理子系统 | 存放通用和特殊决策模型,提供非结构化建模语言,支持模型维护和调用 |
| 方法库管理子系统 | 存放各类模型的求解方法和最优化算法,支持方法维护和调用 |
| 知识库管理子系统 | 存放经验决策者的决策知识和推理规则,知识库 + 推理机构成专家系统 |
| 会话子系统 | 提供交互式人机界面 |
例子(各子系统协同工作):上述门店选址决策中------
- 数据库提供人口、租金、竞争对手等原始数据;
- 模型库提供"重力模型"(根据距离和人流预测销售额)和"盈亏平衡模型";
- 方法库提供线性规划、蒙特卡洛模拟等求解算法;
- 知识库存储"如果周边有地铁站,人流量系数 ×1.3"等专家规则;
- 会话子系统以图表、地图、滑块等形式让高管直观地"如果租金涨 10% 会怎样"(What-if 分析)。
8.7 联机分析系统(OLAP)
| 概念 | 说明 |
|---|---|
| OLTP(联机事务处理) | 对操作型数据进行简单的查询、统计、生成报表,不满足决策分析需求 |
| OLAP(联机分析处理) | 针对特定问题的联机数据访问和分析技术,数据经过净化、转换、集成,按**"维"**组织在多维数据库或数据仓库中 |
OLAP 分析工具:
- 多维数据基本操作工具(切片、切块、旋转、上卷、下钻)
- 多维数据查询工具
- 多维数据分析工具
- 预测工具
- 报表和图形生成工具
例子(OLAP 多维分析操作) :某零售企业的销售多维立方体,维度包括时间 (年/季/月)、商品 (品类/品牌/单品)、地区 (大区/省/市),度量包括销售额、利润、销量。
- 切片(Slice):固定时间 = "2024年",只看一个平面 → "2024年各商品在各地区的销售额"。
- 切块(Dice):取时间=2024年 且 地区=华东 → "2024年华东区各商品的销售额"。
- 下钻(Drill-down):从"2024年各季度销售额"下钻到"Q1 各月销售额"。
- 上卷(Roll-up):从"各品牌销售额"上卷到"各品类销售额"汇总。
这些操作在 OLAP 系统中只需拖拽鼠标即可完成,而在传统 SQL 中每次都要重写查询语句。
8.8 数据挖掘系统(Data Mining)
| 项目 | 说明 |
|---|---|
| 定义 | 从大型数据库或数据仓库中提取隐含的、未知的、非平凡的、有潜在应用价值的信息或模式的高级处理过程 |
| 数据来源 | 大型数据库 / 数据仓库 |
| 输出 | 隐含的模式、规则、知识 |
数据挖掘的类型:
| 类型 | 说明 | 例子 |
|---|---|---|
| 预测模型 | 根据历史数据预测未来趋势 | 根据过去 3 年销售数据预测下季度销售额 |
| 关联分析 | 发现数据项之间的关联关系 | "购买尿布的顾客有 70% 也购买啤酒"(购物篮分析) |
| 分类分析 | 将数据分配到预定义的类别中 | 判断一封邮件是"垃圾邮件"还是"正常邮件" |
| 聚类分析 | 将相似数据自动归为一组(无预定义类别) | 根据消费行为将客户分为"高价值""潜力""流失风险"三类 |
| 序列分析 | 发现事件发生的时间顺序模式 | 用户浏览网页 A → B → C → 购买,识别转化路径 |
| 偏差检测 | 发现异常数据 | 信用卡交易中的欺诈检测:突然在异地大额消费 |
| 模式相似性挖掘 | 发现相似的模式 | 寻找走势相似的股票 |
| Web 数据挖掘 | 从 Web 数据中提取模式 | 分析社交媒体情绪预测股价 |
经典例子(关联分析------购物篮分析) :
沃尔玛通过分析数百万条交易记录发现:周五晚上,购买尿布的年轻父亲中,有 30%~40% 同时购买了啤酒。于是超市将啤酒货架移到尿布旁边,两种商品的销量都显著提升。这个有趣的关联规则就是通过数据挖掘的 Apriori 算法发现的。
聚类分析例子:某电商平台根据用户的浏览、收藏、购买行为,通过 K-Means 聚类算法将 100 万用户自动分为 5 个群体------"价格敏感型""品牌忠诚型""冲动消费型""低频浏览型""流失预警型",然后针对不同群体推送不同的优惠策略,如给流失预警型用户发送专属折扣券。
本章小结
本章核心知识框架:
- 数据库基本概念:数据库系统 = DB + DBMS + DBA + 应用程序 + 用户;三级模式体系结构;DBMS 的四层架构(应用层→语言处理层→数据存取层→数据存储层)
- SQL 语言:集 DDL、DML、DCL、嵌入式于一体,核心是数据查询(简单查询、连接查询、嵌套查询)
- 数据定义:CREATE TABLE(建表)、ALTER TABLE(修改表、增删列)、CREATE INDEX(建索引)
- 数据查询:SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY,聚合函数(AVG/SUM/MAX/MIN/COUNT),多表连接(笛卡尔积 + 连接条件),嵌套子查询(IN / EXISTS)
- 数据更新:INSERT(两种形式)、DELETE(删整行)、UPDATE(批量修改)
- 视图:虚拟表,定义时只存 SQL 语句,使用时才从基本表取数,支持查询和受限更新,删除一个视图会级联删除其派生视图
- 新型数据库:分布式数据库、多媒体数据库、并行数据库、演绎数据库、主动数据库、数据仓库
- 数据库应用:TPS(事务处理)→ MIS(管理信息)→ DSS(决策支持);OLAP(多维分析)与数据挖掘(发现隐含模式)