Sql 什么';标准内部联接和内部联接的内部联接之间的区别是什么?
有人能解释一下这两者之间的区别吗:Sql 什么';标准内部联接和内部联接的内部联接之间的区别是什么?,sql,tsql,Sql,Tsql,有人能解释一下这两者之间的区别吗: SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... 这是: SELECT * FROM A INNER JOIN B INNER JOIN C ON ... ON ... 例如: SELECT A.Something, B.Something, C.Something INTO #TempTable FROM TableA A INNER JOIN TableB B INNER JOIN
SELECT * FROM A
INNER JOIN B ON ...
INNER JOIN C ON ...
这是:
SELECT * FROM A
INNER JOIN B INNER JOIN C ON ... ON ...
例如:
SELECT A.Something, B.Something, C.Something
INTO #TempTable
FROM TableA A
INNER JOIN TableB B
INNER JOIN TableC C ON C.FK = B.PK
ON A.JoinField = B.ID
使用
内部联接
没有区别。区别在于外部连接
起作用时
假设您有以下表格:
表A:
ID BID
----------- -----------
1 1
2 NULL
3 2
表B:
ID BVAL
----------- ----------
1 X
2 Y
表C:
BID CVAL
----------- ----------
1 ABC
如果你再问
SELECT * FROM A
LEFT OUTER JOIN B
ON B.ID = A.ID
INNER JOIN C
ON C.BID = B.ID
您将获得一条记录:
ID BID ID BVAL BID CVAL
----------- ----------- ----------- ---------- ----------- ----------
1 1 1 X 1 ABC
但是这个问题
SELECT * FROM A
LEFT OUTER JOIN B
INNER JOIN C
ON C.BID = B.ID
ON B.ID = A.ID
将给出三个:
ID BID ID BVAL BID CVAL
----------- ----------- ----------- ---------- ----------- ----------
1 1 1 X 1 ABC
2 NULL NULL NULL NULL NULL
3 2 NULL NULL NULL NULL
如您所见,嵌套的
联接在另一个联接之前进行计算。与内部联接没有区别。区别在于外部连接
起作用时
假设您有以下表格:
表A:
ID BID
----------- -----------
1 1
2 NULL
3 2
表B:
ID BVAL
----------- ----------
1 X
2 Y
表C:
BID CVAL
----------- ----------
1 ABC
如果你再问
SELECT * FROM A
LEFT OUTER JOIN B
ON B.ID = A.ID
INNER JOIN C
ON C.BID = B.ID
您将获得一条记录:
ID BID ID BVAL BID CVAL
----------- ----------- ----------- ---------- ----------- ----------
1 1 1 X 1 ABC
但是这个问题
SELECT * FROM A
LEFT OUTER JOIN B
INNER JOIN C
ON C.BID = B.ID
ON B.ID = A.ID
将给出三个:
ID BID ID BVAL BID CVAL
----------- ----------- ----------- ---------- ----------- ----------
1 1 1 X 1 ABC
2 NULL NULL NULL NULL NULL
3 2 NULL NULL NULL NULL
如您所见,嵌套的联接在另一个联接之前进行计算。联接并不总是在表之间。它们经常介于以前的JOIN
s结果之间。因此,连接顺序很重要
在第一个查询中,我们将表A
连接到表B
。在第一个ON
子句中,我们只能参考表A
或B
。假设这会产生一个结果,我们将非正式地称之为a_B
。然后,第二个连接发生在A_B
和C
之间。第二个ON
子句可能包含对A
、B
或C
的引用,但要明确的是,A
或B
引用实际上是对第一个JOIN
生成的A\u B
结果的引用
在第二个查询中,我们首先将表B
连接到表C
。在第一个ON
子句(与第二个JOIN
子句相关)中,我们只能参考表B
或C
。我们将该结果称为B_C
。第二个ON
子句完成了第一个JOIN
,将A
连接到B\u-C
,第二个ON
子句可以再次引用A
、B
或C
,但这次B
或C
是对B\u-C>的引用
可视化如何匹配JOIN
和ON
子句的最清晰的方法是将JOIN
视为一个左括号和ON
上的一样。然后,匹配的括号表示
s上的哪个与哪个JOIN
匹配,嵌套告诉您连接发生的顺序
1尽管这些差异在仅使用内部连接和上的每个连接时并不重要,事实上,它们只引用两个表中的一个表。连接并不总是在表之间。它们经常介于以前的JOIN
s结果之间。因此,连接顺序很重要
在第一个查询中,我们将表A
连接到表B
。在第一个ON
子句中,我们只能参考表A
或B
。假设这会产生一个结果,我们将非正式地称之为a_B
。然后,第二个连接发生在A_B
和C
之间。第二个ON
子句可能包含对A
、B
或C
的引用,但要明确的是,A
或B
引用实际上是对第一个JOIN
生成的A\u B
结果的引用
在第二个查询中,我们首先将表B
连接到表C
。在第一个ON
子句(与第二个JOIN
子句相关)中,我们只能参考表B
或C
。我们将该结果称为B_C
。第二个ON
子句完成了第一个JOIN
,将A
连接到B\u-C
,第二个ON
子句可以再次引用A
、B
或C
,但这次B
或C
是对B\u-C>的引用
可视化如何匹配JOIN
和ON
子句的最清晰的方法是将JOIN
视为一个左括号和ON
上的一样。然后,匹配的括号表示
s上的哪个与哪个JOIN
匹配,嵌套告诉您连接发生的顺序
1尽管这些差异在仅使用内部
联接以及在
上的每个联接时通常并不重要,实际上,它们只引用两个表中的一个表。结果将是相同的。
如果只使用内部联接
但第一种方法是标准和正确的方法。
它更具可读性,也不容易混淆
它如何影响解释计划?这取决于数据库。
SQL是一种声明性语言。我们问的是我们想要什么,而不是如何把它拿出来。
(至少在不使用t-SQL的情况下)
下面是一个T-SQL示例,演示结果是相同的。
两者都会导致:
ID_A ID_B ID_C
---- ---- ----
12 22 32
结果将是相同的。
如果只使用内部联接
但第一种方法是标准和正确的方法。
它更具可读性,也不容易混淆
它如何影响解释计划?这取决于数据库。
SQL是一种声明性语言。我们问的是我们想要什么,而不是如何把它拿出来。
(至少在不使用t-SQL的情况下)
下面是一个T-SQL示例,演示结果是相同的。
两者都会导致:
ID_A ID_B ID_C
---- ---- ----
12 22 32
请在提交任何查询之前测试一次。除了第一个是有效的,第二个是无效的join之外,没有什么可说的了