首页 > 后端开发 > php教程 > 3再加入您应该熟悉

3再加入您应该熟悉

Joseph Gordon-Levitt
发布: 2025-02-16 13:06:13
原创
522 人浏览过

3再加入您应该熟悉

钥匙要点

  • >本文解释了左JOIN,右JOIN,INTER JOIN和外部加入SQL的用法,使用一个简单的书籍贷款数据库,带有两个表:客户和书籍。 SQL连接中“左”和“右”的概念
  • 澄清的概念无非是来源顺序。联接关键字之前提到的表是“左”表,而后面的表则是“右”表。
  • >文章介绍了与排除的概念,这些概念对于包括“不要”或“不”的查询很有用。这些连接使用Where子句来排除数据,特别是在寻找null值时。
  • >
  • 具有排除的外部连接被描述为在表之间没有连接的情况下选择数据,尽管它在mysql中不支持。
  • >强调,应始终将其子句用于不能将其作为其实际价值的字段使用。另外,注意到Cross Join是一个唯一的联接,与表A中的每个行与表B中的每个行匹配
  • 有很多方法可以从两个数据库表中加入数据并过滤所需的信息。克雷格·巴克勒(Craig Buckler)写了一篇关于理解加入的流行文章。即内部,左,右和全外部。本文是该文章的扩展。
>

>让我们快速回顾一下。图片两张桌子,一张适合客户的桌子,一个用于建立图书贷款数据库的书籍。>

>客户表


id

> firstName > lastname book_id 1 乔 吹 1 2 简 母鹿 2 3 哈利 乌鸦 2 4 杰弗里 雪 0 书籍表 id

>标题

1 星球大战 2 侏罗纪公园 3 小女人 4 汤姆·索耶(Tom Sawyer) 书籍表都有每一本行。> >客户的表有每行的一行,他们一次只能借一本书。如果他们没有租借书,则book_id是0或一个空字符串。> 这是一个非常简单的示例,可以使加入尽可能清楚地理解!

>

在这里左JON会在您想提出一个问题的情况下,例如“

向我展示所有客户,包括任何借来的书籍。

>您可以在图像中看到结果集中包含左圆或表中的所有数据。从右表中包含了从书籍表中重叠的数据。这意味着,在左联接时,右表中的某些数据可能被排除在外。> 正确的加入就像问“

>向我展示我的图书馆中的所有书籍,以及借用它们的任何客户。

3再加入您应该熟悉

在此图像中,您会看到右表中的所有数据都包含在结果集中。仅包括与客户表重叠的数据。这意味着,通过正确的加入,左表中的某些数据可能被排除在外。

>

一个外部联盟就像问“

向我展示所有贷款和所有书籍,无论它们之间有什么联系。

在此图像中,您可以看到将包括两个表中的所有数据,而不管某些数据是否重叠。完成此类查询后,您将在结果中有不重叠的数据,这些字段将设置为null。 3再加入您应该熟悉内在的加入就像问“

仅向客户展示贷款。

>在这里,您可以看到数据可以从左右表中排除。如果没有书,您将不会看到任何客户,如果没有借钱,您将不会看到任何书!>

>这是最常见的数据类型,是使用关键字自身加入时的默认行为。通常不需要添加的“内部”单词。

> 3再加入您应该熟悉“左”和“右”是什么意思?

>

>您可以将“左”和“右”视为源订单。查看此查询:

请注意,在使用JOIN关键字之前,我提到了表客户。这意味着客户是我的“左”桌子。考虑它的另一种思考方式是询问Join关键字的哪个表格,哪个是在其右边。

几个警告:

<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
登录后复制
登录后复制
登录后复制
仅仅是因为一个表是“左”,并不意味着您正在选择其所有记录。这是左联接或右键的功能,而不是源订单!

>

左右的表将首先在结果集中列出其列,除非您在选择部分中专门选择列。

在关键字之后表的顺序无关紧要,如果交换了,它将返回相同的结果。
    >
  • >足够的审查。这些新加入是什么?
  • 好吧,它们不是“新”,它们只是查询其他问题的一种方式。您如何在查询中使用“不要”或“不”一词的问题找到问题的答案?
  • >
  • >
向我展示所有没有借书的客户。

>

>向我展示所有未借出的书籍。

> 左将与排除

看一下此图形。注意与上述连接在阴影区域中的区别。

>这看起来像是左联接,但不再包含“重叠”数据。为什么?这与“向我展示没有租借书籍的客户”的询问一样。 如果您很聪明,您可能会认为您只需在客户表中搜索一个book_id的0 book_id即可完成同样的事情。在此示例中,这将起作用,但是大多数情况下都不会。这取决于您的桌子的设计。>

查询看起来像这样:

>现在我们包含了一个Were子句。每当您有一个子句时,您都将排除

