期末复习-数据库原理(全英教材)
目录
第二章:关系模型
1.Candidate key
2.superKey
3.关系代数表达式
选择(Selection):
投影(Projection):
自然连接(Natural Join):
笛卡尔积(Cartesian Product):
并集(Union):
练习:
第二章:关系模型
考试范围: 2.1 -2.6
考试内容:
1.关系模型的基本概念
Relation, Relation schema, Relation instance, attribute, tuple, Database schema, Database instance, Superkey, Candidate Key, Primary Key等。
考试题型: 计算题、综合题
知识点如下:
1.Candidate key
Candidate key:在数据库中,Candidate Key(候选键)是指能够唯一标识表中每一行数据的最小属性集合。换句话说,候选键是一组属性,这些属性组合起来可以作为表的主键,用来区分表中的每一行记录。
候选键具有以下特点:
唯一性:候选键中的属性组合必须能够唯一标识表中的每一条记录。
最小性:候选键是最小的属性集合,这意味着没有候选键中的任何一个属性可以被移除而不失去唯一标识的能力。
可选性:一个表可以有多个候选键,每个候选键都可以作为主键使用。
例如,假设有一个学生表,包含“学号”和“姓名”两个字段。如果“学号”字段已经能够唯一标识每个学生,那么“学号”就是一个候选键。如果“姓名”字段不能唯一标识每个学生(因为可能有同名的学生),那么“姓名”单独就不能作为候选键。
在实际应用中,数据库设计者会从候选键中选择一个作为表的主键(Primary Key),并且通常会为这个主键创建索引,以提高查询效率。选择哪个候选键作为主键可能会基于性能、业务逻辑和数据完整性等因素。
2.superKey
superKey:在数据库理论中,SuperKey(超键)是指能够唯一标识数据库表中每一行记录的属性集合。超键的定义比候选键(Candidate Key)更广泛,因为超键可以包含一些不必要的属性,即使它们不是最小集合,也能确保记录的唯一性。
超键的特点:
唯一性:超键中的属性组合必须能够唯一标识表中的每一条记录。
冗余性:超键可能包含一些不必要的属性,这些属性对于区分记录来说并不是必需的。
包含候选键:任何候选键都是超键,但不是所有的超键都是候选键。
超键的例子:
假设有一个学生表,包含以下字段:
学号(StudentID)
姓名(Name)
出生日期(DOB)
专业(Major)
在这个例子中:
学号:如果学号是唯一的,那么它是一个候选键,也是超键。
学号 + 姓名:即使姓名不是必需的,因为学号已经足够唯一标识每条记录,这个组合仍然是一个超键。
姓名 + 出生日期 + 专业:如果这个组合可以唯一标识每条记录,那么它也是一个超键。但如果这个组合实际上是一个候选键,那么它就是最小超键。
超键与候选键的区别:
候选键是最小的超键,即没有冗余属性的超键。
超键可以包含额外的属性,这些属性对于区分记录来说并不是必需的。
在数据库设计中,了解超键的概念很重要,因为它有助于识别和选择适当的主键(Primary Key)。主键通常是从候选键中选择的,以确保数据的唯一性和最小冗余。超键的概念也有助于理解数据库的完整性约束,如实体完整性和参照完整性。
3.关系代数表达式
选择(Selection):
假设有一个名为 employees 的表,包含员工的 ID, Name, 和 Salary。
员工信息表
ID | Name | Salary |
1 | Alice | 70000 |
2 | Bob | 80000 |
3 | Charlie | 90000 |
4 | David | 85000 |
选择操作:σ_Salary≥80000(employees)
结果:
员工信息表
ID | Name | Salary |
2 | Bob | 80000 |
3 | Charlie | 90000 |
投影(Projection):
使用相同的 employees 表,如果我们只想要 Name 和 Salary。
投影操作:Π_Name, Salary(employees)
结果:
员工薪资表
Name | Salary |
Alice | 70000 |
Bob | 80000 |
Charlie | 90000 |
David | 85000 |
自然连接(Natural Join):
假设有两个表,employees 和 departments,它们都有一个共同的属性 DepartmentID。
员工信息表
ID | Name | DepartmentID |
1 | Alice | 101 |
部门信息表
DepartmentID | DepartmentName |
101 | HR |
自然连接操作:employees ⨝ departments
结果:
员工信息表
ID | Name | DepartmentID | DepartmentName |
1 | Alice | 101 | HR |
笛卡尔积(Cartesian Product):
使用 employees 表和 departments 表。
笛卡尔积操作:employees × departments
结果:
员工信息表
ID | Name | DepartmentID | DepartmentID | DepartmentName |
1 | Alice | 101 | 101 | HR |
1 | Alice | 101 | 102 | IT |
(这个结果会包含 employees 表中每行与 departments 表中每行的组合)
并集(Union):
假设有两个表,instructor 和 student,它们都有一个 Name 属性。
instructor 表
Name |
Alice |
student表
Name |
Bob |
并集操作:Π_Name(instructor) ∪ Π_Name(student)
结果:
Name |
Alice |
Bob |
(这个结果会包含 instructor 表和 student 表中 Name 属性的所有不同值)
练习:
- 查找居住在 "Miami" 城市的员工姓名:
答:
1)首先,我们需要从 Employee 表中选择居住在 "Miami" 的员工。这可以通过选择操作来完成。
2)表达式:Πperson_name(σcity='Miami'(Employee))
3)这个表达式首先在 Employee 表上应用选择操作,筛选出 city 为 "Miami" 的行,然后通过投影操作获取 person_name 列。
b. 查找工资大于 $100,000 的员工姓名:
答:
1)这个查询涉及到 Works 表,我们需要选择工资大于 $100,000 的记录,然后投影出 person_name。
2)表达式:Πperson_name(σsalary>100000(Works))
3)这个表达式在 Works 表上应用选择操作,筛选出 salary 大于 $100,000 的行,然后通过投影操作获取 person_name 列。
c. 查找居住在 "Miami" 且工资大于 $100,000 的员工姓名:
答:
1)这个查询需要结合前两个查询的条件,并且需要连接 Employee 和 Works 表来获取员工的居住城市和工资信息。
2)首先,我们需要将 Employee 表和 Works 表通过 person_name 进行自然连接,然后选择居住在 "Miami" 且工资大于 $100,000 的记录,最后投影出 person_name。
3)表达式:Πperson_name(σcity='Miami' ∧ salary>100000(Employee ⨝ Works))
4)这个表达式首先通过自然连接操作将 Employee 和 Works 表连接,然后应用选择操作筛选出满足条件的记录,最后通过投影操作获取 person_name 列。