DBS note5:Relational Algebra(关系代数)

news2024/9/22 1:55:41

目录

一、关系代数简介

二、Projection ()

三、Selection ()

四、Union ()

五、Set Difference (-)

六、Intersection ()

七、Cross Product ()

八、Joins ()

九、Rename ()

十、Group By / Aggregation ()


一、关系代数简介

关系代数中的所有运算符都接受一个关系并输出一个关系。一个基本的查询看起来像这样:

$\pi_{name}(dogs)$

π 运算符选择它希望传递给下一个运算符的列(就像 SQL 的 SELECT)。在这种情况下,该运算符将 dogs 关系作为参数,并返回仅具有 dogs 关系的 name 列的关系。关于关系代数的一个重要事实是,关系是元组的集合,这意味着它们不能包含重复项。如果 dogs 关系最初是:

上面的查询将返回:

一开始,两个“Buster”是不同的,因为它们有不同的年龄,但是一旦去掉“age”列,它们就成了重复的,所以输出关系中只剩下一个。下面正式介绍关系代数运算符。

二、Projection ($\pi$)

我们已经接触过投影运算符,该运算符接受一个关系作为输入,并仅选择指定的列。列是在运算符的下标中指定的,就像几乎所有运算符的参数一样。投影的输出模式由列列表的模式确定。投影运算符是关系代数中对应 SQL SELECT 子句的运算符

我们现在可以用关系代数表达仅涉及 SELECT 和 FROM 子句的 SQL 查询。例如,SQL 查询:

 SELECT name FROM dogs;    

可以表示为:

$\pi_{name}(dogs)$

请注意,关系代数中没有与 FROM 运算符等效的运算符,因为这些运算符的参数指定我们从哪些表中提取数据。

三、Selection ($\sigma$)

选择运算符接收一个关系,并根据特定条件筛选行。输出模式将与输入模式相同,且选择运算符不需要进行重复消除。不要让名称混淆你 —— 这个运算符相当于 SQL 的 WHERE 子句,而不是它的 SELECT 子句。让我们尝试用关系代数来表达以下查询:

SELECT name, age FROM dogs WHERE age = 12;

等价的关系代数表达式是:

$\sigma_{age=12}(\pi_{name,age}(dogs))$

另外一个正确的表达查询是:

$\pi_{name,age}(\sigma_{age=12}(dogs))$

这展示了关系代数的美妙之处。对于查询尝试实现的目标,编写 SQL 只有一种(合理的)方式,但是我们可以提出多个在关系代数中得到相同结果的不同表达式。

在第一个表达式中,我们首先选择我们想要的列,然后过滤掉我们不想要的行。

在第二个表达式中,我们首先过滤行,然后选择列。

选择运算符还支持复合谓词。符号 $\wedge$ 对应于 SQL 中的 AND 关键字,符号 $\vee$ 对应于 OR 关键字。例如,

SELECT name, age FROM dogs WHERE age = 12 AND name = 'Timmy';

等价于:

$\pi_{name,age}(\sigma_{age=12 \wedge name='Timmy'}(dogs))$

四、Union ($\cup$)

我们将学习如何使用并运算符将不同关系的数据合并在一起的第一种方式是使用并运算符。就像 SQL 中的 UNION 子句一样,我们从每个元组中取出所有行并将它们组合在一起,同时去除重复项。例如,假设我们有一个 dogs 表:

一个如下所示的 cats 表:

表达式如下:

$\pi_{name}(dogs) \cup \pi_{name}(cats)$

其会返回:

注意 Garfield 只出现了一次,因为关系是元组的集合,因此会去重。此外,需要注意的是,所有这些集合运算符的一个规则是它们必须在具有相同数量的属性(列)的关系上进行操作,并且相应位置上的属性必须具有相同的类型。不能对具有两列的关系进行联合操作,而只有一个列的关系,也不能对一个包含字符串列的关系进行联合操作,而另一个只包含整数列。

五、Set Difference (-)

另一个集合运算符是集合差运算符。与联合操作一样,输入的两个关系必须是兼容的(列必须以相同的顺序和相同的类型排列)。集合差运算等同于 SQL 子句 EXCEPT。它返回第一个表中的每一行,除了也出现在第二个表中的行。与选择类似,对于集合差运算,不需要去重。如果运行:

$\pi_{name}(dogs)-\pi_{name}(cats)$

在前一部分介绍的 dogs 和 cats 表上运行的表达式将得到:

Garfield 没有出现,因为他在 cats 表中,并且输出中只有在第一个关系(dogs)的行才有可能出现。

六、Intersection ($\cap$)

Intersection 与 INTERSECT SQL 操作符相似,它仅保留在交集中同时出现在两个表中的行。如果运行:

$\pi_{name}(dogs) \cap \pi_{name}(cats)$

