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,Informix和Firebird)将其优化,以同样的计划.
但是,第四个查询不会解析所有引擎(在ON子句中使用之前,不能引用子句中的表JOIN)
MySQLoffer STRAIGHT_JOIN子句,它影响计划中使用的连接顺序.
在Oracle,有一个提示,/*+ ORDERED */并SQL Server有一个类似的提示FORCE ORDER.如果查询使用这些提示,则计划订单也会受到连接顺序的影响.