SQL查询中NOT(x> y)和(x< y)之间有什么区别?

时间:2009-02-19 11:47:09

标签: sql

以下查询之间有什么区别:

SELECT * FROM employee  WHERE NOT(start_date > '01-JAN-1970');

和这个查询:

SELECT * FROM employee  WHERE start_date < '01-JAN-1970';

是否有任何区别,如果有,NOT(x > y)(x < y)的使用方式有何不同。任何人都可以提供一个例子吗?

感谢。

9 个答案:

答案 0 :(得分:8)

MySQLPostgreSQL

SELECT * FROM employee WHERE not(start_date > '01-JAN-1970')

不会在INDEX使用start_date,如果有的话,他们的优化程序不够智能。

否则,如果您在一个案例(not(start_date >= '01-JAN-1970')start_date <= '01-JAN-1970')中更正条件并不严格,则查询相同。

答案 1 :(得分:5)

等同于

SELECT * FROM employee WHERE not(start_date > '01-JAN-1970');

SELECT * FROM employee WHERE start_date <= '01-JAN-1970';

SELECT * FROM employee WHERE start_date < '01-JAN-1970';

因为那会错过start_date = '01 -JAN-1970'

的情况

答案 2 :(得分:2)

除了显而易见的not(start_date > '01-JAN-1970') 包含 1970年1月1日,而start_date < '01-JAN-1970' 排除它,我认为这些陈述是相同的

答案 3 :(得分:2)

NOT()只是对括号内的任何内容的否定。在您的示例中:

SELECT * FROM employee WHERE not(start_date > '01-JAN-1970');

这将匹配开始日期早于1970年的员工。是的,您可以撤销&lt;&gt;在这种情况下支持否定它,但在一个更复杂的情况下或与其他运算符不是翻转它的唯一方法。

答案 4 :(得分:2)

在您的示例中,这两个子句几乎相同 - 但如果您希望它们返回完全相同的结果,那么您应该使用<>=(或<=和{ {1}})而不是><

当你有基于集合的子句时,

>会变得更有用。例如:

NOT

如果不使用SELECT * FROM my_table WHERE my_column NOT IN (273, 430, 9567, 8, 433, 765, 6252, 13) SELECT * FROM my_table WHERE my_column NOT IN (SELECT another_column FROM another_table) ,这些查询最多会变得很麻烦,或者最不可能。

答案 5 :(得分:2)

忽略SQL特定的任何内容,但从逻辑的角度来看,&lt;是&gt; =(同样,&gt;的否定是&lt; =),因此(x> y)和!(x

当您使用“什么不小于Y?”这样的简单示例时,这很明显。答案是“Y和它上面的一切”;

!(x&lt; y)==(x&gt; = y)

答案 6 :(得分:1)

不是start_date&gt; '01 -JAN-1970'意味着开始日期可以等于'01 -JAN-1970' start_date&lt; '01 -JAN-1970'表示未选择开始日期为'01 -JAN-1970'的员工

答案 7 :(得分:1)

你忘记了start_date == '01 -JAN-1970'的行; - )

SELECT * FROM employee WHERE start_date <= '01-JAN-1970';

答案 8 :(得分:0)

我怀疑(但尚未验证)NOT变体也会拾取“start_date”为NULL的行 - 这可能就是MySQL在这种情况下不使用索引的原因。

编辑:阅读日期/ Darwen的 SQL标准指南后,此答案不正确。 Null将第三种状态引入比较运算符(参见第240,241页或第四版)。

但是,我要留下这个答案,因为很可能是那个人写的那个表达式和我做的一样,并试图捕获空值。或者特定的RDBMS可能不符合标准。