是否可以否定where子句?
例如
DELETE * FROM table WHERE id != 2;
你可以这样做
DELETE FROM table WHERE id NOT IN ( 2 )
或
DELETE FROM table WHERE id <> 2
正如 @Frank Schmitt 所指出的,您可能还需要注意 NULL 值。如果要删除所有未2
的内容(包括 NULL(,请将OR id IS NULL
添加到 WHERE 子句中。
你的问题已经被其他海报回答了,我只想指出
delete from table where id <> 2
(或其变体,不是 id = 2 等(不会删除 id 为 NULL 的行。
如果还想删除 id = NULL 的行:
delete from table where id <> 2 or id is NULL
您可以执行以下操作:
DELETE * FROM table WHERE NOT(id = 2);
delete from table where id <> 2
编辑:更正 MySQL 的语法
使用 <>
否定 where 子句。
WHERE id <> 2
应该可以正常工作...这就是你所追求的吗?
回顾形式逻辑和代数。像这样的表达式
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 的使用会影响优化器可以或不能执行的操作。您可能会得到一个不太理想的查询计划。
最好的解决方案是使用
DELETE FROM table WHERE id NOT IN ( 2 )
是的。如果没记错的话,这应该可以。我们的您可以使用:
DELETE FROM table WHERE id <> 2
我只是在解决这个问题。如果你在变量上使用<>或不在变量中,即空,则会导致 false。因此,您必须像这样检查它,而不是<> 1:
AND (isdelete is NULL or isdelete = 0)