SQLJOIN:使用、打开或在何处有区别吗?

SQLJOIN:使用、打开或在何处有区别吗?

我想知道SQL对这些JOIN语句的执行方式是否有任何不同:

SELECT * FROM a,b WHERE a.ID = b.IDSELECT * FROM a JOIN b ON a.ID = b.IDSELECT * FROM a JOIN b USING(ID)

有表演上的差别吗?还是算法上的差异?

还是只是语法糖?


幕布斯6054654
浏览 477回答 3
3回答

米琪卡哇伊

在表现上没有差别。然而,第一种款式是ANSI-89,在一些商店会让你的腿断。包括我的。第二种风格是ANSI-92,而且更加清晰。例子:哪一个是连接,哪个是过滤器?FROM T1,T2,T3....WHERE T1.ID = T2.ID AND      T1.foo = 'bar' AND T2.fish = 42 AND      T1.ID = T3.IDFROM T1     INNER JOIN T2 ON T1.ID = T2.ID   INNER JOIN T3 ON T1.ID = T3.IDWHERE    T1.foo = 'bar' AND T2.fish = 42如果你有外部连接(=*, *=)那么第二种款式就会像广告中所说的那样起作用。在SQLServer 2005+中,最有可能不推荐的也是不推荐的ANSI-92风格也很难使用。如果你错过了一个条件,用旧的风格,你很容易得到笛卡儿的产品(交叉连接)。ANSI-92会出现语法错误。编辑:更多的澄清不使用“JointheWHERE”(隐式)的原因是外部联接的错误结果。如果您使用显式外部联接+隐式内部连接,则仍然会得到不可靠的结果+您的用法不一致不仅仅是句法:这是关于拥有一个语义正确查询SQLServer逻辑查询处理顺序是从,开始,加入,在那里.因此,如果将“内连接的隐式”和“外连接的显式”混合使用,则很可能不会得到预期的结果,因为查询是不明确的.

万千封印

我鄙视你通过使用WHERE..只是在我看来不对,一个肮脏的黑客。正确的ANSI连接用于:SELECT      p.Product,     o.OrderFROM      Product pINNER JOIN     Order oON     o.OrderID = p.OrderID更喜欢使用ON加入的时候WHERE过滤结果。记住,除了按要过滤结果的位置进行分组和排序之外,您将使用的最后一件东西是在哪里。因此,您不应该使用WHERE因为它很难读懂。SELECT      p.Product,     o.OrderFROM      Product pINNER JOIN     Order oON     o.OrderID = p.OrderIDWHERE     o.Category = 'IT'最后,您(开发人员)可能不会在未来出现,因此可读性和可维护性将帮助必须接管代码的倾注灵魂:)。当我看到开发人员使用WHERE要加入他们的表,这通常表明他们不了解足够的T-SQL。这是我个人的看法。
打开App,查看更多内容
随时随地看视频慕课网APP