交叉积(交叉连接,笛卡尔积)和自然连接的区别

5

在编写SQL时,我如何知道是否应该使用交叉积(cross join,笛卡尔积)还是自然连接?


http://sqlfiddle.com/#!15/223f7/1 - user330315
可能是[关系代数 - 笛卡尔积 vs 自然连接?]的重复问题(https://dev59.com/7GzXa4cB1Zd3GeqPW7px)。 - philipxy
@philipxy 说实话,我更倾向于将另一个问题视为此问题的重复。另一个问题涉及到理论概念的心理模型细节,并在很大程度上忽略了实际考虑因素。在此过程中,它增加了许多不必要的复杂性。 - jpmc26
3个回答

7

CROSS JOIN会创建出两个表中所有可能的行交叉组合,不管它们是否匹配。这种情况下不需要使用任何连接条件,因为对于任何组合都成立。

一个CROSS JOIN的例子:你有一张鞋颜色表和一张鞋尺码表,你想知道有多少种可能的组合方式。SELECT COUNT(*) FROM ShoeColors CROSS JOIN ShoeSizes;

NATURAL JOININNER JOIN非常相似,但假设条件是相等的,并适用于在两个表中出现的所有列名。我从来不使用NATURAL JOIN,因为我不能假设只因为列具有相同的名称,它们就应该相互关联。这将需要非常严格的列命名约定,而实际上几乎没有任何真实项目遵循这样的规定。


我只有在探索性的一次性查询中才会使用NATURAL JOIN。当我试图手动查看数据并直接使用SQL客户端时,我正在编写的查询永远不需要维护,并且我对于特定情况和错误后果的信心几乎为零,我可能会使用它来节省一些打字时间。 - jpmc26

-1

自然连接是在两个表中具有相同名称的列上进行交叉连接的连接,其中条件为where条件。

假设您有两个表:A和B

>>select * from A;
        
            col1 col2 col3
            ---------------
            1     2    1
            1     4    0 
>>select * from B;
            col1 col2
            ---------
            1     2   
    
            1     3
    
>>select * from A cross join B;
    
    col1 col2 col3 col1_2 col2_2
    -----------------------------
    1     2    1    1      2
    1     2    1    1      3
    1     4    0    1      2
    1     4    0    1      3
    
>>select * from A natural join B;
    
    col1 col2 col3
    ---------------
    1     2    1
    1     2    1

有关详细信息,请查看我的帖子。https://eduit.nuxaavi.com.mx/2021/10/16/producto-cartesiano-sql/


-1
简单来说,交叉连接在两个不同表的行之间执行笛卡尔积。其中列名可能匹配,也可能不匹配......但是在自然连接中,为了执行连接操作,两个表的列名必须匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接