数据库 (Databases) — A-Level Computer Science 学习指南
适合谁:A-Level Computer Science 参加 A-Level Computer Science 的考生。
覆盖内容:关系型数据库与表结构、主键外键与三范式规范化、核心SQL语句、数据字典与ER图、事务与并发控制五大核心子主题
前置知识:基础编程概念;Python / Java / VB 任一种。
关于练习题:下文「练习题」一节的所有题目均为我们按 A-Level Computer Science 风格编写的原创题目 (original problems),仅用于教学。它们不是 Cambridge International 真题的复制,措辞、数值或语境可能不同。请把它们当作练手用;评分细则请对照 Cambridge 官方 mark scheme。
1. 什么是数据库?
数据库(Database)是结构化存储、管理和访问数据的集合,区别于普通文本文件,它支持高效的增删改查操作,能避免数据冗余、保证数据一致性,是绝大多数信息化系统的核心存储组件。在A-Level Computer Science考纲中,数据库模块占Paper 2和Paper 4总分的15%-20%,是必考的核心知识点,常以SQL编写、规范化设计、ER图绘制的大题形式出现。
2. 关系型数据库与表 (Relational databases and tables)
当前工业界最常用的是关系型数据库(relational database),它以**表(table/关系relation)**为基本存储单元:
- 每一列称为属性(attribute/字段field),代表数据的某一类特征,比如学生表的
stu_id、name、grade - 每一行称为元组(tuple/记录record),代表一条完整的独立数据,比如某一位学生的全部信息
- 每张表都有固定的结构(schema),定义了每一列的数据类型、约束规则
例如学校的学生表结构如下:
| stu_id(INT) | name(VARCHAR(20)) | grade(INT) |
|---|---|---|
| 1001 | 张三 | 12 |
| 1002 | 李四 | 11 |
3. 主键、外键与规范化(1NF,2NF,3NF) (Primary and foreign keys; normalisation)
核心键定义
- 主键(primary key):唯一标识表中每一行的属性,不能为NULL,也不能重复,比如学生表的
stu_id就是主键 - 外键(foreign key):一张表中的属性,引用另一张表的主键,用来建立两张表的关联关系,比如选课表中的
stu_id就是引用学生表stu_id的外键,保证不会出现不存在的学生的选课记录
规范化(normalisation)
规范化是减少表中数据冗余、避免增删改异常的设计方法,考纲要求掌握前三范式:
- 第一范式(1NF):所有属性都是原子值,不能存储多个合并的值,比如不能把「数学,英语」存在同一个课程字段中,必须拆分到多行或多列
- 第二范式(2NF):首先满足1NF,且所有非主键属性完全依赖整个主键,不能只依赖主键的一部分。例如如果主键是(
stu_id,course_id)的复合主键,stu_name只依赖stu_id,不符合2NF,需要拆分出独立的学生表 - 第三范式(3NF):首先满足2NF,且非主键属性之间没有传递依赖。例如学生表中如果同时存
class_id和class_name,class_name依赖class_id,class_id依赖stu_id,属于传递依赖,不符合3NF,需要拆分出独立的班级表
4. 核心SQL语句:SELECT, JOIN, WHERE, GROUP BY
结构化查询语言(SQL, Structured Query Language)是操作关系型数据库的标准语言,考纲要求掌握4类核心操作:
- WHERE条件过滤:用来筛选符合要求的行,例如查询12年级的所有学生姓名:
SELECT name FROM student WHERE grade = 12;
- JOIN多表关联:用来联合查询多张表的数据,最常用的是INNER JOIN(只返回两张表匹配的记录),例如查询每个学生的选课成绩:
SELECT s.name, c.course_name, sc.score
FROM student s
INNER JOIN student_course sc ON s.stu_id = sc.stu_id
INNER JOIN course c ON sc.course_id = c.course_id;
- GROUP BY分组聚合:用来按指定列分组后做统计,常用聚合函数有
COUNT()、SUM()、AVG(),例如统计每个年级的学生人数:
SELECT grade, COUNT(stu_id) AS stu_count
FROM student
GROUP BY grade
HAVING stu_count > 100; -- HAVING用来过滤分组后的聚合结果,和WHERE作用阶段不同
5. 数据字典与ER图 (Data dictionaries and ER diagrams)
数据字典(data dictionary)
数据字典是存储数据库**元数据(metadata)**的表,记录了所有表、字段的定义,例如:
| 表名 | 字段名 | 数据类型 | 约束 | 描述 |
|---|---|---|---|---|
| student | stu_id | INT | PRIMARY KEY | 学生唯一ID |
| student | name | VARCHAR(20) | NOT NULL | 学生姓名 |
实体关系图(ER diagram, Entity-Relationship diagram)
ER图是可视化数据库设计的工具,核心元素:
- 实体(entity):用矩形表示,对应数据库中的表,比如学生、课程
- 属性(attribute):用椭圆表示,对应表的字段,比如学生ID、姓名
- 关系(relationship):用菱形表示,对应实体之间的关联,分为一对一、一对多、多对多三类,多对多关系必须新增中间表拆分为两个一对多关系
6. 事务与并发控制概述 (Transactions and concurrency overview)
**事务(transaction)**是一组不可分割的SQL操作集合,要么全部执行成功,要么全部失败回滚,满足ACID四大特性:
- 原子性(Atomicity):操作是最小单元,不可拆分
- 一致性(Consistency):事务执行前后数据库始终处于合法状态
- 隔离性(Isolation):多个事务并行执行时互不干扰
- 持久性(Durability):事务执行成功后修改永久生效,不会丢失
并发操作可能出现脏读、不可重复读、幻读等问题,一般通过锁机制、事务隔离级别来解决,考纲只要求掌握基础概念,不需要深入实现。
7. 常见陷阱 (Common Pitfalls)
- 错误做法:把外键设置为唯一约束;原因:混淆主键和外键的规则,以为外键也必须唯一;正确做法:外键可以重复,只要引用的主键存在即可,比如多条选课记录可以对应同一个学生ID
- 错误做法:用WHERE过滤GROUP BY后的聚合结果;原因:混淆WHERE和HAVING的执行顺序;正确做法:WHERE在GROUP BY之前执行,过滤原始行,HAVING在GROUP BY之后执行,过滤聚合结果
- 错误做法:ER图中多对多关系直接连接两个实体,不设置中间表;原因:不知道多对多关系无法直接存储;正确做法:多对多关系必须新增中间表,存储两个实体的外键,拆分为两个一对多关系
- 错误做法:认为规范化程度越高越好,必须全部到3NF;原因:忽略了查询性能的需求;正确做法:考试中要求规范化到3NF,实际场景中可以适当保留冗余来减少JOIN操作,提升查询效率
8. 练习题(A-Level Computer Science 风格)
题1
已知三张表:student(stu_id PK, name, grade)、course(course_id PK, course_name)、student_course(stu_id FK, course_id FK, score),请编写SQL语句,查询选了「计算机科学」课程且分数大于80分的学生姓名。
解答
SELECT s.name
FROM student s
INNER JOIN student_course sc ON s.stu_id = sc.stu_id
INNER JOIN course c ON sc.course_id = c.course_id
WHERE c.course_name = '计算机科学' AND sc.score > 80;
题2
给定冗余表stu_info(stu_id, name, class_id, class_name, course_id, course_name, score),主键为(stu_id, course_id),请将其规范化到3NF,写出所有表的结构、主键和外键。
解答
拆分后共4张表:
student(stu_id PK, name, class_id FK):存储学生基础信息,class_id是引用class表的外键class(class_id PK, class_name):存储班级信息course(course_id PK, course_name):存储课程信息student_course(stu_id FK, course_id FK, score):复合主键为(stu_id,course_id),存储选课成绩,两个字段分别是student和course表的外键
题3
解释事务原子性的含义,举一个实际场景的例子。
解答
原子性指事务是不可分割的最小操作单元,包含的所有SQL操作要么全部执行成功,要么全部失败回滚。例子:银行转账操作,从A账户扣100元、给B账户加100元是同一个事务,若扣钱后系统故障,加钱操作未执行,整个事务会回滚,A账户的钱会退回,避免出现金额不一致的问题。
9. 速查表 (Quick Reference Cheatsheet)
| 考点 | 核心要点 |
|---|---|
| 主键 | 唯一标识行,非空、不重复 |
| 外键 | 引用其他表的主键,建立表关联 |
| 1NF | 所有属性为原子值 |
| 2NF | 非主键属性完全依赖整个主键 |
| 3NF | 非主键属性之间无传递依赖 |
| SQL语法 | SELECT 列 FROM 表 WHERE 行过滤 GROUP BY 分组 HAVING 聚合过滤 ORDER BY 排序 |
| ER图元素 | 实体(矩形)、属性(椭圆)、关系(菱形) |
| 事务ACID | 原子性、一致性、隔离性、持久性 |
10. 接下来怎么学
本模块是A-Level Computer Science后续分布式系统、数据处理等内容的基础,在考试中Paper 2常考SQL编写选择题,Paper 4常考规范化设计、ER图绘制的大题,占比约18%,掌握本模块内容也能为你后续学习大数据、后端开发等方向打下基础。
如果你在刷题过程中遇到任何数据库相关的疑问,或者需要更多针对性的练习题,可以随时到小欧提问,我们会为你提供个性化的辅导和解析。
本指南内容对齐 CIE 剑桥国际 AS & A Level 计算机科学 9618 考纲。OwlsAi 与 Cambridge Assessment International Education 无附属关系。