了解SQL中的自然连接

时间:2018-01-02 02:20:03

标签: mysql join natural-join

所以我对SQL很新,目前我仍然坚持使用Natural Join的概念。

目前我了解Natural Join运算符通过匹配具有相同名称的所有列并丢弃重复列并丢弃不匹配的行来连接表。

所以最近我遇到了一个非常基本的问题,但是我无法绕过它。

因此有两个关系R(A,B,C)和S(A,B,D)

    A B C           A B D
    6 8 7           5 8 7
    6 6 7           6 6 7
    7 8 6           6 8 6

以下查询会产生多少行?

SELECT * FROM R NATURAL JOIN S

所以我立即看到两列匹配'它们是A和B.通过使用自然连接,它会考虑A和B,或者只考虑A,因此,将丢弃哪些信息。

答案是2行。有人可以解释获得2行的方法吗?

谢谢!

这两行是否有机会

    A B D
    6 6 7
    6 6 6

如果是这样,我可以删除这个问题

2 个答案:

答案 0 :(得分:1)

评论太长了。不要使用自然连接。不要费心学习天然连接。他们是可憎的。

为什么呢?连接条件基于具有相同名称的列。自然连接甚至不会将声明的外键关系考虑在内。这可能非常危险。或者 - 在我的情况下 - 因为几乎所有的表都有CreatedAtCreatedBy,所以无论如何它们都是无用的。

而是列出join个键。在您的情况下(因为您有select *),using子句是最合适的:

SELECT * 
FROM R JOIN
     S
     USING (A, B);

这也有一个优点,即密钥明确显示在查询中,这大大减少了错误的范围。

答案 1 :(得分:0)

冒着过度简化的风险,NATURAL JOIN会对同名的列执行联接。

这是使用更多生成算子的重写(在许多其他可能的重写中):

SELECT R.A, R.B, C, D
  FROM R, S
 WHERE R.A = S.A
       AND R.B = S.B

结果有四列两行:

| A | B | C | D |
-----------------
| 6 | 6 | 7 | 7 |
| 6 | 8 | 7 | 6 |