数据或过滤它,几乎像搜索一样。那么,为什么我们要搜索books.id是无效的?为什么这是无效的?让我们运行左键的标准并查看其返回的数据,我们将有答案:>
<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
登录后复制
登录后复制
登录后复制
左加入返回数据

id

> firstName

> lastname book_id > id1 >标题 1 乔 吹 1 1 星球大战 2 简 母鹿 2 2 侏罗纪公园 3 哈利 乌鸦 2 2 侏罗纪公园 4 杰弗里 雪 0 无效的 无效的 您可以看到这个问题吗?这是一个左联接,这意味着无论与书籍重叠如何,都包含来自客户表的所有数据。包括杰弗里·斯诺(Jeffrey Snow),但他没有借书的书,这就是为什么“ ID1”和“标题”列将其设置为Null的原因。加入桌子时,将不会有与他链接的书名或书ID。 如果我们问“ 向我展示所有客户,包括他们拥有的书籍>”,您将需要上述数据,因为杰弗里(Jeffrey)是客户,无论他是否有一本书。在这种情况下,那将是左加入的功能。> 如果我们提出一个问题“

向我展示没有借书的书籍

的客户”,那么现在要寻找的是很有意义。我们只需要选择“读取null”的客户。ID列(加入后,将标记为ID1,因为有两个名为“ ID”的列)。如果我们添加books.id为null,我们将使用标准条款来执行此操作。现在,结果被过滤到以下内容:

id

> firstName

> lastname

book_id > id1 >标题 4 杰弗里 雪 0 无效的 无效的 >您现在有所有没有借书的客户。> 右加入dublufusion >让我们与正确的联接一起做同样的事情。让我们找到所有没有借给任何人的书。>

正常的权利加入将返回每本书,无论其是否借贷,结果集看起来像这样:

id > firstName > lastname book_id > id1 >标题 1 乔 吹 1 1 星球大战 2 简 母鹿 2 2 侏罗纪公园 3 哈利 乌鸦 2 2 侏罗纪公园 无效的 无效的 无效的 无效的 3 小女人 无效的 无效的 无效的 无效的 4 汤姆·索耶(Tom Sawyer) 这看起来有些不同。首先,您可能会注意到侏罗纪公园被列为两次。这是因为两个人借来了这本书,并且数据库正在为每场比赛返回一行。

请注意,来自客户表的所有相应列对于小女性和汤姆·索耶(Tom Sawyer)来说都是无效的,因为没有人借这些标题,因此没有重叠的数据。

如果我们想选择所有未借出的书籍,我们只使用Where子句在客户中找到“ null”。

该结果应该是可以预测的。我们只会得到未借出的书籍。

>

<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
登录后复制
登录后复制
登录后复制
id

> firstName

> lastname book_id > id1 >标题 无效的 无效的 无效的 无效的 3 小女人 无效的 无效的 无效的 无效的 4 汤姆·索耶(Tom Sawyer) >外部连接 最后的联接看起来像这样。

此加入不是很有用,但从本质上讲,这两个客户都没有贷款和未借贷的书籍。

>这样的奇怪加入可能在您需要在表之间没有连接的情况下选择数据的情况下可能很有用。也许您正在寻找孤儿数据或在您转换的某些旧数据库中寻找不一致之处。

3再加入您应该熟悉实际上,这种加入是如此奇怪,以至于您甚至无法在MySQL中进行,它不支持外部加入。常规SQL确实可以,并且查询看起来像这样(MSSQL不是mysql):

>

此查询的结果将返回像这样的数据:

>

id

> firstName
<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>WHERE books.id IS NULL
登录后复制

> lastname

book_id > id1 >标题 1 杰弗里 雪 0 无效的 无效的 无效的 无效的 无效的 无效的 3 小女人 无效的 无效的 无效的 无效的 4 汤姆·索耶(Tom Sawyer) >您可以使用Craig Buckler与联盟解释的方法实现外部连接,但这并非没有潜在的问题。模拟MySQL中完整外部连接的顶级Google结果是从2006年开始,可以在此处找到。它可能会变得有些复杂。 >上面代码中要注意的主要内容是检查连接两侧的空,因为我们想从两个表中排除。在没有检查双方的情况下,我们最终只会谈论其他一个。> >不管像这样的查询如何奇异或如何支持,我都想包括它,因为它是一种有效的加入类型,如果您可以考虑使用它的理由。

其他想法

>您应该始终将您的Where子句用于无法将其null作为其实际值的字段!我们总是针对无法将其作为值的ID字段进行测试。想象一下,如果我们的书籍桌有一个允许空的ISBN字段。如果我们使用该字段测试了null,则包括我们可能不想要的行!> >还有另一个称为“十字联接”的联接,这也是奇怪而独特的。想象一下,不仅将一个用户与一本书匹配,而是每个用户都与每本书匹配!是的,这意味着,如果您有20本书和30个客户,交叉加入将产生30*20行数据!有关如何有用的示例,请查看本文。

