我有两个关系,emp(id,name)
并且emp2(name,city,salary)
有价值观:
如您所见,当我在它们之间运行自然连接时,我得到了他们的笛卡尔积。但是为什么,因为它们有一个共同的属性(name
)?
我有两个关系,emp(id,name)
并且emp2(name,city,salary)
有价值观:
如您所见,当我在它们之间运行自然连接时,我得到了他们的笛卡尔积。但是为什么,因为它们有一个共同的属性(name
)?
你得到的是自然加入,而不是笛卡尔积。
每个公共列都有一个副本,每个输入表唯一的列都有一个副本。左输入表中的一行和右输入表中的一行的每种不同组合都有一行。
如果('kim')
公共列 ( name
) 的子行值 ( ) 在左表中出现 n 次(2 次),在右表中出现 m 次(2 次),那么它将在输出中出现 n 次 m 次(2 次 2 次 = 4次)。
SQL 笛卡尔积将具有列name
、city
、salary
和id
& name
,并且对于左输入表中的一行和右输入表中的一行的每种不同组合都有一行。
name
这包括左表和右表中值的所有可能组合。但是对于这个示例数据,两个表中只有一个 name
值,因此每对名称值都必须具有该值两次。
自然连接与笛卡尔积相同,然后限制公共列的相等性,然后投影每个公共列之一,然后保持不同的行。
select * from emp inner join emp2 on emp.id = emp2.id
您在公共列(名称)中有两次相同的值,因此这会更长时间地检索行。您的自然联接基于每行都没有唯一值的表。然后在这种情况下,每个条目(也有内部连接)总是多于一行,但您可以使用 distinct 来解决
select dictinct emp.*, emp2.*
from emp
inner join emp2 on emp.name = emp2.name
或者
select select dictinct emp.*, emp2.*
from emp2 natural join emp