2 关系代数
2.1 基本概念
| 关系模型 | 一般称呼 |
|---|---|
| 关系模式 | 表头 |
| 关系名 | 表名 |
| 关系 | 二维表 |
| 元组 | 行/记录 |
| 属性 | 列 |
| 属性名 | 列名 |
| 属性值 | 列值 |
| 分量 | 一条记录的一个列值 |
关系模式:\(R(A_1,A_2,\ldots,A_n)\),如火车票记录(乘客,车次,......)
属性:有属性名和属性域定义,有属性值赋给每一个元组
元组:给定的R的一次取值,记为\(t(a_1,a_2,\ldots,a_n),a_i\in Dom(A_i)\),\(R=\{t|a_i\in Dom(A_i)\}\)
超键:任一个属性组\((A_i,A_j,A_k,...)\)称为一个键,能在关系中唯一标识一个元组的键称为超键
候选键:不含多余属性的超键,任去一个都不能称为超键
主键:选定的一个候选键
外键:派生关系的属性组,是主关系的主键,这个属性组是派生关系的外键
2.2 关系完整性约束
实体完整性约束(主键)
- 主键的任意属性不能取空值
- 主键的取值组合不能重复
参照完整性约束(外键)
- 删除规则:一个实体A被另一个实体B引用,那么禁止删除A实体
- 插入规则:被引用的元素必须在数据库中存在
用户定义完整性约束
用户自己定义的特殊约束
如:非空约束,唯一约束
自增长约束(auto_increment)
自动生成一个唯一的值用作新数据的值,一般作为主键
检查约束(check(条件))
自己定义
默认约束(default value)
跟在表的属性定义之后
2.3 关系运算
计算优先级:从左到右,有括号先括号
2.3.1 基本关系代数
选择:从关系R中获取满足条件的元组,p是谓词逻辑
\[
\sigma_p(R)=\{t|t\in R \and p(t)\}
\]
投影:从R中获取某些列组成新的关系(从k个属性中取n个属性)
\[
\Pi_{A_1,A_2,\ldots ,A_n}=\{t[A_1,A_2,\ldots, A_n]|t\in R\}
\]
并:两个关系取并集
R,S的属性个数相同,属性存在一一对应关系,每个属性的域相同
Union 元组不可重复;Union all 元组可以重复
差操作同理
笛卡尔积:与离散数学相同
\[
R\times S = \{(t,q)|t\in R \and q\in S\}
\]
\(|R\times S|=|R|\times |S|\)
重命名:将关系R重命名为关系S,同时将各个属性重命名为\(A_i\)
\[
\rho_S(A_1,A_2,\ldots, A_n)(R)
\]
若是\(\rho_S(R)\),则不改变属性名
2.3.2 附加关系代数
交:不是基本运算,可以用\(A-(A-B)\)得到
\[
R\cap S=R-(R-S)
\]
用韦恩图看看,可以求不同运算
连接:笛卡尔积加选择加投影
\[
R\Join_pS=\{(t,q)|t\in R\and q\in S\and p\left((t,q)\right)\}
\]
p是选择谓词
等值连接:某两个属性值要相等
自然连接:将同一个属性中属性值相同的做等值连接
\[
R\Join S
\]
外连接:特殊的自然连接,可以处理缺省值
左外连接:\(R ⟕ S\),保留左侧的属性值,若右侧没有左侧的某个值,则用NULL缺省,若左侧不存在右侧的值,则不搬运右侧的值
右外连接:\(R⟖S\),同理
全外连接:\(R⟗S\),两边都保留,即使重复了
例:
| A1 | B1 | A2 | C2 |
|---|---|---|---|
| 1 | A | 1 | D |
| 1 | B | 2 | E |
| 3 | C | 4 | F |
表1左外连接表2得到
| A | B | C |
|---|---|---|
| 1 | A | D |
| 1 | B | D |
| 3 | C | NULL |
表1右外连接表2得到
| A | B | C |
|---|---|---|
| 1 | A | D |
| 1 | B | D |
| 2 | NULL | E |
| 4 | NULL | F |
表1全外连接表2得到
| A | B | C |
|---|---|---|
| 1 | A | D |
| 1 | B | D |
| 3 | C | NULL |
| 1 | A | D |
| 1 | B | D |
| 2 | NULL | E |
| 4 | NULL | F |
赋值:A\(\leftarrow\)E,其中E是关系运算,A是一个关系
除:\(R\div S\),留下S中没有的,R中存在的属性,只保留能完全保留S中的属性的值的其余属性值;S中存在R中没有的属性,不能除
| A_R | B_R |
|---|---|
| a | 1 |
| a | 2 |
| a | 3 |
| b | 1 |
| b | 2 |
| B_S |
|---|
| 1 |
| 2 |
| 3 |
| A_R/S |
|---|
| a |
当R中的每一个A都有所有的B时(能整除),除和笛卡尔积为逆运算
2.3.3 扩展关系代数
广义投影:允许用算术运算和字符串函数对投影进行扩展
\[
\Pi_{F_1,F_2,\ldots ,F_n}(R)=\{t[B_1,B_2,\ldots, B_m]|t\in R\}
\]
F是对B的运算
聚合:相当于EXCEL的筛选,可以用max,count,average等
\[
\mathcal{G}_{F_1(A_1),F_2(A_2),\ldots,F_n(A_n)}(R)
\]
F为对属性的具体操作,A为属性
分组:先少选某些属性的值,进行分组,再聚和,相当于pandas的groupby()
\[
_{G_1,G_2,\ldots,G_n}\mathcal{G}_{F_1(A_1),F_2(A_2),\ldots,F_k(A_k)}(R)
\]
G为分组用的属性,在所有G上取值相同的将分为一组
排序:字面意思
\[
\tau_{A_1,A_2,\ldots,A_n}(R)
\]
A是排序的属性,若前一个属性相同,则按后一个属性排序