交叉连接和具有相同过滤器的内部连接有什么区别?

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 (...) 语法编写内部联接。 优点是:

  1. reader 立即清楚您在做什么以及加入条件是什么。

  2. 永远不要忘记写一个连接条件,因为你必须写一个。

    这可以保护您免于查询 return 10 亿行而不是 10000 行只是因为您忘记了一些连接条件,这是初学者经常犯的错误。

另请注意,对于内部联接,在 JOINWHERE 子句中编写条件并不重要,但对于外部联接很重要。