[英]In SQL, what's the difference between JOIN and 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;
我可以互换使用吗?
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将对每个B重复一次。如果A有100行而B有100行,则结果集将包含10,000行。
应该注意的是, select
查询的理论执行包括按以下顺序执行的以下步骤:
计算from
子句中源集的完整笛卡尔积,以填充候选结果集。
在from
子句中应用连接条件并减少候选结果集。
在where clause
应用条件以进一步减少候选结果集。
根据group by
子句中的条件将候选结果集划分为组。
从候选结果集中删除除group by
子句中涉及的那些列之外的任何列group by
或者参与聚合函数的求值。
计算候选结果集中每个组的任何此类聚合函数的值。
将候选结果集中的每个组折叠为由分组列和每个聚合函数的计算值组成的单个行。 候选结果集现在由每个组的一行组成,除了group by
列group by
之外的所有列或该group by
的聚合函数的计算值都被消除。
在having
子句中应用条件以减少候选结果集并生成最终结果集。
按order by
条件order by
最终结果集并发出它。
还有更多的步骤,包括compute
和compute by
子句等内容,但这足以得到它如何工作的理论概念。
还应该注意的是,除了最天真的实现之外,实际上只会以这种方式评估select
语句,但所产生的结果必须与上述步骤完全执行时相同。
MySQL没有提供JOIN
和CROSS JOIN
之间的区别。 他们是一样的。
在你的例子中都有这个条款
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.