以下查询之间有什么区别:
SELECT * FROM employee WHERE NOT(start_date > '01-JAN-1970');
和这个查询:
SELECT * FROM employee WHERE start_date < '01-JAN-1970';
是否有任何区别,如果有,NOT(x > y)
与(x < y)
的使用方式有何不同。任何人都可以提供一个例子吗?
感谢。
答案 0 :(得分:8)
MySQL
和PostgreSQL
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可能不符合标准。