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/5654278/

相关文章:

mysql - 如何使用与 table1 无关的子句正确计算 table2 中与 table1 中的项目相关的行

php - 使用 LIKE 子句的 MySql 搜索不起作用

mysql - 查找每个办公室的员 worker 数 - Mysql

bash - 为什么 `find -depth 1` 列出目录这么慢?

ios - Objective-C 中的逗号

java - 带有元组条件的 QueryDSL 和 SubQuery

sql - 删除/忽略表中的重复记录并仅保留最早的记录

java - 使用java测量磁盘写入/读取速度

python - 如何对 numpy 数组进行采样并有效地对每个样本执行计算?

c++ - std::initializer_list 变体