SQL WHERE条件不等于?


Answers:


156

你可以这样

DELETE FROM table WHERE id NOT IN ( 2 )

要么

DELETE FROM table WHERE id <>  2 

正如@Frank Schmitt指出的那样,您可能还需要注意NULL值。如果要删除所有不是的内容2(包括NULL),则添加OR id IS NULL到WHERE子句。


我试过这个命令几次..但它似乎对工作没有,直到我意识到,删除MySQL不使用* ..
弗兰克Vilea

在这里,您可以编辑答案以删除*感谢您指出。
Praveen Lobo,

5
对于那些来这里的人为什么!= NULL不起作用的一般评论:“您不能使用=,<或<>等算术比较运算符来测试NULL。” (来自MySQL文档)。因此,这意味着您必须使用 IS NOT NULL
Byson 2014年

31

您的问题已经被其他海报回答了,我想指出

 delete from table where id <> 2

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

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

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

12
delete from table where id <> 2



编辑:更正MySQL的语法


11

您可以执行以下操作:

DELETE * FROM table WHERE NOT(id = 2);

1
如果该值不是数字WHERE NOT(id ='two'),则效果很好。
卡里姆2015年


7

回顾形式逻辑和代数。像这样的表达

A & B & (D | E)

可以通过以下两种方式取反:

  • 明显的方法:

    !( A & B & ( D | E ) )
  • 上面的内容也可以重述,您只需要记住逻辑表达式的一些属性即可:

    • !( A & B )等于(!A | !B)
    • !( A | B )等于(!A & !B)
    • !( !A ) 等于(A)。

    将NOT(!)分布到它所应用的整个表达式中,从而反转运算符并消除双负数:

        !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可能会影响优化器的工作范围。您可能会得到一个不太理想的查询计划。


6

WHERE id <> 2 应该工作正常...这就是您的追求吗?


4

是。如果我有记忆,那应该可以。我们可以使用:

DELETE FROM table WHERE id <> 2

3

最好的解决方案是使用

DELETE FROM table WHERE id NOT IN ( 2 )

0

我只是在解决这个问题。如果使用<>或不在变量上,即为null,则将导致false。因此,您必须像这样检查而不是<> 1:

 AND (isdelete is NULL or isdelete = 0)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.