Oracle和MS SQL Server中的NOT条件和NOT()之间有什么区别

Nar*_*esh 5 sql sql-server oracle

最近我碰巧遇到了Sql Server和Oracle中的not().尝试将NOT条件和not()与不同的运算符(如LIKE,IN等)进行比较的不同示例.我没有看到结果集和记录计数方面的任何差异,但是如果两者都做同样的事情,则希望与社区确认或任何警告?

示例查询

select count(*) from Emp where country not in ('ENGLAND UK', 'HAITI', 'IRELAND') 
select count(*) from Emp where not(country  in ('ENGLAND UK', 'HAITI', 'IRELAND')) 
Run Code Online (Sandbox Code Playgroud)

Cee*_* it 2

关键字的两个位置NOT在逻辑上是等效的并且给出相同的结果。NOTbefore 括号表达式反转该表达式的结果,但这是传统的布尔逻辑,而不是特定于 SQL。

在 T-SQL 中,对于您的示例,执行计划在 SQL Server 2014 和 SQL Server 2016 中是相同的(假设:表具有主键并且country未建立索引)。

特别是对于您给出的示例,有一个警告:IN当参数中包含值时,运算符的行为与预期不同NULL。对于 Oracle,请参见此处

对于 T-SQL,请考虑:

select 1 where 'A' in (null)
Run Code Online (Sandbox Code Playgroud)

这不会返回一行。这看起来微不足道,但是:

select 1 where 'A' not in (null)
Run Code Online (Sandbox Code Playgroud)

该语句也不会返回行。现在我们可以争论,如果我们像这样从逻辑上反转第一个语句的表达式,它肯定应该返回一行:

select 1 where not ('A' in (null))
Run Code Online (Sandbox Code Playgroud)

但事实并非如此,因为IN (NULL)评估结果既不是 true 也不是 false