>让我们快速回顾一下。图片两张桌子,一张适合客户的桌子,一个用于建立图书贷款数据库的书籍。
>客户表
id
>标题
1 星球大战 2 侏罗纪公园 3 小女人 4 汤姆·索耶(Tom Sawyer)>
在这里左JON会在您想提出一个问题的情况下,例如“向我展示所有客户,包括任何借来的书籍。
>您可以在图像中看到结果集中包含左圆或表中的所有数据。从右表中包含了从书籍表中重叠的数据。这意味着,在左联接时,右表中的某些数据可能被排除在外。> 正确的加入就像问“
>向我展示我的图书馆中的所有书籍,以及借用它们的任何客户。
>
一个外部联盟就像问“向我展示所有贷款和所有书籍,无论它们之间有什么联系。
在此图像中,您可以看到将包括两个表中的所有数据,而不管某些数据是否重叠。完成此类查询后,您将在结果中有不重叠的数据,这些字段将设置为null。
内在的加入就像问“
>在这里,您可以看到数据可以从左右表中排除。如果没有书,您将不会看到任何客户,如果没有借钱,您将不会看到任何书!>
>这是最常见的数据类型,是使用关键字自身加入时的默认行为。通常不需要添加的“内部”单词。>
“左”和“右”是什么意思?
>您可以将“左”和“右”视为源订单。查看此查询:
请注意,在使用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
> lastname
向我展示没有借书的书籍
的客户”,那么现在要寻找的是很有意义。我们只需要选择“读取null”的客户。ID列(加入后,将标记为ID1,因为有两个名为“ ID”的列)。如果我们添加books.id为null,我们将使用标准条款来执行此操作。现在,结果被过滤到以下内容:
id
> lastname
book_id正常的权利加入将返回每本书,无论其是否借贷,结果集看起来像这样:
请注意,来自客户表的所有相应列对于小女性和汤姆·索耶(Tom Sawyer)来说都是无效的,因为没有人借这些标题,因此没有重叠的数据。
如果我们想选择所有未借出的书籍,我们只使用Where子句在客户中找到“ null”。该结果应该是可以预测的。我们只会得到未借出的书籍。
>
<span>SELECT * </span><span>FROM customers </span><span>LEFT JOIN books </span><span>ON customers.book_id = books.id </span>
> firstName
> lastname此加入不是很有用,但从本质上讲,这两个客户都没有贷款和未借贷的书籍。
>这样的奇怪加入可能在您需要在表之间没有连接的情况下选择数据的情况下可能很有用。也许您正在寻找孤儿数据或在您转换的某些旧数据库中寻找不一致之处。
实际上,这种加入是如此奇怪,以至于您甚至无法在MySQL中进行,它不支持外部加入。常规SQL确实可以,并且查询看起来像这样(MSSQL不是mysql):
此查询的结果将返回像这样的数据:
>
id
<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>您应该始终将您的Where子句用于无法将其null作为其实际值的字段!我们总是针对无法将其作为值的ID字段进行测试。想象一下,如果我们的书籍桌有一个允许空的ISBN字段。如果我们使用该字段测试了null,则包括我们可能不想要的行!>
>还有另一个称为“十字联接”的联接,这也是奇怪而独特的。想象一下,不仅将一个用户与一本书匹配,而是每个用户都与每本书匹配!是的,这意味着,如果您有20本书和30个客户,交叉加入将产生30*20行数据!有关如何有用的示例,请查看本文。
结论
我希望这些额外的几加入对您有意义。考虑在您要求在表“不”匹配另一个表格之间的表之间的数据时,请考虑使用它们。
>>
“找到所有不在黑名单中的所有客户”。以正常的联接行为。 >所以……您是否需要十字架加入?您想告诉我们或想让我们覆盖的其他特定用例吗?让我们知道! 经常询问有关SQL加入
的问题(常见问题解答)>基于它们之间的相关列,使用了什么类型的SQL连接,它们彼此之间有何不同? SQL连接的基本类型有四种:内部加入,左连接,右JOIN和FULL JOIN。内部加入返回记录,这些记录在两个表中都具有匹配值。左JOIN从左表返回所有记录,以及右表的匹配记录。右JOIN从右表返回所有记录,以及左表的匹配记录。左或右表有匹配时,Full Join返回所有记录。
>什么是SQL中的三个桌子连接,它如何工作?>在SQL中的三个桌子连接是一种基于它们之间的相关列组合的连接类型。这是通过在SQL查询中使用两个加入语句来完成的。第一个加入语句结合了前两个表,第二个加入语句结合了第一个联接的结果与第三个表。 JOIN语句的顺序以及ON子句中指定的条件确定表如何组合。
>
>左JOIN与SQL的右JOIN之间有什么区别?左连接和SQL中的右JOIN之间的区别是将表加入和返回结果的顺序。左联接从左表返回所有记录,以及右表中匹配的记录。如果没有匹配,则结果在右侧为无效。另一方面,右连接将返回右表和左表中匹配的记录的所有记录。如果没有匹配,结果在左侧为无效。>如何可视化SQL连接?可以使用Venn图可视化SQL结合。图中的每个圆都代表一个表。圆圈重叠的区域表示联接返回的记录。对于内部连接,仅显示重叠区域。对于左连接,显示了所有左圆和重叠区域。对于正确的连接,显示了所有正确的圆和重叠区域。为了完整的联接,显示了两个圆圈的整个区域。什么是SQL中的完整加入,什么时候应该使用它?
>如何优化使用加入的SQL查询?您使用加入的SQL查询。一种方法是在正在连接的列上使用索引。这可以大大加快联接操作。另一种方法是限制查询返回的记录数量,使用WHERE子句。另外,查询中的加入语句的顺序可能会影响性能,因此仔细考虑查询的逻辑很重要。
>有什么常见的错误? >使用SQL加入时要避免的一些常见错误包括忘记指定“ ON子句”,这可能会导致笛卡尔产品,加入非索引列,这可以减慢查询性能,并使用错误的类型的JOIN类型,可以结果结果不正确。同样重要的是要记住,查询中的加入语句的顺序可能会影响结果,因此仔细考虑查询的逻辑很重要。
>以上是3再加入您应该熟悉的详细内容。更多信息请关注PHP中文网其他相关文章!