104

是否可以否定 where 子句?

例如

DELETE * FROM table WHERE id != 2;
4

10 回答 10

172

你可以这样做

DELETE FROM table WHERE id NOT IN ( 2 )

或者

DELETE FROM table WHERE id <>  2 

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

于 2011-05-27T19:47:24.007 回答
32

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

 delete from table where id <> 2

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

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

delete from table where id <> 2 or id is NULL
于 2011-05-27T20:10:27.907 回答
13

您可以执行以下操作:

DELETE * FROM table WHERE NOT(id = 2);
于 2011-05-27T19:47:33.493 回答
12
delete from table where id <> 2



编辑:更正 MySQL 的语法

于 2011-05-27T19:47:19.057 回答
9

用于<>否定 where 子句。

于 2011-05-27T19:47:32.410 回答
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 的使用会影响优化器能做什么或不能做什么。您可能会得到一个不太理想的查询计划。

于 2011-05-27T20:05:08.113 回答
6

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

于 2011-05-27T19:47:56.210 回答
6

最好的解决方案是使用

DELETE FROM table WHERE id NOT IN ( 2 )
于 2019-11-15T04:16:32.143 回答
4

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

DELETE FROM table WHERE id <> 2
于 2011-05-27T19:48:03.893 回答
0

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

 AND (isdelete is NULL or isdelete = 0)
于 2016-10-24T11:32:53.087 回答