mysql - 嵌套的INNER JOIN vs INNER JOIN vs WHERE:特定情况的正确性,性能,清晰度(不是典型的JOIN与WHERE问题)

我在研究内部连接,我是一个老SQL-92人。我想知道它的含义并理解它是如何工作的。所以这只是一个关于SQL连接的理论问题。
这是…

 SELECT * FROM   -- Query 1
 tbl1
 INNER JOIN (
          tbl2 
          INNER JOIN (
             tbl3 INNER JOIN tbl4 ON tbl3.Col1 = tbl4.Col1 
          ) 
          ON tbl2.col1 = tbl3.col2
 ) 
 ON tbl1.col1 = tbl3.col3

…和这个一样?
 SELECT * FROM   -- Query 2
 tbl3 
 INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1
 INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
 INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3

…还是这个(不按逻辑解析排序)?
  SELECT * FROM   -- Query 3
  tbl3 
  INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3
  INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
  INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1

..或此(引用节点已更改;请参见引用前引用了一个表,但笛卡尔积应相同)
  SELECT * FROM   -- Query 4
  tbl4 
  INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3
  INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
  INNER JOIN tbl3 ON tbl4.col1 = tbl3.col1

…还是这个?
  SELECT * FROM   -- Query 5 
  tbl1,tbl2,tbl3,tbl4
  WHERE 
  tbl3.col1 = tbl4.col1
  tbl2.col1 = tbl3.col2
  tbl1.col1 = tbl3.col3

…从美学、句法、最佳实践和功能角度?
这是一个非常开放的问题,但我认为对于社区来说,这是一个非常有趣的问题。


最佳答案:

我一直在密切合作的所有数据库引擎(这是SQL ServerOraclePostgreSQLMySQLSybaseSQLiteInformixFirebird)都会将其优化到相同的计划。
但是,第四个查询不会在所有引擎上进行解析(在ON子句中使用表之前,不能引用该表)。
JOIN提供影响计划中使用的联接顺序的MySQL子句。
STRAIGHT_JOIN中有一个提示,在Oracle中有一个类似的提示。如果查询使用这些提示,那么计划顺序也将受到联接顺序的影响。