为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯6054654 2019-06-15 10:44:18
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)有表演上的差别吗?还是算法上的差异?还是只是语法糖?
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

在表现上没有差别。

然而,第一种款式是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逻辑查询处理顺序是从,开始,加入,在那里.

因此,如果将“内连接的隐式”和“外连接的显式”混合使用,则很可能不会得到预期的结果,因为查询是不明确的.


查看完整回答
反对 回复 2019-06-15
?
万千封印

TA贡献1891条经验 获得超3个赞

我鄙视你通过使用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。这是我个人的看法。


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 476 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信