在性能方面,自然加入比SELECT FROM WHERE更好吗?

Ash*_*ary 8 sql select product cartesian

可能重复:
内部联接vs其中

今天我和我的项目经理就Cartesian产品进行了辩论.他说'自然连接'比使用'select from where'要好得多,因为后者会导致db引擎在内部执行笛卡尔积,但前者使用另一种方法来阻止这种情况.据我所知,自然连接语法在性能或含义方面与"从哪里选择"没有任何不同,我的意思是你可以根据自己的喜好使用.

SELECT * FROM table1,table2 WHERE table1.id=table2.id
SELECT * FROM table1 NATURAL JOIN table2
Run Code Online (Sandbox Code Playgroud)

请详细说明导致笛卡尔积的第一个查询,但第二个查询更加智能

gbn*_*gbn 14

正确的方法应该是明确的过滤器和连接分开

SELECT * FROM table1 JOIN table2 ON table1.id = table2.id
Run Code Online (Sandbox Code Playgroud)

自然联合可能很容易和"干净",但更可能完全不可预测......

编辑,2012年5月.

复制的接受答案实际上并不回答NATURAL JOIN.
这些链接进一步详细讨论.

TL;博士

性能不是问题:但是您的查询应该是可靠且可预测的,而NATURAL JOIN当然不是.

"在WHERE中加入"又名隐含的JOIN又称你所谓的"笛卡尔"也是坏的,因为这些链接(同样适用于Oracle和SQL Server)

  • +1幸运的是,很多数据库供应商都不支持自然联接.IMO,显式连接对于读者来说更容易,因为它们没有留下确定连接列的神秘感. (2认同)
  • 特别是,假设您有第二列,例如"is_active",这两列对于两个表都是通用的.这将包含在自然连接中,并且您可能会获得比您预期的更少的行. (2认同)

rfu*_*sca 3

就性能而言,没有区别。它被讨论了一遍又一遍。谷歌搜索“join syntax oracle vs where”可以找到几篇不错的文章,其中包括 Alexander 引用的本网站上的一篇文章。

但是,使用 NATURAL JOIN 时要小心。它将选择常见的列,例如 createate 或 createuser 或您通常不关心加入的列,并且可能会导致问题。我强烈建议不要在生产中使用 NATURAL JOIN...只需使用 INNER JOIN 并指定列。

甚至汤姆也同意