Mysql的自然联接

时间:2014-04-08 13:30:18

标签: mysql natural-join

我对mysql中的自然连接感到有点困惑。

假设:有两个表
table1有列:id, name, address, number (id is the PK of table1)
table2有列:id, name, number, money (id is the PK of table2)

我已经"id" table1个外键,引用了"id"的{​​{1}}

并假设table2中的"number"table1"people's number"中的"number"table2,这两列具有不同的含义,但名称相同< / p>


当我执行"telephone number"table1的自然联接时:

mysql是否只是简单地检查table2table1的所有列,其名称相同,这意味着将选择元组(行),当且仅当{{1} },table2"id"“必须完全相同(例如,"name""number相同,但"id"不同,行不会选择的)?

OR

mysql是否只检查创建的外键,这意味着当且仅当"name"相同时才会选择一行?


另一个问题是:

自然加入"number""id"后,只会有一列名为table1或列为table2"id"吗?

非常感谢!

2 个答案:

答案 0 :(得分:0)

你不应该使用自然连接,你可能需要使用左连接。 table1是父表?至少听起来应该是这样,外键引用应该从父表中插入子表中。父表每个引用id有一个条目,子表可能有多个,一个或没有引用id的条目

SELECT table1.id, table1.number AS person_number, table2.number AS phone_number
FROM table1 
LEFT JOIN table2 ON table1.id = table2.id

答案 1 :(得分:0)

只读取数据的查询将始终提供相同的结果,无论外键如何。

来自JOIN manual

  

两个表的NATURAL [LEFT] JOIN被定义为在语义上等同于INNER JOIN或LEFT JOIN,其中USING子句命名两个表中存在的所有列。

如果SELECT *,NATURAL JOIN中使用的列将仅在结果集中出现一次。

所以,在你的情况下:

SELECT * FROM table1 NATURAL JOIN table2

将成为:

SELECT table1.id, table1.name, table1.number, table1.address, table2.money
FROM table1 
JOIN table2 ON table2.id = table1.id 
           AND table2.name = table1.name 
           AND table2.number = table1.number

列的顺序将是proba