数据库系统笔记 - chap2 - 关系模型

发布时间 2023-10-16 18:36:13作者: BeyondLimits

关系数据结构

5.png

关系代数

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)

行视角,选择出符合条件的若干元祖集合。

2023-10-04-21.47.03.png

符号: \(\sigma_F(R)\)
举例: \(\sigma_{Name = 'qaq'}(R)\)
SQL写法: SELECT * FROM R WHERE Name = 'qaq'

投影(Projection)

列视角,选择出若干属性列组成新的关系。

2023-10-04-21.47.14.png

符号: \(\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)

18.png

2023-10-04-21.54.21.png

符号: \(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)
);