有什么区别:
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;
我可以互换使用吗?
答案 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
查询的理论执行包括按以下顺序执行的以下步骤:
计算from
子句中源集的完整笛卡尔积,以填充候选结果集。
在from
子句中应用连接条件并减少候选结果集。
在where clause
中应用条件以进一步缩小候选结果集。
根据group by
子句中的条件将候选结果集分组。
从候选结果集中删除除group by
子句中涉及的或参与评估聚合函数的列以外的任何列。
计算候选结果集中每个组的任何此类聚合函数的值。
将候选结果集中的每个组折叠为一行,其中包含分组列和每个聚合函数的计算值。候选结果集现在由每个组包含一行,除了group by
列以外的所有列或该组的聚合函数的计算值都被消除。
在having
子句中应用条件以减少候选结果集并生成最终结果集。
按照order by
子句中的条件订购最终结果集并将其发出。
还有更多步骤,与compute
和compute by
条款等内容有关,但这足以得出其工作原理的理论概念。
还应该注意的是,除了最天真的实现之外,实际上只会以这种方式评估select
语句,但所产生的结果必须与完全执行上述步骤的结果相同。
答案 1 :(得分:7)
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
答案 2 :(得分:3)
没有什么区别,虽然人们可以微笑一下。首先进行交叉连接,然后使用where子句将其转换为内部连接(至少使用第一个连接)。这种编写连接的方式已有20多年的历史,并且在复杂的语句中容易出错。我建议使用新的时髦方式来编写它:
select t1.a1, t1.a2, t1.a3
from t1
inner join t2 on t1.a3 = t2.a1