使用维恩图来描述表为集合的 SQL 连接是否合适?

2023-12-04

网上搜索SQL join可以找到下图:

enter image description here

我们可以将其解释为维恩图,通过以下方式?

  • 标记为表 A 的圆圈是表 A 中的记录集
  • 标记为表 B 的圆圈是表 B 中的记录集
  • 集合的交集表示内连接(也称为 SQL 中的连接)

动机

所示的图表在网络上以各种形式广泛出现,看起来非常像维恩图。因此,第一直觉是将其视为维恩图。然而,在尝试定义“表 A”和“表 B”集的内容时可能会遇到困难。

互联网上也有一些信息似乎存在冲突。这个问题希望能帮助解决一些出现的冲突。一些网站认为我们不应该使用维恩图来解释连接:

  • https://towardsdatascience.com/can-we-stop-with-the-sql-joins-venn-diagrams-insanity-16791d9250c3
  • https://blog.jooq.org/2016/07/05/say-no-to-venn-diagrams-when-explaining-joins/

虽然还有其他信息使用表 A 和 B 之间的维恩图来解释这些表上的联接,例如

  • “内连接”和“外连接”有什么区别?
  • 用维恩图回答该问题的版本

不可以。如果该图要表示连接,则不能将其解释为维恩图。让我们用一个反例来说明原因。让我们选择一个最小的反例以避免混乱。因此,我们假设两个表都只有一列:ID。此外,我们假设这两个表中都只有两条记录,并且它们都有相同的两条记录:只有 ID 1 和 2。所以这两个表看起来都是这样的:

enter image description here

现在,假设我们运行以下 SQL:

select * from A join B

既然没有ON子句,我们将返回所有记录组合的表A所有记录都在B。由于每条记录都有 2 条记录,因此我们将返回4 = 2 * 2记录。我们的选择结果表将如下所示,其中 A 和 B 的 ID 列由表名称完全限定:

enter image description here

然而,无论我们为记录选择什么解释,两组记录的交集(如维恩图所示)都不等于这个。

解释#1:每条记录只是一个值的元组。在本例中,由于每个表中只有一列,因此我们的元组归结为单个值。由于我们的 ID 列是数字,因此这种解释可以归结为记录只是一个数字 ID。集合的交集就是集合的交集{1, 2}与它自己。这只是原始集。或者作为表格,交集将是:

enter image description here

解释#2:表 A 中的每条记录都与表 B 中的任何记录完全不同,或者实际上与表 A 本身中的任何其他记录完全不同。在这种情况下,由于没有两条记录是相同的,因此两个集合的交集将为空,即空集。所以作为一个表,它肯定不会与连接的结果相同。

这证明了维恩图的这种精确解释不能被视为表示 SQL 连接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用维恩图来描述表为集合的 SQL 连接是否合适? 的相关文章

