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

Jar*_*otr 7 mysql sql join cross-join

有什么区别:

select t1.a1, t1.a2, t1.a3 from t1 cross join t2 where t1.a3 = t2.a1
Run Code Online (Sandbox Code Playgroud)

和:

select t1.a1, t1.a2, t1.a3 from t1,t2 where t1.a3=t2.a1;
Run Code Online (Sandbox Code Playgroud)

我可以互换使用吗?

Nic*_*rey 12

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条款中的条件排序最终结果集并将其发出.

有更多的步骤,与诸如computecompute by子句之类的东西有关,但这足以得到它如何工作的理论概念.

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


O. *_*nes 7

MySQL没有提供JOIN和之间的区别CROSS JOIN.他们是一样的.

在你的例子中都有这个条款

WHERE t1.a3 = t2.a1 
Run Code Online (Sandbox Code Playgroud)

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

SELECT t1.a1, t1.a2, t1.a3 
  FROM t1 
  JOIN t2 ON t1.a3 = t2.a1
Run Code Online (Sandbox Code Playgroud)