此外,如何适应左外加入,右外加入和全外加入?
当前回答
“外部”和“内部”只是可选的元素,你只是处理两个(三个)类型的加入。内部加入(或什么是默认使用只有“加入”)是一个加入,只有符合标准的元素在两个表上存在。
“外部”插件是相同的内部插件加上不匹配的左或右表的元素,并在其他表的所有列上添加零。
全合是内合,右合和左合。
总之,如果我们有这样的表A
idA | ColumnTableA | idB |
---|---|---|
1 | Jonh | 1 |
2 | Sarah | 1 |
3 | Clark | 2 |
4 | Barbie | NULL |
图B如下:
idB | ColumnTableB |
---|---|
1 | Connor |
2 | Kent |
3 | Spock |
内部加入:
from tableA join tableB on tableA.idB = tableB.idB
idA | ColumnTableA | idB | ColumnTableB |
---|---|---|---|
1 | Jonh | 1 | Connor |
2 | Sarah | 1 | Connor |
3 | Clark | 2 | Kent |
左边加入:
from tableA left join tableB on tableA.idB = tableB.idB
idA | ColumnTableA | idB | ColumnTableB |
---|---|---|---|
1 | Jonh | 1 | Connor |
2 | Sarah | 1 | Connor |
3 | Clark | 2 | Kent |
4 | Barbie | NULL | NULL |
向外加入:
from tableA right join tableB on tableA.idB = tableB.idB
idA | ColumnTableA | idB | ColumnTableB |
---|---|---|---|
1 | Jonh | 1 | Connor |
2 | Sarah | 1 | Connor |
3 | Clark | 2 | Kent |
NULL | NULL | 3 | Spock |
全外加入:
from tableA full join tableB on tableA.idB = tableB.idB
idA | ColumnTableA | idB | ColumnTableB |
---|---|---|---|
1 | Jonh | 1 | Connor |
2 | Sarah | 1 | Connor |
3 | Clark | 2 | Kent |
4 | Barbie | NULL | NULL |
NULL | NULL | 3 | Spock |
其他回答
一个内部合并只显示行,如果在合并的另一边(右)有一个匹配记录。
一(左)外部连接显示在左侧的每个记录的行列,即使连接的另一(右)侧没有匹配行列,如果没有匹配行列,对另一(右)侧的列将显示零。
假设你加入没有复制的列,这是一个非常常见的案例:
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
他们不显示一个十字路口和一个内部联盟之间的区别,例如,或者更一般地显示不同类型的联盟预言之间的区别,或者提供一个框架,以便思考他们将如何运作。
此分類上一篇
選擇 A.Colour, B.Colour 從 A CROSS JOIN B
一些例子
上面是经典的equi加入。
内部合并条件不一定是平等条件,也不需要从两个(甚至任何)表中提到列。 评估 A.Colour NOT IN(“绿色”,“蓝色”)在交叉合并返回的每个行。
选择 A.Colour, B.Colour FROM A INNER JOIN B ON 1 = 1
此分類上一篇
此分類上一篇
此分類上一篇
选择 A.Colour, B.Colour FROM A FULL OUTER JOIN B ON 1 = 0
此分類上一篇
此分類上一篇
此分類上一篇
饰 SQL Fiddle
批评了我非常喜欢的红色阴影的Venn图表,我认为发表我自己的尝试是公平的。
虽然 @Martin Smith 的答案在很长一段时间内是这个集合中最好的,但他的单一显示每个桌子的关键列,而我认为理想的非关键列也应该显示。
在允许的半小时内我能做的最好,我仍然不认为它足够地表明,由于TableB中缺乏关键值,零值存在,或者外加入实际上是一个联盟而不是一个联盟:
此分類上一篇
内部加入
回收相匹配的行只,也就是说, A 交叉 B。
此分類上一篇
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
左向外加入
从第一张表中选择所有记录,以及与附件密钥相匹配的第二张表中的任何记录。
此分類上一篇
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
全外加入
从第二张表中选择所有记录,以及与附件密钥相匹配的第一张表中的任何记录。
此分類上一篇
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
参考
内部和外部加入 SQL 示例和加入区块 SQL: JOINS
推荐文章
- GROUP BY with MAX(DATE)
- 删除id与其他表不匹配的sql行
- 等价的限制和偏移SQL Server?
- 是什么导致这个ActiveRecord::ReadOnlyRecord错误?
- 为什么我不能在DELETE语句中使用别名?
- 在SQL Server Management Studio中保存带有标题的结果
- "where 1=1"语句
- 如何选择一个记录和更新它,与一个单一的查询集在Django?
- 多语句表值函数vs内联表值函数
- 如何从Oracle的表中获取列名?
- NOLOCK提示在SELECT语句中的作用
- SQL OVER()子句-它什么时候有用,为什么有用?
- 如果字段在MySQL中为空,则返回0
- 我如何使用ROW_NUMBER()?
- SQL或者TSQL是图灵完备的吗?