【问题标题】:Difference between cross product (cross join, Cartesian product) and natural join叉积(交叉连接,笛卡尔积)和自然连接的区别
【发布时间】:2014-12-06 16:55:07
【问题描述】:

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

【问题讨论】:

标签: sql cartesian-product cross-join natural-join


【解决方案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/

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      CROSS JOIN 从两个表中创建所有可能的行配对,无论它们是否匹配。您不要对叉积使用任何连接条件,因为对于任何配对,该条件始终为真。

      使用CROSS JOIN 的示例:您有 ShoeColors 和 ShoeSizes 表,并且您想知道有多少种可能的组合。 SELECT COUNT(*) FROM ShoeColors CROSS JOIN ShoeSizes;

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

      【讨论】:

      • 我唯一一次可能使用NATURAL JOIN 是在一个探索性的一次性查询中。当我尝试手动直接使用 SQL 客户端查看数据并且我正在编写的查询将永远不需要维护并且我对这种特定情况充满信心并且错误的后果几乎没有时,我可能会使用只是为了节省自己的打字时间。
      猜你喜欢
      • 2015-10-16
      • 2023-03-23
      • 2018-11-30
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 2015-01-15
      • 2021-05-18
      • 1970-01-01
      相关资源
      最近更新 更多