SQL WHERE条件,不等于?

问题描述 投票:81回答:9

是否有可能否定where子句?

EG

DELETE * FROM table WHERE id != 2;
mysql sql where negate
9个回答
137
投票

你可以这样做

DELETE FROM table WHERE id NOT IN ( 2 )

要么

DELETE FROM table WHERE id <>  2 

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


29
投票

你的问题已经被其他海报回答了,我只想指出这一点

 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);

8
投票

使用<>否定where子句。


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

0
投票

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

 AND (isdelete is NULL or isdelete = 0)
© www.soinside.com 2019 - 2024. All rights reserved.