当前位置: 首页 > 面试题库 >

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

殷宇
2023-03-14
问题内容

我想知道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内部联接”和“显式来自外部联接”混合使用,则由于查询是模棱两可的,您极有可能无法获得预期的结果…



 类似资料:
  • 本文向大家介绍Where 与 Having之间的区别,包括了Where 与 Having之间的区别的使用技巧和注意事项,需要的朋友参考一下 SQL查询中使用的两个关键字“ Where”和“ Having”都是用于根据给定条件过滤和汇总从数据库中检索到的数据。 根据两个关键字的特征,我们可以区分Where和Have,如下所示: 序号 键 where having 1 定义 SQL查询中的WHERE子

  • 问题内容: 以下两个命令有什么区别? 和 哪一个更快?如果是另一种类型,会有所不同吗? 问题答案: 它们在语义上是相同的。 只是第二个示例中一串相等语句的简写形式。性能也应该相同。 类型无关紧要,它将始终计算为一串相等的字符串。 但是,使用和数据可能有所不同,a的比较结果不会为false ,因此您可能会得到结果集中未曾期望的行。 举个例子: 上面的查询将不会返回一行,即使在面值既不或者-这是因为是

  • 问题内容: 我的Google-fu使我失败了。 在Python中,以下两个相等测试是否等效? 这是否适用于您要比较实例(list说)的对象? 好的,这样可以回答我的问题: 因此,==测试重视在哪里is进行测试以查看它们是否是同一对象? 问题答案: 如果两个变量指向同一个对象(如果变量引用的对象相等),则将返回。 在您的情况下,第二个测试仅能工作,因为Python会缓存小的整数对象,这是实现细节。对

  • 从列表中移除元素的上述三种方法有什么区别吗?

  • 问题内容: Swift提供了关键字(和)检查对象是否可以成功向下转换: 而且还提供了原文: 对于符合的类,这真的有很大不同吗? 问题答案: 是的, 这是有区别的:在Swift中可以与任何类一起使用,而只能与属于或实现的那些类一起使用。

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型