【发布时间】:2011-11-24 01:36:28
【问题描述】:
SQL 1:select * from t1 join t2 on t1.f1 = t2.f2
SQL 2:select * from t1,t2 where t1.f1 = t2.f2
他们返回的结果是一样的。它们之间有什么区别吗?例如,DBMS 如何运行它们,或者在查询计划中?
【问题讨论】:
标签: 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 如何运行它们,或者在查询计划中?
【问题讨论】:
标签: sql sql-server tsql
这两个查询在操作上没有区别。
但是,显式连接表示法是更好的学习和使用方式;将另一个留给(尚未更改的)遗留代码。
【讨论】:
一种是旧样式,一种是新 (ANSI) 样式。我发现您为什么要使用新样式的主要原因是对外部连接的标准支持。对于旧样式,外部连接是特定于供应商的。新风格有它的标准:
select * from t1 left outer join t2 on t1.f1 = t2.f2
在您的示例中,SQL 1 是新样式,SQL 2 是旧样式,顺便说一句。
【讨论】:
基本上这两个查询在操作上没有区别。
但是,两者具有相同的执行计划和相同的成本,这意味着两个查询需要相同的时间来执行(相同的性能)。
使用连接运算符是一种现代方式。
【讨论】:
两者在语义上是等价的(在主题的其他变体中)。一个区别是,Stackoverflow 上的许多用户都非常直言不讳地表达了他们对“旧式”内部连接(您的 SQL 2)的不容忍,以至于任何发布它们的人都有被否决的风险,除了在 cmets 中受到警告之外。您还可能会看到应用了“反模式”一词,这是无稽之谈。在 SO 社区之外,我还没有遇到过这种风格不容忍的情况。事实上,“旧式”内连接在 SQL 文献中很常见。