关系代数 - 自然连接如何工作?
Relational Algebra - how does natural join work?
我真的对这个很困惑。据我了解,自然连接是一种内部连接,仅当 table1 具有某些与 table2 的拦截属性时才有效。然而,当我尝试使用它,并说取一个 table 与另一个 table 没有共同的列名时,它作为一个普通的笛卡尔积并显示结果。
此外,当我用不同的 table 再次尝试时,它们又没有任何共同点,它突然没有显示任何结果。我很困惑,我想我在这里遗漏了一些重要的东西。有人有想法吗?谢谢!
嗯,你已经学到了第一个重要的教训,那就是避免natural join
。这只是糟糕的语法,因为它甚至没有考虑正确声明的外键关系并且隐藏了 join
条件——这使得查询难以维护和调试。
自然联接是内部联接等值联接,其联接条件位于具有相同 名称 的列上。自然连接甚至不考虑类型,因此如果您的数据真的很乱,查询可能会出现类型转换错误。
如果公共列名上对应的内连接没有匹配项,则returns空集。如果没有共同的列名,则与 cross join
.
相同
思路是自然连接(inner natural join)生成两个表的笛卡尔积。当表具有重复的列名时,最终结果集仅包含那些具有相同列名的笛卡尔积行。
我真的对这个很困惑。据我了解,自然连接是一种内部连接,仅当 table1 具有某些与 table2 的拦截属性时才有效。然而,当我尝试使用它,并说取一个 table 与另一个 table 没有共同的列名时,它作为一个普通的笛卡尔积并显示结果。
此外,当我用不同的 table 再次尝试时,它们又没有任何共同点,它突然没有显示任何结果。我很困惑,我想我在这里遗漏了一些重要的东西。有人有想法吗?谢谢!
嗯,你已经学到了第一个重要的教训,那就是避免natural join
。这只是糟糕的语法,因为它甚至没有考虑正确声明的外键关系并且隐藏了 join
条件——这使得查询难以维护和调试。
自然联接是内部联接等值联接,其联接条件位于具有相同 名称 的列上。自然连接甚至不考虑类型,因此如果您的数据真的很乱,查询可能会出现类型转换错误。
如果公共列名上对应的内连接没有匹配项,则returns空集。如果没有共同的列名,则与 cross join
.
思路是自然连接(inner natural join)生成两个表的笛卡尔积。当表具有重复的列名时,最终结果集仅包含那些具有相同列名的笛卡尔积行。