INTERSECT 和 INNER JOIN 之间有根本区别吗? [复制]

Posted

技术标签:

【中文标题】INTERSECT 和 INNER JOIN 之间有根本区别吗? [复制]【英文标题】:Is there a fundamental difference between INTERSECT and INNER JOIN? [duplicate] 【发布时间】:2019-01-17 10:22:50 【问题描述】:

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

表达式 1:

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

表达式 2:

SELECT id FROM customers
INTERSECT
SELECT customerID FROM orders

【问题讨论】:

嗨。键与加入和相交/除外无关。任何 2 个表都可以连接和相交/除非需要某些列类型协议。了解他们的定义。 PS 请参阅向下投票箭头鼠标悬停文本。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用一个变体搜索您的标题和关键字作为您的标签。 【参考方案1】:

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

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

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

【讨论】:

谢谢!这有帮助! 请与 INTERSECT ALL 交谈。 内连接不必在键上。【参考方案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

【讨论】:

以上是关于INTERSECT 和 INNER JOIN 之间有根本区别吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

left join right join 和inner join之间的区别

inner join(inner可省) 与 left join 之间的区别

inner join 与 left join 之间的区别

inner join 与 left join 之间的区别

CROSS JOIN和INNER JOIN,LEFT JOIN,RIGHT JOIN,OUTER JOIN之间的区别[重复]

inner join/ left join/right join 之间的区别