INTERSECT 和 INNER JOIN 之间有根本区别吗?

Is there a fundamental difference between INTERSECT and INNER JOIN?

我知道,INNER JOIN 是为引用的键创建的,而 INTERSECT 不是。但 afaik 在某些情况下,他们都可以做同样的事情。那么,以下两个表达式之间(在性能或其他方面)是否存在差异?如果有,哪个更好?

表达式 1:

SELECT id FROM customers 
INNER JOIN orders ON customers.id = orders.customerID;

表达式 2:

SELECT id FROM customers
INTERSECT
SELECT customerID FROM orders

即使在您的情况下,它们也非常不同。

如果 id 在任一 table 中重复,INNER JOIN 将 return 重复。 INTERSECT 删除重复项。 INNER JOIN 永远不会 return NULL,但 INTERSECT 会 return NULL.

两者非常不同;一个是通常匹配有限列集的运算符,并且可以 return 零行或 table 中的更多行。另一个是基于集合的运算符,它比较两个集合之间的完整行,并且永远不会 return 行比较小的 table.

尝试以下操作,例如:

CREATE TABLE #a (id INT)

CREATE TABLE #b (id INT)

INSERT INTO #a VALUES (1), (NULL), (2)
INSERT INTO #b VALUES (1), (NULL), (3), (1)

SELECT a.id FROM #a a
INNER JOIN #b b ON a.id = b.id

SELECT id FROM #a
INTERSECT
SELECT id FROM #b