随机推荐

  • Android - 来自 Choreographer 的跳过帧消息

    在我的应用程序中 我收到了来自 Choreographer 的许多跳帧消息 因此 我开始一一检查 当我单击 MainActivity 页面上的默认菜单按钮时 我非常惊讶地看到 76 跳帧 为了找出问题所在 我注释掉了 MainActivit
  • 使用 Hibernate 和 SQL Server 2008 时出现问题

    我在使用 Hibernate 和 SQL Server 2008 时遇到问题 当我尝试将对象保存到数据库时 Hibernate 会抛出以下错误 could not retrieve snapshot com my MyClass Cause
  • 使用 jQuery (window).scroll 淡入淡出 HTML5 音频(调整音量)

    我正在尝试制作一个页面 该页面使用 html5 音频在后台循环播放声音文件 并在用户向下滚动时淡出 理想情况下 当用户向上滚动时 它也会淡入 我知道我还很遥远 但这是我正在处理的事情 html
  • 这是一个类、构造函数还是方法? [复制]

    这个问题在这里已经有答案了 我很难确定这到底是什么 至此 我已经熟悉了方法 构造函数和类声明的样子 这是哪个 为什么看起来像一个构造函数和一个方法生了一个孩子 public Polygon polygonFrom Point corners
  • 简单的日期格式化程序返回不正确的格式。格式化后扣除日期[重复]

    这个问题在这里已经有答案了 我正在尝试使用 SimpleDateFormat 解析日期 日期解析成功但是输出日期格式不正确或者减去了一年 使用SimpleDateFormat的Date方法如下所示 public Date parseDate
  • 具有可更新 JProgressBar 的 Java Swing 线程

    首先 我最近一直在使用 Java 的并发包 但我发现了一个我遇到的问题 我想要一个应用程序并且该应用程序可以有一个SplashScreen带有状态栏和其他数据的加载 所以我决定使用SwingUtilities invokeAndWait c
  • 为什么我的对象打印了两次?

    当我在 irb 或 Rails 中时 我使用以下命令创建一些迭代each 我在终端或浏览器中再次打印整个结构 例子 a 1 2 3 4 a each do number puts n end irb 终端或浏览器中的结果 1 2 3 4 g
  • 调用 object.method() 和 Class.method(object) 时幕后发生了什么?

    我对 Python 还很陌生 正在处理 OOP 我对何时使用对方法和类的调用有点困惑 下面的示例代码输出平均值 但是我很好奇什么时候从类调用与从现实世界的角度使用方法调用 我很确定这只是我可能尚未解决的问题 但对于何时使用其中一个而不是另一
  • 最小购物车金额(WooCommerce 中的几种特定产品除外)

    我正在使用以下代码 Woocommerce 中除特定产品外的最低购物车金额 在我的 php 中 允许覆盖 Woocommerce 最低购物车价值 130 美元 工作正常 但仅适用于一种定义的产品 在这种情况下product id 2649
  • 在 Firebase 中过滤多个子属性的产品

    我最近询问如何根据产品的子属性过滤产品 请参阅 根据 Firebase 中的子项过滤产品 回顾一下我的结构如下 products product1 author 12345 title Awesome category catA descr
  • 如何正确关闭和打开 Hibernate 会话?

    我有以下方法 每隔几秒插入一大批记录 运行一段时间后 我收到如下错误 错误 通信链路故障 从服务器成功接收到的最后一个数据包是 523 毫秒前 最后一个成功发送到服务器的数据包是 8 毫秒前 2013 年 5 月 16 日上午 9 48 3
  • Doctrine2 最佳实践,实体应该使用服务吗?

    我不久前问过类似的问题 使用数据映射器模式 实体 域对象 是否应该了解映射器 然而 它是通用的 并且我对如何使用 Doctrine2 完成一些事情非常感兴趣 这是一个简单的示例模型 每个Thing可以有一个Vote from a User
  • 如何仅在脚本运行期间设置环境变量?

    在 Linux 上 乌班图11 04 Natty Narwhal 在 Bash 中 是否可以临时设置一个仅在脚本运行期间与普通变量不同的环境变量 例如 在 shell 脚本中 通过将 HOME 临时设置为当前工作目录中的文件夹 然后启动该应
  • Xampp 1.7.4 和 PHP 5.3.5(已弃用的警告)

    我刚刚将 Xampp 安装升级到 1 7 4 我有一个工作脚本 jquery 调用 PHP 脚本并显示返回值 升级后 我的 jquery 正确获取了结果 但除了结果之外 还返回了一些警告 因此停止我的脚本以显示结果 我签入了 firebug
  • 如何向 POI 4.0.1 中的 XDDFChart 添加带有第二轴的第二条线?

    我无法在现有图表的第二个轴 右轴 上添加线条 有没有办法通过 POI 4 0 0 1 中图表的新实现来做到这一点 Desired output will look like this A simple excel chart with 2
  • 如何将多个 OpenAPI 3 规范文件组合在一起?

    我想合并使用 OpenAPI 3 规范编写的 API 规范 该规范当前分为多个文件 这些文件相互引用 ref 我怎样才能做到这一点 我最近写了一个快速工具来做到这一点 我称之为 openapi merge 有一个库和一个关联的 CLI 工具
  • 无法在 google cloud ml 上进行预测,而相同的模型正在本地计算机上运行

    我正在尝试使用谷歌云中的张量流库训练机器学习模型 创建存储桶后 我可以在云中训练模型 当我尝试使用现有模型进行预测时 我遇到了这个问题 代码和数据可以在以下 Github 目录中找到 https github com terminator1
  • 使用 createdesktop api 创建桌面的屏幕截图

    我正在使用 createdesktop api 创建桌面 我想截取屏幕截图或发送输入鼠标 键盘而不向用户显示桌面 有关如何实现此功能的任何想法 我发现的简短答案是你不能 您无法拍摄非活动桌面的屏幕截图 因为没有绘画调用 因为没有可见的窗口可
  • \s 在 C++ 正则表达式中不起作用

    我昨天开始学习正则表达式 在学习时 我看到 s 用于空白字符 但是 由于某种原因 每当我输入空格时 C 中都不会检测到它 Code include
  • 使用维恩图来描述表为集合的 SQL 连接是否合适?

    网上搜索SQL join可以找到下图 我们可以将其解释为维恩图 通过以下方式 标记为表 A 的圆圈是表 A 中的记录集 标记为表 B 的圆圈是表 B 中的记录集 集合的交集表示内连接 也称为 SQL 中的连接 动机 所示的图表在网络上以各种