左连接与右连接比较

本文详细介绍了SQL中的左连接和右连接,解释了它们的区别在于连接时哪个表的数据作为主导。左连接从左侧表获取所有行并尝试匹配右侧表的记录,而右连接则反之。通过具体的例子展示了左连接如何保留左侧表的所有数据,即使右侧没有匹配项,以及右连接如何保留右侧表的所有数据,即使左侧没有匹配项。文章还讨论了外连接在检查参照完整性和数据库关系时的重要性,并提供了实际查询示例来说明这两种连接类型的用法。
摘要由CSDN通过智能技术生成

目录

右外连接和左外连接有什么区别

左连接如何工作

右连接的工作原理

外连接比较

右连接比较

左连接比较


右外连接和左外连接有什么区别

欢迎回来。在本课中,我们将学习右连接和左连接之间的区别。

左外连接和右外连接的区别与表位置有关。leftright指的是与FROM子句相关的表所在的位置。左表是FROM子句中的表,或者是连接条件的左边,这里的是jion子句。右表位于jion子句的右侧。

当我们谈到左外连接时,我们所说的是,从左表中取出所有行,并将它们连接到右表中的行。相反,当我们开始学习右外连接时,我们会说的是从右表中取出所有行,并尽可能将它们与左表中的行匹配。

如果您想了解其他联接类型,那么SQL Joins – The Ultimate Guide是一本不错的读物。

左连接如何工作

让我们深入研究这两个连接是如何工作的。让我们从SQL左连接开始。在这里,我们有产品、销售和结果。

这类似于我们在介绍中的内容。我确实添加了Fred Orr作为另一个示例来帮助我们进行连接。而且,正如您从我们的介绍中所记得的那样,我们有一个左外连接查询,所以我们现在从产品中提取ProductNameSales.CustomerName,对销售进行左外连接,使用ProductID作为我们的匹配项。

我们将引入名称,客户引入结果。

在这种ProductID匹配的情况下,它非常简单。它就像一个内部连接,我们为John Smith提取匹配项。

在外部连接blender的情况下,ProductID=2在销售表中没有匹配项。我们得到blender,然后是NULL。这可以追溯到在左外连接中,我们看到从左侧匹配所有产品,并且我们可以从右侧拉入行。

好吧,这是一个我们真的不能从右边拉成一排的情况。我们引入了一个NULL值。

右连接的工作原理

现在让我们看一下右外连接。在 SQL 右连接中,您可以看到我们的语句发生了如此细微的变化。事实上,我们改变的只是措辞,从左到右,就在声明中。

这将如何运作?

好吧,在John Smithmixe的情况下,事情是一样的。当我们为John Smith拉入mixe时,它将拉入John Smith的结果。

但是,对于blender,您会注意到,对于销售,现在没有二号blender选项,是吗?我们在这里为结果做什么?您会注意到blender甚至没有出现在结果中。

销售现在正在推动我们的结果表中显示的行,而blender甚至没有出现。

你会看到我们在哪里有mixer的名字John Smith,因为它匹配。当然,玛丽豪和直升机,第三排。然后,请注意Fred Orr是客户。

他是一个从未买过任何东西的顾客。我们有一个没有产品的客户。然后,当然,这个产品没有客户。它没有出现,因为在我们这里的例子中,它不是从销售匹配所有内容,然后尝试匹配产品的计划的一部分。

右外连接是从销售中提取每一行,然后尝试匹配产品中的某些内容。这就是结果显示销售的每一行的原因,然后Fred Orr出现空白。

外连接比较

这是一个真正的比较,我们都谈论过。查看产品表,它包含搅拌机、搅拌机、切碎机。那里有客户。注意左外连接语句和右外连接语句;唯一的区别是左外连接是左外连接,而右外连接我们只是把单词改成了右。

结果的关键是微妙的,但非常重要。我想让你理解并在这里学习的是,左外连接的结果都是由产品决定的,因为我们说,扫描产品表,并在可能的情况下匹配来自销售的东西。” 如果您要查看产品表,您会发现搅拌机、搅拌机、切碎机等。在这里,我有搅拌机、搅拌机、切碎机等。我有三个结果,就是这样,对于搅拌机来说什么都没有,因为销售方面什么都没有。

