【问题标题】:What's the difference between just using multiple froms and joins?仅使用多个 froms 和 join 有什么区别?
【发布时间】:2009-05-09 10:11:09
【问题描述】:

假设我有这个查询:

SELECT bugs.id, bug_color.name FROM bugs, bug_color
    WHERE bugs.id = 1 AND bugs.id = bug_color.id

我为什么要使用联接?它会是什么样子?

【问题讨论】:

    标签: sql join


    【解决方案1】:

    联接是合成糖,更易于阅读。

    带有连接的查询将如下所示:

    SELECT bugs.id, bug_color.name 
    FROM bugs
    INNER JOIN bug_color ON bugs.id = bug_color.id
    WHERE bugs.id = 1
    

    对于两个以上的表,连接有助于将与表相关的条件保存在一个位置,从而使查询更具可读性。

    【讨论】:

    • 我不完全确定“语法糖”是正确的短语。 “JOIN”关键字具有语义意义——数据库引擎是否选择对其进行操作并不重要。
    • 我相信 Andomar 所说的“语法糖”是指对于内部联接,两种形式(旧式和使用 INNER JOIN 的 ANSI JOIN)是等价的。尽管如此,对于外部连接,样式是非常不同的,所以我不能完全同意它是语法糖。
    【解决方案2】:

    join 关键字是连接表的新方法。

    当我学习 SQL 时,它还不存在,所以加入是按照您在问题中显示的方式完成的。

    现在我们有诸如连接和别名之类的东西来使查询更具可读性:

    select
        b.id, c.name
    from
        bugs as b
    inner join
        bug_color as c on c.id = b.id
    where
        b.id = 1
    

    还有其他的连接变体,如left outer joinright outer joinfull join,使用旧语法更难实现。

    【讨论】:

      【解决方案3】:

      连接语法允许外连接,所以你可以去:

      SELECT bugs.id, bug_color.name 
      FROM bugs, bug_color 
      LEFT OUTER JOIN bug_color ON bugs.id = bug_color.id
      WHERE bugs.id = 1
      

      【讨论】:

      • 在 Oracle 中,您可以使用 from 语法进行外连接。它使用 (+) 修饰符,例如“where bugs.id = bug_color.id(+)”
      • 您可以在没有连接语法的情况下执行 OUTER JOINS,在适当的 WHERE 子句中使用 = 或 =
      • *= 在 SQL Server 或 ANSI SQL 中通常不受支持。
      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2013-06-30
      • 2010-10-28
      相关资源
      最近更新 更多