2008-12-27 83 views
25

SQL的两位下方得到相同的结果SQL内部联接语法

SELECT c.name, o.product 
FROM customer c, order o 
WHERE c.id = o.cust_id 
AND o.value = 150 

SELECT c.name, o.product 
FROM customer c 
INNER JOIN order o on c.id = o.cust_id 
WHERE o.value = 150 

我见过使用在不同的企业标准两种风格。从我看到的,第二个是大多数人在网上推荐的。除了风格之外,这有没有真正的原因?使用Inner Join有时会有更好的性能吗?

我注意到Ingres和Oracle开发人员倾向于使用第一种风格,而Microsoft SQL Server用户倾向于使用第二种风格,但这可能只是巧合。

感谢您的任何见解,我想了解这一段时间。

编辑:我改变了'SQL Inner Join与Cartesian Product'的标题,因为我使用的是不正确的terminolog。感谢迄今为止的所有回应。

回答

25

这两个查询都是内部连接和等价物。第一种是较老的做事方法,而在引入SQL-92标准之后,JOIN语法的使用才变得很常见(我相信这是在较早的定义中,在此之前并没有特别广泛地使用)。

强烈首选使用JOIN语法,因为它将连接逻辑从WHERE子句中的过滤逻辑中分离出来。虽然JOIN语法实际上是内部连接的语法糖,但其强大之处在于外部连接,其中旧的语法可能会产生无法明确描述连接的情况,而解释依赖于实现。 [LEFT | RIGHT] JOIN语法避免了这些缺陷,因此为了保持一致性,JOIN子句的使用在任何情况下都是可取的。

请注意,这两个例子都不是笛卡尔产品。对于你使用任何

SELECT c.name, o.product 
FROM customer c, order o 
WHERE o.value = 150 

SELECT c.name, o.product 
FROM customer c CROSS JOIN order o 
WHERE o.value = 150 
3

这两个查询都在执行内部连接,只是语法不同。

4

其实这些例子是相同的,都不是笛卡尔的产品。当您加入两个表时没有指定连接条件,如在

select * 
from t1,t2 

还有就是这对Wikipedia了很好的讨论返回笛卡尔积。

6

要回答你的问题的一部分,我认为Oracle中的JOIN ... ON语法中的早期错误使得Oracle用户不再使用该语法。我不认为现在有什么特别的问题。

它们是等价的,应该被解析为相同的内部表示以进行优化。

+0

ANSI JOIN语法中的一些错误不是我称之为“早期”的错误。在之前我们做过大量查询的工作中,如果使用ANSI JOIN语法,我们会在查询中可能存在的总列数上受到严格限制。你会发现,至少在10g发布时还有问题。 – 2012-08-28 12:56:18

+0

是的,我仍然不使用ANSI连接。 – 2012-08-28 13:41:48

4

Oracle很晚才支持JOIN ... ON(ANSI)语法(直到Oracle 9),这就是为什么Oracle开发人员经常不使用它。

就个人而言,我更喜欢在使用ANSI语法的时候,在逻辑上明确表示一个表正在驱动查询,而另一个表正在驱动查询表时。当表格“相等”时,我倾向于使用笛卡尔语法。

性能不应该有所不同。

3

的JOIN ... ON ...语法是最近除了ANSI和ISO规格为SQL。 JOIN ... ON ...语法通常是首选的,因为它1)将连接标准从WHERE子句移出,使得WHERE子句仅用于过滤,2)使得它更加明显,因为如果您创建可怕的笛卡尔产品,因为每个JOIN必须至少伴有一个ON子句。如果所有连接条件都刚好在WHERE子句中进行AND运算,那么在缺少一个或多个条件时就不那么明显了。