数据库系统笔记 - chap2 - 关系模型
关系数据结构
关系代数
A set of fundamental operations to retrieve and manipulate tuples in a relation.
These operations take one or some relations as inputs, and outputs a new relation.
并、交、差、笛卡尔积与集合运算相似。
选择(Select)
行视角,选择出符合条件的若干元祖集合。
符号: \(\sigma_F(R)\)
举例: \(\sigma_{Name = 'qaq'}(R)\)
SQL写法: SELECT * FROM R WHERE Name = 'qaq'
投影(Projection)
列视角,选择出若干属性列组成新的关系。
符号: \(\Pi_{A_1, A_2, ..., A_m}(R)\)
举例: \(\Pi_{Name, id}(\sigma_{Name = 'qaq'}(R))\)
SQL写法: SELECT Name, id FROM R WHERE Name = 'qaq'
投影运算会把新关系中的重复行删去(集合的不可重原则)。
连接(Join)
符号: \(R \Join S _{A \theta B}\)
其中 \(A, B\) 是 \(R\) 与 \(S\) 上的度数相等且可比较的属性组,\(\theta\) 是比较运算符。
SQL: SELECT * FROM R JOIN S USING (ATTRIBUTE1, ATTRIBUTE2, ...)
若 \(\theta\) 为 \(=\),则叫做等值连接。
自然连接是一种特殊的等值连接,只不过是在等值连接的基础上去掉结果中重复的属性列。
关系的完整性
关系的完整性约束是对关系正确性的限定。关系的完整性分为实体完整性、参照完整性和用户定义完整性。
实体完整性
由于主码 Primary Key
是区分实体的唯一性标识,所以关系 \(R\) 的主码不能取空值 NULL
(若主码由多个属性构成,则所有这些属性都不能取空值)。
CREATE TABLE Student (
Sno CHAR(9) PRIMARY KEY, // 列级
Sname CHAR(8),
Ssex CHAR(2) CHECK(Ssex IN ('男', '女')),
);
CREATE TABLE Student (
Sno CHAR(9),
Sname CHAR(8),
Ssex CHAR(2) CHECK(Ssex IN ('男', '女')),
PRIMARY KEY (Sno) // 表级
);
CREATE TABLE SC (
Sno CHAR(5),
Cno CHAR(3),
Grade int,
PRIMARY KEY (Sno, Cno) // 表级,且只能是表级
);
参照完整性
参照完整性定义了外码 Foreign Key
与主码之间的引用规则,即外码的取值要么是 NULL
(若外码包含多个属性,则这些属性的值均取 NULL
;但假如外码中的属性是主属性,则不能取 NULL
),要么是被参照关系中某元组在该属性的取值。(“你从别人那里引用到的任何值,别人得有才能给你引用”)
CREATE TABLE SC (
Sno CHAR(5),
Cno CHAR(3),
Grade int,
PRIMARY KEY (Sno, Cno), // 表级定义实体完整性
FOREIGN KEY (Sno) REFERENCES S(Sno), //表级定义参照完整性
FOREIGN KEY (Cno) REFERENCES C(Cno) //表级定义参照完整性
);
用户定义完整性
用户规定数据必须满足的一系列要求,包括属性上的约束与元组上的约束。
属性上的约束
CREATE TABLE SC (
Sno CHAR(5) NOT NULL // 约束 Sno 非空
Cno CHAR(9) UNIQUE NOT NULL, // 约束 Cno 唯一且非空
Age SMALLINT CHECK (Age >= 18 AND Age <= 23), // 约束 Age 的范围在 [18, 23] 之间
PRIMARY KEY (Sno, Cno),
);
元组上的约束
可以在元组层面上限制不同属性之间的取值以及相互约束关系。
CREATE TABLE Student(
Sno CHAR(9),
Sname CHAR(8) NOT NULL,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20),
PRIMARY KEY (Sno),
CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%') // 约束了学生性别为男时,其名字不能以 Ms. 开头
);
完整性约束命名子句
CONSTRAINT <完整性约束条件名> <完整性约束条件>
<完整性约束条件>
包括 NOT NULL
, UNIQUE
, PRIMARY KEY
, FOREIGN KEY
, CHECK
短语等。
CREATE TABLE Student(
Sno NUMERIC(6)
CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
Sname CHAR(20)
CONSTRAINT C2 NOT NULL,
Sage NUMERIC(3)
CONSTRAINT C3 CHECK (Sage < 30),
Ssex CHAR(2)
CONSTRAINT C4 CHECK (Ssex IN ('男','女')),
CONSTRAINT StudentKey PRIMARY KEY(Sno),
CONSTRAINT SnameKey FOREIGN KEY(Sname) REFERENCES C(Sname)
);