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

时间:2018-08-09 21:02:46

标签: sql inner-join intersect except

我知道,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

2 个答案:

答案 0 :(得分:4)

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

如果INNER JOIN在任一表中重复,则id将返回重复项。 INTERSECT删除重复项。 INNER JOIN永远不会返回NULL,但是INTERSECT将返回NULL

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

答案 1 :(得分:2)

例如,尝试以下操作:

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