SQL WHERE条件不等于是什么?

108

如何对 where 子句进行否定?

例如:

DELETE * FROM table WHERE id != 2;

5
FYI,“id!= NULL”并不像您期望的那样起作用。 - Joshua Pinter
10个回答

178
你可以这样做。
DELETE FROM table WHERE id NOT IN ( 2 )

或者

DELETE FROM table WHERE id <>  2 

正如@Frank Schmitt指出的那样,您可能也需要小心处理NULL值。如果您想删除所有不是2(包括NULL)的内容,则应将OR id IS NULL添加到WHERE子句中。


1
我尝试了几次这个命令,但似乎不起作用,直到我意识到MySQL中的DELETE不使用*。 - Frank Vilea
好的,我编辑了答案并去掉了 *。谢谢你指出。 - Praveen Lobo
6
对于那些想知道为什么他们的 != NULL 不起作用的人,这里有一个一般性的评论:“您不能使用算术比较运算符(如=、<或<>)来测试NULL。”(来自MySQL文档)。这意味着您必须使用 IS NOT NULL - Byson
使用 NOT IN () 时,我得到了('WHERE 附近的 SQL 逻辑错误:语法错误')的错误信息。 - RAMM-HDR

32

其他回答者已经回答了你的问题,我只想指出

 delete from table where id <> 2

(或其变体,不包括id = 2等)将不会删除id为NULL的行。

如果您还想删除id = NULL的行:

delete from table where id <> 2 or id is NULL

14
你可以这样做:
DELETE * FROM table WHERE NOT(id = 2);

1
如果值不是数字,则运行良好 WHERE NOT(id = 'two'); - Kareem

13
delete from table where id <> 2



编辑:为了纠正 MySQL 的语法。


9
使用<>来否定where子句。

7
回顾一下形式逻辑和代数。像这样的表达式:
A & B & (D | E)

可能会有两种方式对其进行否定:

  • The obvious way:

    !( A & B & ( D | E ) )
    
  • The above can also be restated, you just need to remember some properties of logical expressions:

    • !( A & B ) is the equivalent of (!A | !B).
    • !( A | B ) is the equivalent of (!A & !B).
    • !( !A ) is the equivalent of (A).

    Distribute the NOT (!) across the entire expression to which it applies, inverting operators and eliminating double negatives as you go along:

        !A | !B | ( !D & !E )
    
因此,通常情况下,根据上述规则可以否定任何where子句。这个的否定
select *
from foo
where      test-1
  and      test-2
  and (    test-3
        OR test-4
      )

select *
from foo
where NOT(          test-1
           and      test-2
           and (    test-3
                 OR test-4
               )
         )

或者

select *
from foo
where        not test-1
  OR         not test-2
  OR   (     not test-3
         and not test-4
       )

哪个更好?这是一个非常依赖上下文的问题。只有您自己才能决定。

但要注意,使用 NOT 可能会影响优化器的能力。您可能会得到一个不太优化的查询计划。


7
"

WHERE id <> 2应该可以正常工作...这是你想要的吗?

"

6

最佳解决方案是使用

DELETE FROM table WHERE id NOT IN ( 2 )

5
是的。如果我的记忆没有出错,那应该可以运行。 或者您也可以使用:
DELETE FROM table WHERE id <> 2

0

我刚刚解决了这个问题。如果你在一个空变量上使用 <> 或 is not in,它会返回false。所以,你必须像这样检查它,而不是使用 <> 1:

 AND (isdelete is NULL or isdelete = 0)

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