代码之家  ›  专栏  ›  技术社区  ›  emma

MySQL何时使用JOIN,何时不使用[duplicate]

  •  0
  • emma  · 技术社区  · 7 年前

    我想知道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)
    

    有性能差异吗?或者算法上的差异?

    还是只是语法上的甜头?

    0 回复  |  直到 14 年前
        1
  •  48
  •   gbn    13 年前

    在性能上没有区别。

    然而,第一种款式是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.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
    

    如果你有外部连接( =* , *= )然后第二种样式将按广告的方式工作。第一个可能不会,而且在SQL Server 2005中也不推荐使用+

    ANSI-92的风格也很难博利克斯。如果你错过了一个条件,你可以很容易地用笛卡尔积(交叉连接)结束旧的风格。使用ANSI-92会出现语法错误。

    编辑:再澄清一下

    • 不使用“join The where”(隐式)的原因是外部连接的错误结果。
    • 如果使用显式外部联接+隐式内部联接,仍然会得到不可靠的结果+使用中存在不一致

    不仅仅是 语法 :这是关于 语义正确 查询

    编辑,2011年12月

    SQL Server logical query processing order 来自,在,加入,在哪里。。。

    因此,如果混合使用“隐式WHERE inner joins”和“explicit FROM outer joins”,则很可能不会得到预期的结果,因为查询是不明确的。。。

        2
  •  4
  •   marc_s    14 年前

    区别在于可读性和可维护性。 SELECT * FROM a JOIN b ON a.ID = b.ID 在同一个地方传达你的确切意图。

    我不会明确地说,因为我还没有进入上一个查询优化器的范围,但我很有信心,您看到的是性能上的微小差异,如果有的话。

        3
  •  2
  •   JonH    14 年前

    我鄙视你用 WHERE . 只是我觉得不对劲,一个卑鄙的家伙。正确的ANSI连接用于:

    SELECT 
        p.Product,
        o.Order
    FROM 
        Product p
    INNER JOIN
        Order o
    ON
        o.OrderID = p.OrderID
    

    喜欢使用 ON 当加入和 哪里 过滤结果。请记住,除了按要筛选结果的位置进行分组和排序之外,最后要使用的内容之一是WHERE。所以你不应该用 哪里 因为它很难阅读。

    SELECT 
        p.Product,
        o.Order
    FROM 
        Product p
    INNER JOIN
        Order o
    ON
        o.OrderID = p.OrderID
    WHERE
        o.Category = 'IT'
    

    最后,你(开发人员)可能不在未来,因此可读性和可维护性将帮助倾注灵魂谁必须接管你的代码:)。

    当我看到开发人员使用 哪里 加入他们的表通常表明他们不知道足够的t-SQL。这是我个人的看法。

        4
  •  0
  •   Community CDub    8 年前
        5
  •  0
  •   Community CDub    8 年前

    这是这个问题的副本: Explicit vs implicit SQL joins . 一般来说,我认为隐式(where version)是不好的形式,不像显式(on version)那么清楚。我也认为隐含的是被贬值,但不是100%的。不过,这两个项目的执行计划都是一样的。

    推荐文章