毛毛熊的法桐 发表于 2023-9-13 14:25:45

SQL JOIN:USING,ON或WHERE之间有区别吗?

我想知道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 JOINs(=*,*=),则第二种样式将按照广告中的说明工作。第一个最有可能不会这样做,并且在SQL Server
2005+中也已弃用
ANSI-92样式也很难实现。使用旧样式时,如果您错过条件,则可以轻松获得笛卡尔乘积(交叉连接)。您将收到ANSI-92的语法错误。
编辑:更多澄清
不使用“在何处联接”(隐式)的原因是外部联接的结果令人迷惑。
如果您使用显式的OUTER JOINs +隐式的INNER JOINs,您仍然会得到不可靠的结果+您的用法不一致

这不仅是 语法 :它是关于 语义正确的 查询的
编辑,2011年12月
SQL Server 逻辑 查询的处理顺序为FROM,ON,JOIN,WHERE …
因此,如果您将“隐式WHERE内部联接”和“显式来自外部联接”混合使用,则由于查询是模棱两可的,您极有可能无法获得预期的结果…
页: [1]
查看完整版本: SQL JOIN:USING,ON或WHERE之间有区别吗?