4.关系代数
介绍
- Query languages(QL):QL 用来从数据库中检索数据
- Relational model 关系模型支撑简单强大的QL
- 基于逻辑的形式基础
- 允许进行很多优化
- Query language != programming languages
- QL 不是一门编程语言,不是为了做复杂的运算而设计,而是提供了访问数据集高效简洁的方法
- 两种数学语言构成了 SQL 的基础
- 关系代数:过程化语言,对于表示查询的执行计划非常有用
- 关系演算:让用户描述他们想要什么,而不是如何计算它(声明式语言)
基本操作
- Projection(投影,p):在 relation 中删除不需要的列
- Selection(选择,s):从 relation 中选择行的子集
- Set-difference(差集,-):选取两个 relation 的差集
- Union(并,U):选取两个 relation 的并集
- Cross-product( X ):两个集合的笛卡尔乘积
- Rename( p ):允许我们重命名关系和/或其属性
- 附加操作
- Intersection 交集
- Join 连接
- Division 除法:非必要但好用
投影
- 把 R 中没有出现在列表 L 里的属性删除
- 运算结果的 scheme 完全包含投影列表 L 中的字段,其名称与在 R 中的名称相同
- 会对得到的结果进行消重
选择
- 选择满足选择条件的行(记录/元组)c,行变列不变
- c 的条件拥有这样的形式:Term Op Term
- Term 表示一个属性名字或者常数
- OP 可以是 <、> 、=、≠ ......
- 用逻辑运算符连接多个条件
- (C1 Λ C2), (C1 V C2), (¬ C1) 也是(复合)条件。
- 例子
- 结果是原来数据集的子集,所以不可能存在重复记录
- 运算的嵌套
集合运算
- Union,Intersection,Set-Difference
- 这三个运算接收的两个 relation 必须是可求并的
- 属性的数量一样
- 对应的属性拥有相同类型
- 输出是单个关系(不包含重复项)
笛卡尔乘积
- 将一个表的每一行与另一个表的每一行合并
- Can_fly × Plane
连接
- 产生所有可能的连接并不实用
- 关联相同指代的记录才有意义。例如航班表中 CA101 的起飞信息和设备表中 CA101 的型号信息
- Join 是一个附带 selection 的笛卡尔积
- 用 Join 或者
都可以
- 连接的方式
- Theta-join:条件可以是任意的逻辑表达式
- Equi-join:条件均为等式
- 自然连接 Natural joi(也叫等值连接)n:连接具有在两表中相同属性具有相同值的记录
- equi-join 和 natural-join 这两种 join 会去掉重复的列
θ连接例子
- 我们使用条件将该表与其自身相连(自连接):Flight1.Dest =Flight2.Origin ^ Flight1.Arr_Time < Flight2.Dept_Time
自然连接例子
- 百度百科例子:
重命名 ρ
- R'代替 R,
,只是名字变,内容不变
- 例如:r ( Staff ( Name -> Family_Name, Salary -> Gross_salary ), Employee )
- 当累乘同一个表格的时候,会出现相同的属性名,这时候就需要这个重命名操作
Division
假设 A 有两个属性 x、y,B 有一个属性 y
- A / B 包含的元组满足:对于 B 中的每个 y 元组,A 中都有一个 xy 元组
- 例子:找出 SAI 学院中选了所有课程的学生 ID
附加:外连接
- 一种防止信息丢失的 join,保留在连接中没有匹配上的记录
- 只返回匹配到的记录,遗失掉一些记录
- 贷款 L-260 没有借款人这一事实在结果中并不明确
- Hayes借了一笔不存在的贷款L-155也未被发现
- 左外连接
- 保留左边 relation 中未匹配的记录 ,并用 null 表示未匹配属性的值
- 右外连接
- 保留左边 relation 中未匹配的记录 ,并用 null 表示未匹配属性的值
- 全外连接
- 保留左右两边relation中未匹配的纪录,并用null表示未匹配属性的值。