您表示对“内部”感兴趣,然后询问了一个说明“语义”的示例。我在回答语义。
考虑这些表。
Table1 : 1, 4, 6
Table2 : 2, 4, 5
Table3 : 3, 5, 6
这两个示例首先执行相同的连接,所以我将在此处执行。
FirstResult = T1 FULL JOIN T2 : (T1, T2)
(1, null)
(4, 4)
(6, null)
(null, 2)
(null, 5)
示例(一)
FirstResult FULL JOIN T3 ON FirstItem : (T1, T2, T3)
(1, null, null)
(4, 4, null)
(6, null, 6) <----
(null, 2, null)
(null, 5, null) <----
(null, null, 3)
示例(B)
FirstResult FULL JOIN T3 ON SecondItem : (T1, T2, T3)
(1, null, null)
(4, 4, null)
(6, null, null) <----
(null, 2, null)
(null, 5, 5) <----
(null, null, 3)
这从逻辑上向您展示了如何从连接中生成结果。
对于“内部”,有一种叫做查询优化器的东西,它会产生相同的结果——但它会做出实现选择以快速进行计算/io。这些选择包括:
- 首先访问哪些表
- 使用索引或表扫描查看表
- 要使用的连接实现类型(嵌套循环、合并、散列)。
另请注意:由于优化器做出了这些选择,并根据它认为是最优的来改变这些选择——结果的顺序可能会改变。结果的默认顺序始终是“最简单的”。如果您不想要默认排序,则需要在查询中指定排序。
要准确了解优化器将如何处理查询(此时,因为它可以改变主意),您需要查看执行计划。