在第 5 节介绍的表上运行,你将得到:

因为 Garfield 是唯一在两个表中都出现的名字。

七、Cross Product ($\times$)

交叉乘积运算符就像在 SQL 中执行笛卡尔积一样。输出是来自两个关系的每对元组的一个元组。两个输入关系的模式不必兼容,因为交叉乘积直接将它们连接起来。不需要消除重复项,因为不会生成重复项。例如,假设我们有一个 dogs 表:

和一个 parks 表:

这个查询的关系代数等价表达式是:

SELECT * FROM dogs, parks;

$dogs \times parks$

输出为:

事实上,直积(×)是内连接的基础。

八、Joins (\bowtie)

要将两个表进行内连接,将左表写在运算符的左侧,将连接条件放在下标中,然后将右表放在右侧。要在名字列上将 cats 表与 dogs 表连接在一起,可以这样写:

cats \bowtie_{cats.name=dogs.name} dogs

如果你不指定连接条件,它将成为一个自然连接。回顾一下 SQL 的笔记,自然连接将每个具有相同名称的表的所有列连接在一起。因此,你也可以这样写相同的查询:

cats \bowtie dogs

从形式上讲,我们将内连接运算符称为 Theta Join(\bowtie_\theta)。\theta 是指连接条件,因此对于上面的表达式,连接条件是:

cats.name=dogs.name

\bowtie 运算符执行内连接,至于派生出的右连接、左连接和全外连接的方法,超出了我们基础学习的范畴。

就像选择运算符 $\sigma$ 一样,连接运算符 \bowtie 也支持复合谓词运算符 \wedge(AND)和 \vee(OR)。

Theta 连接和自然连接实际上可以从交叉乘积($\times$)和选择的合取($\sigma$)派生出来。例如,

cats \bowtie_\theta dogs

可以被写成:

$\sigma_\theta(cats \times dogs)$

而自然连接:

cats \bowtie dogs

可以被写成:

$\sigma_{cats.col1=dogs.col1 \wedge ... \wedge cats.colN=dogs.colN }(cats \times dogs)$

九、Rename (\rho)

重命名运算符本质上实现了 SQL 中的别名。它用于通过重命名关系和/或它们的属性来更改模式。例如,如果我们想避免在表达式的其余部分中包含表名,就像在连接部分的表达式中一样,可以改为编写:

cats \bowtie_{name=dname\ \rho_{name->dname}} dogs

此表达式将 dogs 关系的名称列首先重命名为 dname,因此列名称不再冲突。

我们不能再使用自然连接,因为列不再具有相同的名称,但如果要包含其他运算符,则无需指定列来自哪个关系。

十、Group By / Aggregation (\gamma)

最后一个关系代数运算符是 group by / aggregation 运算符,它基本上相当于在 SQL 中使用 GROUP BY 和 HAVING 子句。例如,SQL 查询:

SELECT age FROM dogs GROUP BY age HAVING COUNT(*) > 5;

可以被表示为关系代数:

\gamma_{age,COUNT(*)>5}(dogs)

此外,\gamma 运算符可用于从 SQL 中选择聚合列,如 MAX、MIN、SUM、COUNT 等。这是前面的修改后的查询:

SELECT age, SUM(weight) FROM dogs GROUP BY age HAVING COUNT(*) > 5;

可以被表示为关系代数:

\gamma_{age,SUM(weight),COUNT(*)>5}(dogs)

以上,DBS note5:Relational Algebra(关系代数)

祝好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1249507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

硬件连通性测试主要作用是什么?

硬件连通性测试是现代工程和制造中不可或缺的一环,它通过验证硬件系统内各个组件之间的通信和协作,确保系统在投入使用前能够正常运行。这一关键测试方法不仅有助于提高系统的可靠性和稳定性,还能在生产过程中节省成本,加快生产效…

Exchange意外登录日志

最近在审计Exchange邮件系统的时候,发现大量用户半夜登录的日志。而且都是成功的,几乎没有失败的情况。其中Logon Type 8表示用户从网络登录。 Logon type 8: NetworkCleartext. A user logged on to this computer from the network. The user’s pas…

机器学习算法——主成分分析(PCA)

目录 1. 主体思想2. 算法流程3. 代码实践 1. 主体思想 主成分分析(Principal Component Analysis)常用于实现数据降维,它通过线性变换将高维数据映射到低维空间,使得映射后的数据具有最大的方差。主成分可以理解成数据集中的特征…

rancher2.6 docker版本部署

1. 拉取镜像 docker pull rancher/rancher:v2.6.5 注: 上面命令中rancher的版本v2.6.5,仅仅是我因为我们环境中使用的k8s都是 1.20.1 到1.23.6 之间的版本。rancher支持的k8s版本,在github上查看:Release Release v2.6.5 ranche…

MariaDB(基础信息)

