内连接和外连接混淆

时间:2014-07-01 17:40:49

标签: sql join

我试图从一个表中获取数据,所以我就这样加入:

SELECT A.ACCT_NO
FROM   ACCOUNT AS A
RIGHT OUTER JOIN CUSTOMER AS C
       ON A.CUST_ID = C.CUST_ID
WHERE  C.FIRST_NM = 'ADAM';

现在的问题是,我对联接的运作方式有些困惑。如果我将其更改为:

LEFT OUTER JOIN CUSTOMER AS C

甚至:

INNER JOIN CUSTOMER AS C

我得到了完全相同的数据!我在这里跟随这张图表:

http://i.stack.imgur.com/1UKp7.png

基于此,我假设只有RIGHT OUTER JOIN可以工作,因为它只是从CUSTOMER中提取列。然而,似乎并非如此,因为两个外连接都起作用。另外,我很震惊地看到INNER JOIN工作。为什么是这样?或者是因为我缺少关于加入SQL的关键概念?

谢谢!

3 个答案:

答案 0 :(得分:1)

此查询将为不在Account表中的值和Customer表中的所有记录返回空值

SELECT *
FROM   ACCOUNT AS A
RIGHT OUTER JOIN CUSTOMER AS C
       ON A.CUST_ID = C.CUST_ID

此查询将返回不在Customer表中的值的空值以及Account表中的所有记录

SELECT *
FROM   ACCOUNT AS A
LEFT JOIN CUSTOMER AS C
       ON A.CUST_ID = C.CUST_ID

此查询不会返回客户表中没有等效项的行,因此只返回来自拥有客户的帐户的行。

SELECT *
FROM   ACCOUNT AS A
INNER JOIN CUSTOMER AS C
       ON A.CUST_ID = C.CUST_ID

答案 1 :(得分:0)

这可能意味着您在每个键上都匹配。

如果没有密钥不匹配,RIGHT JOINLEFT JOININNER JOIN都应返回相同的数据。

所以您所看到的是'ADAM'中名为CUSTOMER的每位客户,ACCOUNT中都有相应的条目。

答案 2 :(得分:0)

使用外连接时,表中只需要匹配记录的限制条件必须放在连接上,或者必须使用或条件来处理NULL。如果不这样做,您将获得与INNER Join相同的结果。它与何时发生连接以及何时应用where子句条件有关。当限制条件在连接上时,它发生在连接之前,在where子句之后。在where子句中,外连接生成的NULL值然后被where子句排除...使它看起来像一个内连接。

由于我认为您想要所有帐户但只需要名字为Adam的客户信息,您需要左连接,但将where子句标准移动到连接。

首选:

SELECT A.ACCT_NO
FROM   ACCOUNT AS A
LEFT OUTER JOIN CUSTOMER AS C
       ON A.CUST_ID = C.CUST_ID
       AND C.FIRST_NM = 'ADAM';

OR

如果你必须

    SELECT A.ACCT_NO
    FROM   ACCOUNT AS A
    LEFT OUTER JOIN CUSTOMER AS C
           ON A.CUST_ID = C.CUST_ID
  WHERE (C.FIRST_NM = 'ADAM' OR c.First_NM is null)

但是c.First_NM不能是可空的,或者你无法区分连接上的null和记录上的null。

http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/获取关于加入的帮助。

表格的顺序很重要......

  • 如果您想要所有客户,只需要那些匹配的客户 然后客户使用您列出的RIGHT JOIN
  • 如果您想要所有帐户,只有那些拥有相关帐户的客户,请使用LEFT JOIN
  • 如果您希望所有帐户和所有客户都使用FULL OUTER JOIN
  • 如果您只希望拥有帐户的客户使用INNER JOIN