通常,当我想要选择列“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/