交叉连接和具有相同过滤器的内部连接有什么区别?
What's the difference between a cross join and an inner join with identical filter?
我们来看一个cross join
:
select c1, c2, c3
from t1
cross join t2
where t1.f1 = t2.f2
让我们看看 inner join
:
select c1, c2, c3
from t1
inner join t2
on t1.f1 = t2.f2
这两种语句在性能、功能和内存使用方面有何不同?
这两个查询在功能上是相同的,以下查询也是如此:
select c1, c2, c3
from t1, t2
where t1.f1 = t2.f2
以下是个人看法:
始终 使用 JOIN ... ON ...
或 JOIN ... USING (...)
语法编写内部联接。
优点是:
reader 立即清楚您在做什么以及加入条件是什么。
永远不要忘记写一个连接条件,因为你必须写一个。
这可以保护您免于查询 return 10 亿行而不是 10000 行只是因为您忘记了一些连接条件,这是初学者经常犯的错误。
另请注意,对于内部联接,在 JOIN
或 WHERE
子句中编写条件并不重要,但对于外部联接很重要。
我们来看一个cross join
:
select c1, c2, c3
from t1
cross join t2
where t1.f1 = t2.f2
让我们看看 inner join
:
select c1, c2, c3
from t1
inner join t2
on t1.f1 = t2.f2
这两种语句在性能、功能和内存使用方面有何不同?
这两个查询在功能上是相同的,以下查询也是如此:
select c1, c2, c3
from t1, t2
where t1.f1 = t2.f2
以下是个人看法:
始终 使用 JOIN ... ON ...
或 JOIN ... USING (...)
语法编写内部联接。
优点是:
reader 立即清楚您在做什么以及加入条件是什么。
永远不要忘记写一个连接条件,因为你必须写一个。
这可以保护您免于查询 return 10 亿行而不是 10000 行只是因为您忘记了一些连接条件,这是初学者经常犯的错误。
另请注意,对于内部联接,在 JOIN
或 WHERE
子句中编写条件并不重要,但对于外部联接很重要。