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


当前回答

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

此分類上一篇

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

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

内部加入

此分類上一篇

只显示相匹配的IDS行。

外面加入

此分類上一篇

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

此分類上一篇

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

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

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

其他回答

一个内部合并只显示行,如果在合并的另一边(右)有一个匹配记录。

一(左)外部连接显示在左侧的每个记录的行列,即使连接的另一(右)侧没有匹配行列,如果没有匹配行列,对另一(右)侧的列将显示零。

内部加入需要附加表中包含相关 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。

此分類上一篇

INNER JOIN 最典型的加入为两个或多个表. 它返回数据匹配在两个表上 ON primarykey 和 forignkey 关系. OUTER JOIN 与 INNER JOIN 相同,但它还包含结果设置上的 NULL 数据. LEFT JOIN = INNER JOIN + 未匹配的左表数据与右表上的 Null 匹配. RIGHT JOIN = INNER JOIN + 未匹配的右表数据与左表上的 Null 匹配. FULL JOIN = INNER J

例如:

SELECT * 
FROM   tablea a 
       INNER JOIN tableb b 
               ON a.primary_key = b.foreign_key 
       INNER JOIN tablec c 
               ON b.primary_key = c.foreign_key 

在内部加入中,我们可以在不同表中获取相同/相关数据的数据。

我们有三种类型的外部加入:

左加入,右加入,全加入

我们还将从左(第一)表中获取不相关的数据。

SELECT Sname, Tname FROM student s LEFT JOIN 教师 t ON s.id = t.id;

右外加入,我们还从正确的表中获取与此无关的数据(第二表)

SELECT Sname, Tname FROM student s RIGHT JOIN 教师 t ON s.id = t.id;

我们可以使用 FULL OUTER JOIN 当我们想要从两个表中获取所有 / 完整的数据时,丢失的数据将以 NULL 填写。

SELECT Sname, Tname FROM student s FULL JOIN 教师 t ON s.id = t.id;

假设你加入没有复制的列,这是一个非常常见的案例:

A 和 B 的内部结合会产生 A 交叉B 的结果,即 Venn 图表交叉的内部部分; A 和 B 的外部结合会产生 A 联盟 B 的结果,即 Venn 图表联盟的外部部分。

例子

假设你有两个表,每个单列,并数据如下:

A    B
-    -
1    3
2    4
3    5
4    6

内部加入

使用相同的查询中的任何一个内部连接提供两张表的交叉,即它们共通的两行。

select * from a INNER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b;

a | b
--+--
3 | 3
4 | 4

左边加入

左向外加入将提供A中的所有行,加上B中的任何常见行。

select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a = b.b(+);

a |  b
--+-----
1 | null
2 | null
3 |    3
4 |    4

向外加入

一个正确的外部加入将给所有行在B,加上任何常见行在A。

select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.*  from a,b where a.a(+) = b.b;

a    |  b
-----+----
3    |  3
4    |  4
null |  5
null |  6

全外加入

一个完整的外部加入会给你A和B的联盟,即A中的所有行和B中的所有行,如果A中的任何东西没有相应的日期在B,那么B部分是零,反之亦然。

select * from a FULL OUTER JOIN b on a.a = b.b;

 a   |  b
-----+-----
   1 | null
   2 | null
   3 |    3
   4 |    4
null |    6
null |    5