SQL JOIN : is there a difference between USING, ON 或 WHERE?

标签 sql performance syntax join expression

我想知道 SQL 在这些连接语句上执行的方式是否有什么不同:

SELECT * FROM a,b WHERE a.ID = b.ID

SELECT * FROM a JOIN b ON a.ID = b.ID

SELECT * FROM a JOIN b USING(ID)

有性能差异吗?还是算法差异?

或者它只是语法糖?

最佳答案

性能没有差异。

但是,第一种样式是 ANSI-89,在某些商店中可能会导致您的腿骨折。包括我的。第二种样式是 ANSI-92,更加清晰。

示例:

哪个是 JOIN,哪个是过滤器?

FROM T1,T2,T3....
WHERE T1.ID = T2.ID AND
     T1.foo = 'bar' AND T2.fish = 42 AND
     T1.ID = T3.ID

FROM T1 
   INNER JOIN T2 ON T1.ID = T2.ID
   INNER JOIN T3 ON T1.ID = T3.ID
WHERE
   T1.foo = 'bar' AND T2.fish = 42

如果您有 OUTER JOIN(=**=),那么第二种样式将按照广告中的方式工作。第一个很可能不会,并且在 SQL Server 2005+ 中也已弃用

ANSI-92 风格也更难使用。使用旧的样式,如果您错过了某个条件,您很容易得到笛卡尔积(交叉连接)。 ANSI-92 会出现语法错误。

编辑:更多说明

  • 不使用“join the where”(隐式)的原因是外连接的结果不可靠。
  • 如果您使用显式 OUTER JOIN + 隐式 INNER JOIN,您仍然会得到不可靠的结果并且用法不一致

这不仅仅是语法:它是关于语义正确的查询

编辑,2011 年 12 月

SQL Server logical query processing order是 FROM、ON、JOIN、WHERE...

因此,如果您混合使用“隐式 WHERE 内部联接”和“显式 FROM 外部联接”,您很可能不会获得预期结果,因为查询不明确...

关于SQL JOIN : is there a difference between USING, ON 或 WHERE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52019847/

相关文章:

java - http请求的线程池

sql - 甲骨文: '= ANY()' 与 'IN ()'

powershell - 在 Powershell 中替换多个字符串的正确语法

mysql - 现在是 UNIX 时间

mysql - 如何根据 MySQL 中的当前值更新字段?

c++ - 没有 GL_COLOR_INDEX 的 glBitmap()

performance - SQL 2008r2 将索引更改为索引查找而不是索引扫描

sql - 如何在Sql Developer中连接到本地数据库

mysql - 仅将一个表的一列与另一个表连接

syntax - clojure 需要语法原理