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 절에 추가하십시오 .
!= NULL
작동하지 않는지 궁금해하는 사람들을위한 일반적인 설명입니다 . "NULL을 테스트하기 위해 =, <또는 <>와 같은 산술 비교 연산자를 사용할 수 없습니다." ( MySQL 문서에서 ). 그 수단 그래서 당신은 사용해야합니다 IS NOT NULL
.
형식 논리와 대수로 돌아갑니다. 같은 표현
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 <> 2
저는이 문제를 해결하고있었습니다. <>를 사용하거나 변수에없는 경우, 즉 null이면 false가됩니다. 따라서 <> 1 대신 다음과 같이 확인해야합니다.
AND (isdelete is NULL or isdelete = 0)
id != NULL
하지 않습니다 .