文章目录 一、MariaDB1、基本信息2、存储引擎3、兼容性》MySQL、Postgres、MongoDB 和 Oracle4、直接连接其他数据源5、等等等。。。。。。。。。。。。。。。。。。。。。 二、操作和mysql一样参考文章 --------------------机翻内容仅供参考------------------------- 一、…

外汇天眼:香港监管机构对AMTD Global Markets Limited启动法律诉讼

香港证监会(SFC)已经启动了法律程序,要求首次审裁法院调查AMTD Global Markets Limited(AMTD,目前以orientiert XYZ Securities Limited为名)及其前高管在与首次公开发行(IPO)相关的…

轻量级web开发框架:Flask本地部署及实现公网访问界面

轻量级web开发框架:Flask本地部署及实现公网访问界面 文章目录 轻量级web开发框架:Flask本地部署及实现公网访问界面前言1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何…

Vue3+element-plus,打包报错:Cannot read properties of null (reading ‘insertBefore‘)

一、现象:vue3 element-plus项目,本地启动时,页面所有操作都正常;部署到生产环境后,el-dialog、el-drawer弹框报错。 这个弹框报错问题,困扰好几天,查阅资料,可能是如下几个问题。 …

RAM模型从数据准备到pretrain、finetune与推理全过程详细说明

提示:RAM模型:环境安装、数据准备与说明、模型推理、模型finetune、模型pretrain等 文章目录 前言一、环境安装二、数据准备与解读1.数据下载2.数据标签内容解读3.标签map内容解读 三、finetune训练1.微调训练命令2.load载入参数问题3.权重载入4.数据加载…

YOLOv8改进 | 2023 | LSKAttention大核注意力机制助力极限涨点

论文地址:官方论文地址 代码地址:官方代码地址 一、本文介绍 在这篇文章中,我们将讲解如何将LSKAttention大核注意力机制应用于YOLOv8,以实现显著的性能提升。首先,我们介绍LSKAttention机制的基本原理,…

日本运营商启动先进边缘云技术研发

摘要:日本运营商乐天移动最近启动了为 5G 之后的下一个通信标准开发边缘平台功能的研发工作。 乐天移动(Rakuten Mobile)表示,其面向下一代通信的先进边缘云技术研发(R&D)项目已被日本国家信息通信技术…

构建未来:云计算 生成式 AI 诞生科技新局面

目录 引言生成式 AI:开发者新伙伴云计算与生成式 AI 的无缝融合亚马逊云与生成式 AI 结合的展望/总结我用亚马逊云科技生成式 AI 产品打造了什么,解决了什么问题未来科技发展趋势:开发者的机遇与挑战结合实践看未来结语开源项目 引言 2023年…

CSS特效018:科技动画,hover后点亮阁楼,拉伸出楼梯

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

重新开启GPT Plus充值通道——基于前端开发者工具

chatGPT PLUS充值通道的关闭 由于chatGPT用户激增,近日,OpenAI的CEO Sam Altman宣布需要暂停新用户对ChatGPT Plus的订阅。在X上,他表达了对于确保用户体验的承诺,同时也提到了用户可以通过应用程序内的通知功能来了解服务恢复的…

P7 C++指针

前言 指针是一个令很多人都很痛苦的内容,然而指针其实没有大家想象中的那么复杂。 对计算机来说内存就是一切,如果非要我说出编程中最重要的一件事,我可能会说是内存。 当你编写了一段程序并启动它时,所有的程序都被载入到内存…

Presto+Alluxio数据平台实战

数新网络,让每个人享受数据的价值https://xie.infoq.cn/link?targethttps%3A%2F%2Fwww.datacyber.com%2F 一、Presto & Alluxio简介 Presto Presto是由Facebook开发的开源大数据分布式高性能 SQL查询引擎。 起初,Facebook使用Hive来进行交互式查询…

nginx基础篇学习

一、nginx编译安装 1、前往nginx官网获取安装包 下载安装包 2、解压 3、安装 进入安装包 安装准备:nginx的rewrite module重写模块依赖于pcre、pcre-devel、zlib和zlib-devel库,要先安装这些库 安装: 编译: 启动&#xff…

idea自动切换输入法Smart Input

idea搜索后下载 红色表示中文输入法 再ideavim场景下会自动切换成英文非常好用强烈推荐下载一个

堆的实现(堆的插入、堆的删除等)超级全

堆的实现(堆的插入、堆的删除等)超级全 文章目录 堆的实现(堆的插入、堆的删除等)超级全一、前期基础知识1.树结构①树的定义②树的相关概念③二叉树④满二叉树和完全二叉树a.满二叉树b.完全二叉树 ⑤二叉树的性质⑥二叉树顺序结构…

「Java开发中文指南」IntelliJ IDEA插件安装(一)

IntelliJ IDEA是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 插件扩展了Intel…