右连接比较

当我转到右外连接时,请注意结果是如何完全由销售表中的行驱动的。你会看到约翰·史密斯、玛丽·豪、弗雷德·奥尔、约翰·史密斯、玛丽·豪、弗雷德·奥尔。

在可能的情况下,我会在产品之间进行匹配,以尝试获得该人购买的相应产品。我们知道约翰买了一台搅拌机,玛丽买了一个切碎机,弗雷德什么也没买。有一个空值。

让我们做一些例子。这是右外部联接的示例。在这个连接中,我从产品供应商表中提取信息。而且,出于我们的目的,我们将只引入ProductID和名称。

由于这是一个右外部连接,我们应该期望看到列出所有供应商,然后在可能的情况下列出他们提供的产品。如果没有他们提供的产品,我们仍然会看到供应商,然后ProductID将为空。

我将在这里添加一些小闪光,我将添加另一列,因为这看起来很无聊。让我们做PV,然后添加……让我们看看我们要添加什么字段。我们会做标准价格。这将为我们提供ProductID和该产品的标准价格。

它将给我们所有供应商的名称,然后是他们提供的产品。而且您可能会发现有些供应商不提供产品。我不确定。我可以做的是检查是否有人不提供产品,即PV.product ID为空。这将允许我做的是明确检查我的结果,看看我们系统中是否有任何供应商目前没有提供产品。

他们在这里。我在这里有几个供应商,但目前没有列出他们的产品。

这可能是探索参照完整性的一种非常好的技术。在探索这一点的课程中,我还有更多示例。

但这是使用外连接的好方法,因为它可以让您探索两个表之间的关系,然后查看在某种意义上匹配失败的地方。我们在这里所做的是我们说,在产品供应商上加入供应商。” 在你看到失败的地方,意味着业务实体ID不匹配,所以我们没有在产品供应商列表中找到我们的供应商,这在某种意义上可能是失败,然后让我们看看,并展示这些供应商的名单。

这是这些供应商的名单。这些是尚未在我们的系统中列出产品的供应商。这可能是一件好事,也可能是一件坏事,这取决于您的业务流程是如何设置的。也许,这些只是新的供应商,我们还没有建立他们的产品。

左连接比较

好的,现在让我们采用相同的查询并将其显示为左外连接。再一次,我需要做的就是从左到右改变措辞。不过,我将创建一个新查询,只是为了保存那个。

好的,这是我的查询副本。现在我要让它成为一个左外连接。请记住,只需将单词从右向左更改,就会给查询带来完全不同的含义。现在我们正在做的是寻找我们系统中可能没有列出供应商的所有产品供应商。

这可能是一个更严重的问题。因为我们所说的是我们的系统中实际上有一个产品,并且我们认为我们列出了一个供应商,但是由于某种原因,引用该供应商的业务实体ID不存在,这将是一个参照完整性错误。

我们依赖于产品供应商通过业务实体ID与供应商相关的事实。现在我们有了业务实体ID和产品供应商,但在供应商中我们打破了这种关系。

让我们运行这个查询,看看它是什么样子的。我确实得到了行。同样,我得到了很多行。我认为在这里查看是否可能存在引用问题的最快方法是添加一个where子句,就像我们之前所做的那样。这是一种能够检查数据的好方法。让我们做一个V点,然后我们将做业务实体ID为空,因为如果我们要查看……我也会把它放在这里,以防万一。如果它确实回来了,我们可以看到它显示出来。

现在,我不希望看到任何问题。我认为我们的数据状况良好,但可能存在问题。没有问题。但同样,这是一个非常好的方法,可以检查您的数据库以确保您的所有关系都到位。

希望现在您已经很好地理解了左外连接和右外连接的区别。请记住,左表是指FROM子句中的表,而右表是连接子句之后的表。左外连接和右外连接之间的主要区别在于,在左外连接中,它是FROM子句中的表,其所有行都被返回。然而,在右外连接中,我们从连接子句中指定的表中返回所有行。

本文最初发布于Left Join versus Right Join Comparison - Essential SQL

https://www.codeproject.com/Articles/5326895/Left-Join-versus-Right-Join-Comparison

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值