Mysql 在SQL中,连接和交叉连接有什么区别?

Mysql 在SQL中,连接和交叉连接有什么区别?,mysql,sql,join,cross-join,Mysql,Sql,Join,Cross Join,这两者之间的区别是什么: select t1.a1, t1.a2, t1.a3 from t1 cross join t2 where t1.a3 = t2.a1 以及: 我可以互换使用它们吗?MySQL不提供连接和交叉连接之间的区别。它们是一样的 在你的两个例子中,这个从句 WHERE t1.a3 = t2.a1 将任何类型的联接转换为内部联接。表达此查询的标准方式是 SELECT t1.a1, t1.a2, t1.a3 FROM t1 JOIN t2 ON t1.a3 =

这两者之间的区别是什么:

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


我可以互换使用它们吗?

MySQL不提供连接和交叉连接之间的区别。它们是一样的

在你的两个例子中,这个从句

WHERE t1.a3 = t2.a1 
将任何类型的联接转换为内部联接。表达此查询的标准方式是

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

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

select t1.a1, t1.a2, t1.a3 
from t1 
inner join t2 on t1.a3 = t2.a1

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

内部连接。 从内部连接B相当于A∩ B、 提供两个集合共有的元素集合

左外连接。 从左到外的连接B相当于A− B∪ A.∩ B.每个A将至少出现一次;如果存在多个匹配B,则每个匹配B将重复一次A

右外接。 从右外侧连接B相当于A∩ B∪ B− A.它与交易场所表的左连接相同。每个B将至少出现一次;如果存在多个匹配A,则每个B将对每个匹配B重复一次

完全外接。 从一个完整的外部连接B相当于A− B∪ A.∩ B∪ B− A.每个A和B将至少出现一次。如果A匹配多个B,则每次匹配将重复一次;如果a B匹配多个,则每次匹配将重复一次

交叉连接。 从交叉连接B产生笛卡尔积A×B。每个A将为每个B重复一次。如果A有100行,B有100行,结果集将由10000行组成

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

计算from子句中源集的完全笛卡尔积,以素数表示候选结果集

在from子句中应用联接条件并减少候选结果集

应用where子句中的标准进一步减少候选结果集

根据GROUPBY子句中的条件将候选结果集划分为多个组

从候选结果集中删除除group by子句中涉及的列或聚合函数求值中涉及的列以外的任何列

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

将候选结果集中的每个组折叠到一行中,该行由分组列和每个聚合函数的计算值组成。候选结果集现在由每个组的一行组成,除group by列之外的所有列或组的聚合函数的计算值都被删除

应用having子句中的条件来减少候选结果集并生成最终结果集

按Order by子句中的条件对最终结果集进行排序并发出它

还有更多的步骤,与compute和computeby子句有关,但这足以获得它如何工作的理论概念


还应该注意的是,除了最幼稚的实现之外,没有任何东西会以这种方式实际评估select语句,但生成的结果必须与完全执行上述步骤时的结果相同。

我没有MySQL可用于测试这一点,但是我很好奇第一个和第二个例子之间的执行计划是否有什么不同。你知道优化器是如何处理这两个问题的吗?我刚刚试过,优化器会将它们转换为完全相同的查询。重点:正确的方法——也是唯一正确的表达查询的方法——是使用显式连接语法。其他方法是允许的,但它们不提供外部联接的灵活性。
select t1.a1, t1.a2, t1.a3 
from t1 
inner join t2 on t1.a3 = t2.a1