两个SQL连接表示法之间有什么区别?

时间:2011-11-24 01:36:28

标签: sql sql-server tsql

SQL 1:select * from t1 join t2 on t1.f1 = t2.f2

SQL 2:select * from t1,t2 where t1.f1 = t2.f2

他们返回的结果是相同的。它们之间有什么不同吗?例如,在DBMS如何运行它们,或在查询计划中?

4 个答案:

答案 0 :(得分:11)

两个查询之间没有任何操作差异。

但是,显式连接符号是更好的学习和使用方式;留下另一个(尚未更改)遗留代码。

答案 1 :(得分:6)

一种是旧式,一种是新型(ANSI)。我发现为什么你想要使用新风格的主要原因是外部连接的标准支持。使用旧样式,外部联接是特定于供应商的。新风格标准:

select * from t1 left outer join t2 on t1.f1 = t2.f2

在您的示例中,SQL 1是新的,SQL 2是旧样式,顺便说一句。

答案 2 :(得分:1)

基本上,两个查询在运行中没有区别。

但是,两者都有相同的执行计划并且具有相同的成本,这意味着两个查询都需要相同的执行时间(相同的性能)。

使用连接运算符是一种现代方式。

答案 3 :(得分:1)

这两者在语义上是等价的(在主题的其他变体中)。一个不同之处在于,Stackoverflow上的许多用户在表达他们对“旧式”内部联接(您的SQL 2)的不容忍时非常直言不讳,除了在评论中被告诫之外,任何发布它们的人都有可能被低估。您也可能会看到应用“反模式”一词,这是无稽之谈。我没有在SO社区之外遇到这种风格的不宽容。事实上,“旧式”内部联接在SQL文献中非常普遍。