了解sql中的自然连接

yrdbyhpb  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(404)

因此,我对sql是相当陌生的,目前我仍然坚持自然连接的概念。
目前我了解到,自然连接操作符通过匹配所有具有相同名称的列、丢弃重复的列和不匹配的行来连接表。
所以最近我遇到了一个问题,非常基本的真的,但我不能把我的头围绕它。
所以有两个关系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

下面的查询将生成多少行?
从r自然连接s中选择*
所以我立刻看到两列“匹配”它们是a和b。通过使用自然连接,它将同时考虑a和b或者仅仅考虑a,因此,哪些信息将被丢弃。
答案是两排。有人能解释一下得到两行的方法吗?
谢谢!
这两排有可能吗

A B D
    6 6 7
    6 6 6

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

von4xj4u

von4xj4u1#

这太长了,不能发表评论。不要使用自然连接。不用费心学习自然连接。他们是可憎的。
为什么?联接条件基于具有相同名称的列。自然连接甚至不考虑声明的外键关系。这可能相当危险。或者——在我的情况下——因为几乎我所有的table都有 CreatedAt 以及 CreatedBy ,反正也没用。
相反,列出 join 钥匙。在你的情况下(因为你有 select * ),的 using 条款最合适:

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

这还有一个优点,即键在查询中显式显示,这大大减少了错误的范围。

cotxawn7

cotxawn72#

冒着过于简单化的风险, 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 |

相关问题