当使用关系模型工作时,我们有2组操作可以使用。其中之一是关系代数。
当使用关系模型工作时,我们有2组可以使用的操作。
第一组被称为关系代数,它是一种程序性语言。
这是SQL的基础,因此学习它非常重要--因为SQL是处理关系型数据库的事实上的标准。
第二种被称为关系微积分,它不是程序性语言,而是一种声明性语言。这是我们与数据库互动的根本区别,因为你不告诉数据库软件做什么,你只是告诉它你想要什么,然后让它找出如何做的细节。
这是编程语言中常见的一种区别。在现代前端,我们说React中与DOM的交互是声明性的。使用vanilla JavaScript来修改DOM是程序性的。
像Datalog、QBE和QUEL这样的语言以关系微积分为基础。我不打算谈论这个,因为我认为与SQL所遵循的更实用的方法相比,它是一种更小众的方式,但如果你想的话,你可以看看它。
鉴于上述介绍,让我们继续讨论关系代数。
我们有2种类型的操作。
- 主操作
- 连接操作
关系代数中的主操作
主要操作是。
- union从两个表中获取数据,产生一个图元的总和,只要这两个表有相同的列和属性类型(域)。
- 差分获得第一个表中的数据,但不包括第二个表中的数据,产生一个图元的差分,只要这两个表有相同的列和属性类型(域)。
- Cartesian product从两个表中获取数据,并生成一个单一的表,根据一个属性值将它们的数据结合起来。
- 选择(select):根据某些标准,只提取一个表中包含的一些图元(行)。
- project生成一个新的表,只包含现有表的一个或多个属性(列)。
- rename用来重命名一个属性,当多个表对不同的数据有相同的名称时,用来防止冲突。
关系代数中的连接操作
连接可能是你能用关系代数进行的最强大的操作。它们建立在主操作之上,允许你将不同关系(表)中的数据关联起来。
注意:我很快就会谈论DBMS中的连接操作,这主要是理论。
我们有2个主要的连接版本:自然连接和Theta连接。所有其他的版本都是从这两个版本中提取出来的。
自然连接
自然连接将两个关系(表)联系起来,并基于相同的属性值创建一个新的表。
我们需要两个具有相同属性名称(列)的关系,首先。然后,如果关系A中的属性值在关系B中的属性中不匹配,那么该行就不是结果的一部分,它被忽略。
例子。
关系A
| 雇员ID | 名称 |
|---|---|
| 1 | 符号 |
| 2 | 托尼 |
| 3 | 里克 |
关系B
| 经理姓名 | 雇员编号 |
|---|---|
| 托德 | 1 |
| 阿尔伯特 | 2 |
我们可以执行一个自然连接,以获得每个雇员的老板姓名。
| 雇员ID | 名称 | 经理姓名 |
|---|---|---|
| 1 | 马克 | 托德 |
| 2 | 托尼 | 艾伯特 |
由于这些关系有共同的Employee ID属性名称,它在结果中只出现一次,而不是2次。
存在于关系A中的雇员3号,Rick,不包括在这个表中,因为关系B中没有相应的条目。
Theta-join
Theta-join允许基于任何标准执行一个连接,以比较两个不同关系中的两列,而不仅仅是像自然连接那样的平等。
它执行两个表的笛卡尔乘积,并根据我们想做的选择过滤结果。
等价连接
等价连接是一个Theta连接,其中的选择是基于两个不同表中的属性值之间的相等。
与自然连接不同的是,我们可以选择我们想要比较的属性名称(列)。
稍后在介绍SQL时,我们将更多地谈论连接,因此我们可以在实践中使用它们。