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

Whi*_*cal 18 mysql sql ms-access nested join

我正在研究内部连接,而且我是一个老的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
Run Code Online (Sandbox Code Playgroud)

......跟这个一样吗?

 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
Run Code Online (Sandbox Code Playgroud)

......或者这个(没有按逻辑分辨率排序)?

  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
Run Code Online (Sandbox Code Playgroud)

..或者这个(参考节点改变了;看到它被引用之前引用的表,但笛卡尔积应该相同)

  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
Run Code Online (Sandbox Code Playgroud)

..或这个?

  SELECT * FROM   -- Query 5 
  tbl1,tbl2,tbl3,tbl4
  WHERE 
  tbl3.col1 = tbl4.col1
  tbl2.col1 = tbl3.col2
  tbl1.col1 = tbl3.col3
Run Code Online (Sandbox Code Playgroud)

......从审美,句法,最佳实践和功能观点来看?

这是一个非常开放的问题,但我认为社区提供一些亮点非常有趣!

Qua*_*noi 13

所有的数据库引擎,我用了密切合作(这是SQL Server,Oracle,PostgreSQL,MySQL,Sybase,SQLite,InformixFirebird)将其优化,以同样的计划.

但是,第四个查询不会解析所有引擎(在ON子句中使用之前,不能引用子句中的表JOIN)

MySQLoffer STRAIGHT_JOIN子句,它影响计划中使用的连接顺序.

Oracle,有一个提示,/*+ ORDERED */SQL Server有一个类似的提示FORCE ORDER.如果查询使用这些提示,则计划订单也会受到连接顺序的影响.