sql - SQL 中的 NOT `column` IN (...) 与 `column` NOT IN (...)

标签 sql sql-server

通常,当我想要选择列“ID”在 (1,2,3) 中没有任何值时的所有记录时, 我将使用这样的查询:

SELECT * FROM tableA WHERE ID NOT IN (1,2,3)

但是今天,我尝试使用不同的查询,如下所示:

SELECT * FROM tableA WHERE NOT (ID IN (1,2,3))

令人惊讶的是,对我来说,它有效! SQL Server 和 Oracle 数据库(其他 sql 也许可以工作(?))。

我想知道我应该使用哪一个?

最佳答案

让我们重写这两个查询以使用更明确的逻辑:

SELECT * FROM tableA WHERE ID NOT IN (1,2,3)
SELECT * FROM tableA WHERE ID <> 1 AND ID <> 2 AND ID <> 3;

对于第二个查询:

SELECT * FROM tableA WHERE NOT (ID IN (1,2,3))
SELECT * FROM tableA WHERE NOT (ID = 1 OR ID = 2 OR ID = 3)

根据德摩根定律,上式变为:

SELECT * FROM tableA WHERE ID <> 1 AND ID <> 2 AND ID <> 3;

因此,您的两个版本实际上在逻辑上是等效的。

回顾一下德摩根定律:

NOT (p AND q) == NOT p OR NOT q
NOT (p OR q)  == NOT p AND NOT q

关于sql - SQL 中的 NOT `column` IN (...) 与 `column` NOT IN (...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61995389/

相关文章:

sql - MS SQL Server 2005上的索引varchar

c# - 错误 : There is already an open DataReader associated with this Command which must be closed first

mysql - 如何使用 MySQL 覆盖 NULL 值将两行合并为一行?

sql - 查找字符串中是否有 6 位数字

SQL Server 动态查询的替代方案

sql - 向 SQL 查询的列中的结果添加单引号

mysql - 确保 SQL 父类(super class)型表具有子类型

sql - 选择与联结表中的许多其他ID有关系的记录

SQL "Where Not Exists"未返回任何行

sql-server - 如何将结果合并到一条线上