8

Possible Duplicate:
Inner join vs Where

Today I got into a debate with my project manager about Cartesian products. He says a 'natural join' is somehow much better than using 'select from where' because the later cause the db engine to internally perform a Cartesian product but the former uses another approach that prevents this. As far as I know, the natural join syntax is not any different in anyway than 'select from where' in terms of performance or meaning, I mean you can use either based on your taste.

SELECT * FROM table1,table2 WHERE table1.id=table2.id
SELECT * FROM table1 NATURAL JOIN table2

please elaborate about the first query causing a Cartesian product but the second one being somehow more smart

4

5 回答 5

14

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

SELECT * FROM table1 JOIN table2 ON table1.id = table2.id

自然连接可能很容易且“干净”,但更可能是完全不可预测的......

编辑,2012 年 5 月。

副本的接受答案实际上并没有回答 NATURAL JOIN。
这些链接进一步详细讨论。

tl;博士

性能不是问题:但是您的查询应该是可靠和可预测的,而 NATURAL JOIN 肯定不是。

根据这些链接,“在 WHERE 中加入”又名隐含的 JOIN 也就是所谓的“笛卡尔”也很糟糕(这同样适用于 Oracle 和 SQL Server)

于 2010-06-17T15:38:49.917 回答
4

这取决于。

自然连接链接两个同名表中的所有列。如果表 1 和表 2 中仅有的两列同名是 ID,那么优化器应该对这两个查询进行相同的评估;另一方面,如果两个表中有两个以上具有相同名称的列(或根本没有),则执行完全不同的查询。

在任何情况下,笛卡尔积几乎总是(我很想说总是)比任何其他类型的连接执行得更差,因为它将一个表的每条记录与另一个表的每条记录连接起来。

您的经理在区分臀大肌和尺骨上端的能力如何?

于 2010-06-17T15:44:33.960 回答
3

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

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

汤姆都同意了

于 2010-06-17T15:37:04.790 回答
2

我不会使用任何一种语法。您的查询表示内部连接,我会为此使用显式语法。您永远不应该使用隐含连接,它们会受到误解(是意外的交叉连接还是您打算这样做?)和意外的交叉连接。你会使用 18 年前用更好的语法替换的 C# 代码吗(实际上 C# 在 18 年前并不存在,但我想你明白我在说什么)?那你为什么要使用过时的 SQL 代码呢?

隐含连接不仅是维护问题,而且如果您尝试对外部连接使用隐含连接语法,这可能是一个大问题,因为它在某些数据库中无法正常工作,并且至少在一个数据库 SQL Server 中已被弃用, 我知道。而且,如果您需要对左连接中的表进行过滤,则根本无法使用隐含的语法来执行此操作,因为它会将其转换为内部连接。

是的,您的代码可以工作,但这是一种糟糕的技术,您应该习惯于显式使用内部连接,这样您就可以让未来的维护者清楚地了解您的意图,这样您就不会在编写更复杂的查询时产生意外问题。如果使用显式语法对您来说不是第二天性,那么当您需要使用 if 来处理更复杂的事情时,您将非常困难。

在查询数据库的 30 年中,我从未见过需要编写自然连接并且必须查找一个是什么,因此使用它并不比隐含连接更清楚。

于 2010-06-17T17:48:20.073 回答
2

首先要指出的是,数据库优化器以自己的方式解释语法。显然,每种产品都各不相同,但坦率地说,如果任何 DBMS 惩罚最常见的表连接机制,我会感到惊讶。

关于术语,它是生成笛卡尔积的交叉连接。这与内部连接不同,并且会生成不同的结果集。

最后,自然连接是可怕的,实际上是等待发生的错误。所有思想正确的人都应该避免它们。

于 2010-06-17T15:38:01.213 回答