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

4
以下查询有什么不同之处:

SELECT * FROM table_name;

SELECT column1, column2 FROM table_name;

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

并且这个查询:

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

这两者有区别吗?如果有,NOT(x > y)(x < y)的使用方式有何不同?能否提供一个例子?

谢谢。


考虑到它明显带来的混乱,我认为这是一种不好的做法。 - annakata
8个回答

8
在 MySQL 和 PostgreSQL 中:
SELECT * FROM employee WHERE not(start_date > '01-JAN-1970')

如果有的话,它们的优化器不够聪明,将不会在start_date上使用INDEX

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


5

non-NOT的等效形式是

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

NOT()是对括号内的内容进行否定。在你的例子中:

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

这将匹配开始日期早于1970年的员工。是的,在这种情况下,您可以反转 <> 括号以否定它,但在更复杂的情况或使用其他运算符时,NOT 是翻转的唯一方式。


2
在您的例子中,这两个子句基本上是等价的 - 但如果您希望它们返回完全相同的结果,则应该使用<>=(或<=>)而不是同时使用<>
当您拥有基于集合的子句时,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)

如果不使用NOT,这些查询最多会变得繁琐,或者最坏的情况下将无法实现。


2

除了明显的not(start_date > '01-JAN-1970')将包括1970年1月1日,而start_date < '01-JAN-1970'则会将其排除在外,我认为这些语句是相同的。


嗯,我只是按照逻辑来说。如果我们处理的是整数,那么“not(i>5)”和“(i<5)”之间唯一的区别就是第一种情况包括i=5,而第二种情况则不包括。 - Graeme Perrow

2

忽略SQL相关的内容,从逻辑上来看,取反<是>=(同样,取反>是<=),因此(x>y)和!(x<y)并不等价。

当你使用一个简单的例子"什么东西不比Y小?"时,这一点就很明显了。答案是"Y及其以上的所有东西"。

!(x < y) 等于 (x >= y)


1

你忘记了起始日期为 '01-JAN-1970' 的行 ;-)

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

1

如果未满足条件“not start_date > '01-JAN-1970'”,则开始日期可以等于'01-JAN-1970'。 而“start_date < '01-JAN-1970'”则意味着并不会选择起始日期为'01-JAN-1970'的员工。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接