您还记得设定理论吗?您可能在小学中学到的数学话题,在高中重新审视,
那再也不会吗?好吧,是时候重新审视它了。关系代数是一种基于集合理论的形式语言,它是
目的是查询和操纵数据。
为什么我需要知道这一点?
关系代数是SQL的基础,SQL是关系数据库中使用的主要语言。关系代数也可以具有
NOSQL数据库中的某些应用程序。如果您想了解数据库在“引擎盖下”的工作方式,则需要知道
关系代数的主要概念
什么是关系代数?
关系代数是用于查询和操纵数据的声明语言。作为SQL,您只需指定您的哪些数据
想要,应该满足的条件以及应如何转换(分组,分类,汇总等)。数据库
引擎将照顾其余的,因此您不必担心数据的存储方式,也不需要如何访问。
在上面的图像中,我们有一个女人想点披萨。她不知道如何制作披萨,她不知道
如何烹饪,她不知道如何交付它。她只是知道自己想要什么,并且知道该怎么要求。
服务员是SQL/关系代数引擎,他是女人和厨师之间的界面。厨师是数据库
引擎,他了解服务员通过的命令,他知道如何制作披萨。
声明的查询语言通常会向用户隐藏实现详细信息。这是一件好事,因为它允许
数据库引擎以优化查询执行,并且还允许用户专注于数据,而不是
访问它所需的算法。
SQL类比
如何在SQL中订购披萨:
SELECT * FROM pizza
WHERE size = 'large'
AND flavor = 'pepperoni';
如何在关系代数中订购披萨:
关系代数操作
数学家和计算机科学家Ted Codd提出了八项关系代数的操作。这些操作是:
- 选择(!)
- 投影(!)
- 笛卡尔产品(â) <¥unice(惹) l>
- 差异( - )
- 加入()
- 分区(â·)
- 交叉点(©)
在本文中,我们将仅介绍前六个操作。其他四个更为先进,并且不是广泛使用的
在实践中。
在我们深入研究每个操作的详细信息之前,让我们定义数据集。我们将使用一个带有两个表的简单数据集:
表1:球员
id | 名称 | 电子邮件 | 电话 | countryid |
---|---|---|---|---|
1 | 莱昂内尔·梅西 | leomessi@afa.com | +54 9111234-5678 | 1 |
2 | Cristiano Ronaldo | cr7@siii.pt | +351 912345-678 | 2 |
3 | plee td> | pele@goat.br | +55 91234-5678 | 3 |
4 | 迭戈·马拉多纳 | maradona@afa.com | +54 911234-5678 | 1 |
表2:国家
id | 名称 | 代码 |
---|---|---|
1 | 阿根廷 | ar |
2 | 葡萄牙 | PT |
3 | 巴西 | br |
选择(!)
选择操作用于过滤表的行。它由符号表示。
The condition is a boolean expression that must be satisfied by the rows of the table. The result of the selection is a new (SET)
table with only the rows that satisfy the condition.
例子
假设我们想从阿根廷选择所有球员。我们可以通过以下查询来做到这一点:
SELECT * FROM players
WHERE countryId = 1;
关系代数中的等效查询是:
选择的结果是一张新表,只有来自阿根廷的球员:
id | 名称 | 电子邮件 | 电话 | countryid |
---|---|---|---|---|
1 | 莱昂内尔·梅西 | leomessi@afa.com | +54 9111234-5678 | 1 |
4 | 迭戈·马拉多纳 | maradona@afa.com | +54 911234-5678 | 1 |
投影(!)
项目操作选择列,而不是选择行,而是像选择操作一样选择列。它由符号表示。此操作
允许我们过滤表的列。
The columns argument is a list of column names. The result of the projection is a new table with only the columns specified in the columns argument.
例子
当我们只想从表中选择几个列时,投影非常有用。假设我们要选择所有玩家的名称和电子邮件。SELECT name, email FROM players;
关系代数中的等效查询是:
投影的结果是一个新表,只有名称和电子邮件列:
名称 | 电子邮件 |
---|---|
莱昂内尔·梅西 | leomessi@afa.com |
Cristiano Ronaldo | cr7@siii.pt |
plee td> | pele@goat.br |
迭戈·马拉多纳 | maradona@afa.com |
我们还可以结合选择和投影操作。假设我们想选择来自阿根廷的所有玩家的名称和电子邮件。
SELECT name, email FROM players
WHERE countryId = 1;
关系代数中的等效查询是:
In the expression above, we first apply the projection operation, to specify which columns we want to be returned by the query.
Then, we apply the selection operation, to filter the rows of the table, containing only argentinian players.
联盟(ª)
联合操作等效于SQL Union Operator。它用于组合两个表的行。联合操作的结果是一个新的表,并带有两张表的行。
假设我们想结合来自阿根廷和巴西的球员。我们可以通过以下查询来做到这一点:
SELECT * FROM players
WHERE countryId = 1
UNION
SELECT * FROM players
WHERE countryId = 3;
关系代数中的等效查询是:
在上面的表达式中,我们首先查询来自阿根廷的玩家,然后将结果存储在Argentinian_players变量中。
从巴西的玩家重复了相同的过程,结果存储在巴西_players变量中。最后,我们应用联合操作以结合两张表的行。
工会行动的结果是一张新桌子,来自阿根廷和巴西的球员:
id | 名称 | 电子邮件 | 电话 | countryid |
---|---|---|---|---|
1 | 莱昂内尔·梅西 | leomessi@afa.com | +54 9111234-5678 | 1 |
4 | 迭戈·马拉多纳 | maradona@afa.com | +54 911234-5678 | 1 |
3 | plee td> | pele@goat.br | +55 91234-5678 | 3 |
不同之处 (-)
使用差异运算符,我们的结果是第二个表中不存在的第一个表的行。它由符号 - 。
表示子集$ a $中存在的所有内容,并且在超集$ b $中不存在是$ a $ a $和$ b $之间的差异。
您可能已经看到这样的图像:
例子
假设我们想让所有不是巴西的球员。我们可以通过以下查询来做到这一点:
SELECT * FROM players
EXCEPT
SELECT * FROM players
WHERE countryId = 3;
关系代数中的等效查询是:
笛卡尔产品(â)
笛卡尔产品操作等效于SQL交叉联接操作员。它用于组合行
和两个表的列。例如,如果您有一个带有3列的表“ A”和一个带有2列的表“ B”,
笛卡尔产品操作的结果是一张新表,有5列,其中包含
的每一个组合
表“ A”和表“ B”的行。
要执行联接操作,表必须至少具有一个共同的一列。如果没有通用的列,则联接操作的结果是一个空表。
例子
假设我们想获得所有玩家的名称和电子邮件,以及他们来自的国家的名字。我们可以通过以下查询来做到这一点:
SELECT players.name, players.email, countries.name, clubs.name
FROM players
JOIN countries ON players.countryId = countries.id;
关系代数中的等效查询是:
在上面的表达式中,我们首先应用投影操作,以指定我们希望通过查询返回的列。
然后,我们使用联接操作,根据CountryId列组合玩家表和国家表的行。
最后,我们应用重命名操作,将ID列重命名为CountryId。
加入操作的结果是一张新表,所有玩家的名称,电子邮件和国家名称:
名称 | 电子邮件 | 乡村名称 |
---|---|---|
莱昂内尔·梅西 | leomessi@afa.com | 阿根廷 |
Cristiano Ronaldo | cr7@siii.pt | 葡萄牙 |
plee td> | pele@goat.br | 巴西 |
迭戈·马拉多纳 | maradona@afa.com | 阿根廷 |
结论
现在您已经知道了关系代数的基础。如果需要,您可以对该主题进行一些额外的研究,并了解有关关系代数中可用的其他操作。