请注意,在MySQL中,连接,内联接和交叉连接是句法等效物,可以互相替换。这是因为加入和内连接执行相同的操作,并且必须使用关键字与列匹配。使用交叉连接时,关键字没有,因为它将表A中的每个行与表B中的每个行匹配

结论

我希望这些额外的几加入对您有意义。考虑在您要求在表“不”匹配另一个表格之间的表之间的数据时,请考虑使用它们。

>

“找到所有以前从未订购过的客户”。

>

“找到所有不在黑名单中的所有客户”。
    >
  • “查找所有尚未出售的产品”。
  • >
  • “找到所有客户都不借书”。
  • “找到最近没有走路的所有狗”。
  • >
  • “找到从未发送过支持票的员工”。
  • >
  • 总而言之,根据如何定义数据库和表格,您可能需要使用Where子句来检查null值为dubl
  • >
indose

以正常的联接行为。 >所以……您是否需要十字架加入?您想告诉我们或想让我们覆盖的其他特定用例吗?让我们知道! 经常询问有关SQL加入

的问题(常见问题解答)

>基于它们之间的相关列,使用了什么类型的SQL连接,它们彼此之间有何不同? SQL连接的基本类型有四种:内部加入,左连接,右JOIN和FULL JOIN。内部加入返回记录,这些记录在两个表中都具有匹配值。左JOIN从左表返回所有记录,以及右表的匹配记录。右JOIN从右表返回所有记录,以及左表的匹配记录。左或右表有匹配时,Full Join返回所有记录。

>

>如何在SQL中使用多个加入?

​​>可以在SQL中使用多个加入,只需在您的SQL查询中添加更多JOIN语句即可。每个加入语句都必须有自己的条款,以指定加入条件。查询中的加入语句的顺序可能会影响结果,因此在使用多个加入时仔细考虑查询的逻辑很重要。

什么是SQL中的三个桌子连接,它如何工作?

>在SQL中的三个桌子连接是一种基于它们之间的相关列组合的连接类型。这是通过在SQL查询中使用两个加入语句来完成的。第一个加入语句结合了前两个表,第二个加入语句结合了第一个联接的结果与第三个表。 JOIN语句的顺序以及ON子句中指定的条件确定表如何组合。

>

>左JOIN与SQL的右JOIN之间有什么区别?左连接和SQL中的右JOIN之间的区别是将表加入和返回结果的顺序。左联接从左表返回所有记录,以及右表中匹配的记录。如果没有匹配,则结果在右侧为无效。另一方面,右连接将返回右表和左表中匹配的记录的所有记录。如果没有匹配,结果在左侧为无效。

>如何可视化SQL连接?

可以使用Venn图可视化SQL结合。图中的每个圆都代表一个表。圆圈重叠的区域表示联接返回的记录。对于内部连接,仅显示重叠区域。对于左连接,显示了所有左圆和重叠区域。对于正确的连接,显示了所有正确的圆和重叠区域。为了完整的联接,显示了两个圆圈的整个区域。

>

什么是SQL中的完整加入,什么时候应该使用它?

>在SQL中的完整加入SQL时返回所有记录是左表或右表中的匹配。如果没有匹配,则结果在两侧为无效。当您要保留两个表中的所有记录时,这种类型的加入也很有用,即使列之间没有匹配。 🎜>是的,您可以使用SQL连接两个以上的表。这是通过在您的SQL查询中使用多个加入语句来完成的。每个加入语句都结合了两个表,因此要加入三个表,您将使用两个加入语句,以加入四个表,您将使用三个加入语句,依此类推。

>

>在SQL中使用多个连接的性能影响是什么?在SQL中使用多个JONINS中的多个连接可以对查询性能产生重大影响,尤其是在加入的表格上有大量记录。每个加入操作都需要处理能力和内存,因此您在查询中拥有的加入越多,执行查询所需的资源就越多。但是,可以通过使用索引,优化查询并使用适当的硬件来减轻性能的影响。

>

>如何优化使用加入的SQL查询?您使用加入的SQL查询。一种方法是在正在连接的列上使用索引。这可以大大加快联接操作。另一种方法是限制查询返回的记录数量,使用WHERE子句。另外,查询中的加入语句的顺序可能会影响性能,因此仔细考虑查询的逻辑很重要。

>

>使用SQL JON时,

有什么常见的错误? >使用SQL加入时要避免的一些常见错误包括忘记指定“ ON子句”,这可能会导致笛卡尔产品,加入非索引列,这可以减慢查询性能,并使用错误的类型的JOIN类型,可以结果结果不正确。同样重要的是要记住,查询中的加入语句的顺序可能会影响结果,因此仔细考虑查询的逻辑很重要。

>

以上是3再加入您应该熟悉的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板