理解SQL中的JOIN的好方法或教程

时间:2010-10-25 18:02:42

标签: sql sql-server database join

我们知道在任何RDBMS中都有不同类型的JOIN,例如: - 左连接,外连接,内连接,左外连接等。我们的项目中总是使用JOIN来处理我们的许多业务逻辑。然而,很少有人完全理解或掌握这些JOIN。通常,对JOIN知之甚少的人往往会对复杂的查询感到困惑。我感兴趣的领域主要与SQL Server有关,因为我们几乎在所有项目中都使用它。

我已经阅读了一些关于JOIN的好文章,但大多数都倾向于混淆而不是说服。所以我想知道是否有任何好的方法/方法或任何好的教程,以便很好地掌握SQL中的JOIN。教程应该足够简单,以及帮助我​​们更好地掌握JOIN的基础知识。

提前致谢。

5 个答案:

答案 0 :(得分:9)

我发现this link visually displaying the different joins in Venn diagrams非常简洁。

  

...左连接,外连接,内连接,左外连接......

LEFT JOIN和LEFT OUTER JOIN是相同的;大多数数据库只允许您省略OUTER关键字。

答案 1 :(得分:2)

我没有任何特定的教程,但可能会想到这一点。

当您加入表格时,默认情况下您正在进行内部联接。这意味着您将返回一个新表,其中包含原始两个表中的列,并且只返回与您指定的条件匹配的行。

当左连接与左外连接相同时,您将获得左表中的所有行(例如:leftTable left join rightTable),并且只有与您在右表中指定的条件匹配的行。对于右表上不满足您的连接条件的行,您将在右侧获得空数据。

几乎没有使用右连接,但它们就像左连接一样,除了从右边返回所有行,只有与你匹配的行连接左边的条件。

全外连接将显示来自两个表的所有数据,如果它与连接条件不匹配,则在任一侧显示null。可以把它想象成一种布局的(leftTable | bothTables | rightTable)。

答案 2 :(得分:1)

我发现它与书籍和文章一起有助于修补。如果你想这样做,你可能想看看what's here。您可以自由复制和更改的批次(目前> 13,000个工作示例)。

答案 3 :(得分:1)

我没有任何文章,但我可以推荐两本好书:SQL for Mere Mortals和Inside Microsoft SQL Server 2008 T-SQL查询。第一本书很好地解释了连接背后的集合理论,而后一本书在解释SQL Server如何处理查询时非常棒(字面上是第一章)。另外,关于后一本书,请参阅本文中提到的图表(文章也不错!):http://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/

答案 4 :(得分:0)

除了连接类型,我使用清晰一致的代码布局,这有助于简化复杂的连接。

举个例子:

SELECT Col1, Col2
FROM
    Customer AS C

        INNER JOIN
    Order AS O
        ON C.CustomerID = O.CustomerID

        INNER JOIN
    OrderItem AS OI
        ON O.OrderID = OI.OrderID

        LEFT JOIN
    OrderSomething OS
        ON C.CustomerID = OS.CustomerID
           AND O.OrderID = OS.OrderID

正如您所看到的,源表在单个列中清晰可见,连接的详细信息与每个表保持一致,因为我从不使用RIGHT JOIN,所以ON子句仅引用该子句上方的表。 / p>

这有助于我一次考虑加入一个,并消除原本会围绕它们的复杂性和混乱。写入需要花费一分钟的时间,但每次我必须维护或修改代码时,只需要花一分钟时间再次理解它。