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


当前回答

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

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

左加入,右加入,全加入

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

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;

其他回答

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

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

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

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

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

这里有很多很好的答案,非常准确的相对 algebra 例子. 这里是一个非常简单的答案,这可能有助于爱好者或初学者编码器与 SQL 编码 dilemmas。

基本上,更常见的是,JOIN询问会分为两个案例:

对于一个数据组的选项:

使用 INNER JOIN 当您正在寻找的相关 B 数据必须根据数据库设计存在;使用 LEFT JOIN 当您正在寻找的相关 B 数据 MIGHT 或 MIGHT NOT 根据数据库设计存在。

简单的说法:

一个内部合并只接收相匹配的行列。

虽然一个外部加入从一个表中获取相匹配的行,而在另一个表中的所有行......结果取决于你使用哪个行:

左: 右桌上的匹配行和左桌上的所有行 右: 左桌上的匹配行和右桌上的所有行 或 完整: 所有桌上的所有行。

INNER JOIN 要求在比较两个表中至少有一场比赛. 例如,表 A 和表 B 意味着 A 8 B (A 交叉点 B)。

LEFT OUTER JOIN 和 LEFT JOIN 是相同的. 它提供所有相匹配的记录在两张桌子和所有选项的左桌子。

同样,RIGHT OUTER JOIN和RIGHT JOIN是相同的,它提供了所有记录相匹配的两张表和所有可能的正确的表。

FULL JOIN 是 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 无重复的组合。

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

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