0 join
我有一个这样的查询:
SELECT *
FROM table_1
LEFT JOIN table_2
ON table_1.ID = table_2.ID
INNER JOIN table_3
ON table_1.ID = table_3.ID
Run Code Online (Sandbox Code Playgroud)
SQL如何处理这个连接?SQL 是否先连接表 1 和表 2,然后将这个新的超级表与表 3 连接?或者它会向另一个方向移动?
执行的逻辑顺序是您所描述的:
它从FROM
分析它的子句开始:
FROM table_1
LEFT JOIN table_2
ON table_1.ID = table_2.ID
INNER JOIN table_3
ON table_1.ID = table_3.ID
Run Code Online (Sandbox Code Playgroud)
根据优先规则,它变成:
FROM ( table_1
LEFT JOIN
table_2
ON
table_1.ID = table_2.ID
)
INNER JOIN
( table_3 )
ON
table_1.ID = table_3.ID
Run Code Online (Sandbox Code Playgroud)
所以,是的,它首先(逻辑上)生成table_1 LEFT JOIN table_2 ON table_1.ID = table_2.ID
一个“超级”表。
然后它在“超级”表和 table_3 之间进行第二次连接。
然后转到SELECT
子句,该子句本质上是按以下顺序排列的 3 个表的所有列:
SELECT table_1.*, table_2.*, table_3.*
Run Code Online (Sandbox Code Playgroud)
然后它产生结果集。
但实际的执行顺序可能完全不同。RDBMS(SQL Server 或 MySQL 或 Postgres 或 Oracle 或 DB2 或...)它允许选择任何看起来合适的顺序,只要它产生与执行的逻辑顺序相同的结果。