Fra*_*lea 86 mysql sql where-clause negate
是否有可能否定where子句?
例如
DELETE * FROM table WHERE id != 2;
Run Code Online (Sandbox Code Playgroud)
Pra*_*obo 144
你可以这样做
DELETE FROM table WHERE id NOT IN ( 2 )
Run Code Online (Sandbox Code Playgroud)
要么
DELETE FROM table WHERE id <> 2
Run Code Online (Sandbox Code Playgroud)
正如@Frank Schmitt所指出的,您可能也需要注意NULL值.如果要删除不2
包含的所有内容(包括NULL),请添加OR id IS NULL
到WHERE子句.
Fra*_*itt 30
你的问题已经被其他海报回答了,我只想指出这一点
delete from table where id <> 2
Run Code Online (Sandbox Code Playgroud)
(或其变体,而不是id = 2等)不会删除id为NULL的行.
如果您还想删除id = NULL的行:
delete from table where id <> 2 or id is NULL
Run Code Online (Sandbox Code Playgroud)
Mag*_*eer 11
您可以执行以下操作:
DELETE * FROM table WHERE NOT(id = 2);
Run Code Online (Sandbox Code Playgroud)
回顾形式逻辑和代数.一个表达式
A & B & (D | E)
Run Code Online (Sandbox Code Playgroud)
可能会以某种方式否定:
显而易见的方式:
!( A & B & ( D | E ) )
Run Code Online (Sandbox Code Playgroud)以上也可以重述,你只需要记住逻辑表达式的一些属性:
!( A & B )
相当于(!A | !B)
.!( A | B )
相当于(!A & !B)
.!( !A )
相当于(A).在它应用的整个表达式中分配NOT(!),反转运算符并消除双重否定:
!A | !B | ( !D & !E )
Run Code Online (Sandbox Code Playgroud)因此,一般而言,任何where子句都可以根据上述规则予以否定.否定这一点
select *
from foo
where test-1
and test-2
and ( test-3
OR test-4
)
Run Code Online (Sandbox Code Playgroud)
是
select *
from foo
where NOT( test-1
and test-2
and ( test-3
OR test-4
)
)
Run Code Online (Sandbox Code Playgroud)
要么
select *
from foo
where not test-1
OR not test-2
OR ( not test-3
and not test-4
)
Run Code Online (Sandbox Code Playgroud)
哪个更好?这是一个非常上下文敏感的问题.只有你可以决定.
但请注意,使用NOT会影响优化器可以或不可以执行的操作.您可能会得到一个不太理想的查询计划.
小智 5
是的。如果我没记错的话,那应该可以。我们的您可以使用:
DELETE FROM table WHERE id <> 2
Run Code Online (Sandbox Code Playgroud)