在SQL中,JOIN和CROSS JOIN之间有什么区别?

时间:2014-01-17 23:39:27

标签: mysql sql join cross-join

有什么区别:

select t1.a1, t1.a2, t1.a3 from t1 cross join t2 where t1.a3 = t2.a1

select t1.a1, t1.a2, t1.a3 from t1,t2 where t1.a3=t2.a1;

我可以互换使用吗?

3 个答案:

答案 0 :(得分:10)

SQL具有以下类型的连接,所有这些连接都直接来自集合论:

  • 内部联接。
    From A inner join B相当于A∩B,提供两组共有的元素集。

  • 左外连接。
    From A left outer join B相当于(A - B)∪(A∩B)。每个A至少出现一次;如果有多个匹配的B,则每个匹配的B将重复一次A.

  • 右外连接。
    From A right outer join B相当于(A∩B)∪(B - A)。它与表格交易场所的左连接相同。每个B至少出现一次;如果有多个匹配的As,则每个匹配的B将重复一次B.

  • 全外连接。
    From A full outer join B相当于(A - B)∪(A∩B)∪(B - A)。每个A和每个B将至少出现一次。如果A匹配多个B,则每次匹配将重复一次;如果B匹配多个,则每场比赛将重复一次。

  • 交叉加入。
    From A cross join B生成笛卡儿积 A×B。每个A将重复一次。如果A有100行,B有100行,结果集将包含10,000行

应该注意的是,select查询的理论执行包括按以下顺序执行的以下步骤:

  1. 计算from子句中源集的完整笛卡尔积,以填充候选结果集。

  2. from子句中应用连接条件并减少候选结果集。

  3. where clause中应用条件以进一步缩小候选结果集。

  4. 根据group by子句中的条件将候选结果集分组。

  5. 从候选结果集中删除除group by子句中涉及的或参与评估聚合函数的列以外的任何列。

  6. 计算候选结果集中每个组的任何此类聚合函数的值。

  7. 将候选结果集中的每个组折叠为一行,其中包含分组列和每个聚合函数的计算值。候选结果集现在由每个组包含一行,除了group by列以外的所有列或该组的聚合函数的计算值都被消除。

  8. having子句中应用条件以减少候选结果集并生成最终结果集。

  9. 按照order by子句中的条件订购最终结果集并将其发出。

  10. 还有更多步骤,与computecompute by条款等内容有关,但这足以得出其工作原理的理论概念。

    还应该注意的是,除了最天真的实现之外,实际上只会以这种方式评估select语句,但所产生的结果必须与完全执行上述步骤的结果相同。

答案 1 :(得分:7)

MySQL不对JOINCROSS JOIN进行区分。他们是一样的。

在你的例子中,条款

WHERE t1.a3 = t2.a1 

将任何类型的连接转换为内连接。表达此查询的标准方式是

SELECT t1.a1, t1.a2, t1.a3 
  FROM t1 
  JOIN t2 ON t1.a3 = t2.a1

答案 2 :(得分:3)

没有什么区别,虽然人们可以微笑一下。首先进行交叉连接,然后使用where子句将其转换为内部连接(至少使用第一个连接)。这种编写连接的方式已有20多年的历史,并且在复杂的语句中容易出错。我建议使用新的时髦方式来编写它:

select t1.a1, t1.a2, t1.a3 
from t1 
inner join t2 on t1.a3 = t2.a1
相关问题