我在学习SQL几周后,刚刚完成关于使用IN和NOT IN的家庭作业的问题。我设法得到了正确的答案,但是,我使用了EXCEPT子句,我们还没有真正使用它。据我所知,EXCEPT和NOT IN在SQL中是非常相似的语句,但我无法理解它们的区别。这是我的查询的一般格式:
SELECT *
FROM table
WHERE x IN (
SELECT x
/* ... some subquery*/
EXCEPT
SELECT x
/* ... some other subquery*/
)
有没有办法在不使用EXCEPT语句的情况下重写此常规查询?一般来说,EXCEPT和NOT IN如何相互不同?
编辑:This other post似乎有一些很好的信息,但似乎关注的是EXISTS而不是IN,它们有不同的用途吗?
答案 0 :(得分:4)
这可能有助于您了解Except和NOT IN之间的差异
EXCEPT运算符返回左侧表中所有不同的行,这些行在右侧表中不存在。
另一方面,“NOT IN”将返回左侧表中不存在于右侧表中的所有行,但不会从结果中删除重复的行。
答案 1 :(得分:1)
SQL是一种声明性语言。因此,有许多构造可以转换为相同的关系代数树/执行计划。例如,您可以使用INNER JOIN或CROSS JOIN + WHERE或+ WHERE或LEFT / RIGHT JOIN + WHERE指定内部联接。
EXCEPT / INTERSECT是设置运算符,而IN / NOT IN是谓词。考虑一下你的例子,
SELECT *
FROM table
WHERE x IN (
SELECT x
/* ... some subquery*/
EXCEPT
SELECT x
/* ... some other subquery*/
)
这可以使用IN / NOT IN编写,如:
SELECT *
FROM table as t1
WHERE t1.x IN (
SELECT t2.x
FROM t2
WHERE t2.x NOT IN (
SELECT t3.x
FROM t3
)
)
现在,就语法而言,这些意思相同但在语义上它们可能不会产生相同的结果。例如,如果列X可以为空,那么NOT IN将产生不同的结果。
最后,对于简单的情况,如果您查看SQL Server Management Studio中针对这两个查询的执行计划,您会发现它们使用类似的计划/连接策略。这是因为SQL Server会将语法转换为优化的关系树,以生成执行计划。在此翻译之后,对于不同的查询,最终计划可能是相同的。