此外,如何适应左外加入,右外加入和全外加入?


当前回答

在简单的条件下,

1.INNER JOIN OR EQUI JOIN : 返回结果组,仅符合两张表中的状态。

2.OUTER JOIN : 从两个表中返回所有值的结果,即使有条件相匹配或不相匹配。

3.LEFT JOIN : 从左表中返回所有值的结果组合,并仅与右表中的条件相匹配的行。

4.RIGHT JOIN : 从右表返回所有值的结果组合,并且仅符合左表的条件的行列。

5、全加入:全加入和全外加入是相同的。

其他回答

我在其他答案中看不到很多关于性能和优化的细节。

有时,知道只有INNER JOIN是合并的,这意味着优化器有最多的选择与它一起玩,它可以重新订单加入顺序,使它更快地保持相同的结果,优化器可以使用最多加入模式。

一般来说,尝试使用 INNER JOIN 而不是不同类型的插件是很好的做法(当然,如果可以考虑到预期的结果设置)。

这里有几个好例子和解释这个奇怪的协会行为:

是否留在外部合并合并合并?合并命令在SQL中的内容?

内部加入需要附加表中包含相关 ID 的记录。

外部连接将为左侧返回记录,即使没有对右侧的记录。

例如,您有一个订单和一个订单细节表,它们由一个“订单ID”相关。

命令

客戶名稱

命令细节

商品名稱 Qty 價格

请求

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

只会返回订单,该订单还包含在订单详细信息表中的一些东西。

如果您将其更改为向左加入

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
  LEFT JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

然后它将从订单表中返回记录,即使它们没有订单详细记录。

您可以使用此来查找没有订单详细信息的订单,并通过添加一个在哪里条款,如Where OrderDetails.OrderID IS NULL。

在简单的条件下,

1.INNER JOIN OR EQUI JOIN : 返回结果组,仅符合两张表中的状态。

2.OUTER JOIN : 从两个表中返回所有值的结果,即使有条件相匹配或不相匹配。

3.LEFT JOIN : 从左表中返回所有值的结果组合,并仅与右表中的条件相匹配的行。

4.RIGHT JOIN : 从右表返回所有值的结果组合,并且仅符合左表的条件的行列。

5、全加入:全加入和全外加入是相同的。

加入更容易用一个例子来解释:

此分類上一篇

模拟在单独的表中存储的人和电子邮件,

表 A 和表 B 由表_A.id = 表_B.name_id 添加

内部加入

此分類上一篇

只显示相匹配的IDS行。

外面加入

此分類上一篇

表 A 的匹配 ID 和不匹配行显示。

此分類上一篇

显示表 B 的匹配 ID 和不匹配行。

相匹配的ID和不相匹配的行从两个表显示。

注意:在 MySQL 上不存在完整的外部加入

左 加入 在 返回 内部加入 在 联盟 行 所有 未匹配 左 表 行 延伸 以 零 。

右 加入 返回 内 加入 在 联盟 行 所有 未匹配 右 表 行 延伸 零。

外部是可选的,没有效果。

(SQL Standard 2006 SQL/Foundation 7.7 Syntax Rules 1, 一般规则 1b, 3c&d, 5b)

所以不要在外部加入,直到你知道什么基础内加入涉及。


在返回中查找内部加入的行列:CROSS JOIN vs INNER JOIN 在 SQL 中

这也解释了为什么Venn(类似)图表不对内部与外部合并有用。 更多关于为什么它们不对合并有用:Venn 图表为自然合并