A condição SQL WHERE não é igual a?

92

É possível negar uma cláusula where?

por exemplo

DELETE * FROM table WHERE id != 2;
Frank Vilea
fonte
4
FYI, id != NULLse não funcionar como seria de esperar.
Joshua Pinter

Respostas:

156

Você pode fazer assim

DELETE FROM table WHERE id NOT IN ( 2 )

OU

DELETE FROM table WHERE id <>  2 

Como @Frank Schmitt observou, você pode querer ter cuidado com os valores NULL também. Se você deseja excluir tudo o que não é 2(incluindo os NULLs), adicione OR id IS NULLà cláusula WHERE.

Praveen Lobo
fonte
Tentei este comando algumas vezes .. mas não parecia funcionar até que percebi que DELETE no MySQL não usa o * ..
Frank Vilea
Pronto, editou a resposta para remover o * Obrigado por apontar.
Praveen Lobo
5
Apenas um comentário geral para pessoas que chegaram aqui se perguntando por que != NULLnão estão funcionando: "Você não pode usar operadores de comparação aritmética como =, <ou <> para testar NULL." ( da documentação do MySQL ). Isso significa que você precisa usar IS NOT NULL .
Byson de
31

Sua pergunta já foi respondida pelos outros participantes, gostaria apenas de ressaltar que

 delete from table where id <> 2

(ou suas variantes, não id = 2 etc.) não excluirá linhas onde id é NULL.

Se você também deseja excluir linhas com id = NULL:

delete from table where id <> 2 or id is NULL
Frank Schmitt
fonte
12
delete from table where id <> 2



editar: para corrigir a sintaxe do MySQL

Fosco
fonte
11

Você pode fazer o seguinte:

DELETE * FROM table WHERE NOT(id = 2);
Magicianeer
fonte
1
Funciona bem se o valor não for numérico WHERE NOT (id = 'two');
Kareem
9

Use <>para negar a cláusula where.

Brandon
fonte
7

Reveja a lógica formal e a álgebra. Uma expressão como

A & B & (D | E)

pode ser negado de duas maneiras:

  • A maneira óbvia:

    !( A & B & ( D | E ) )
  • O acima também pode ser reafirmado, você só precisa se lembrar de algumas propriedades das expressões lógicas:

    • !( A & B )é o equivalente a (!A | !B).
    • !( A | B )é o equivalente a (!A & !B).
    • !( !A ) é equivalente a (A).

    Distribua o NOT (!) Em toda a expressão à qual se aplica, invertendo os operadores e eliminando os negativos duplos à medida que avança:

        !A | !B | ( !D & !E )

Portanto, em geral, qualquer cláusula where pode ser negada de acordo com as regras acima. A negação disso

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

ou

select *
from foo
where        not test-1
  OR         not test-2
  OR   (     not test-3
         and not test-4
       )

Qual é melhor? Essa é uma questão muito sensível ao contexto. Só você pode decidir isso.

Esteja ciente, porém, de que o uso de NOT pode afetar o que o otimizador pode ou não fazer. Você pode obter um plano de consulta inferior ao ideal.

Nicholas Carey
fonte
6

WHERE id <> 2 deve funcionar bem ... É isso que você está procurando?

JNK
fonte
4

Sim. Se a memória não me falha, isso deve funcionar. Nosso você poderia usar:

DELETE FROM table WHERE id <> 2
dkruythoff
fonte
3

A melhor solução é usar

DELETE FROM table WHERE id NOT IN ( 2 )
Trusha
fonte
0

Eu estava apenas resolvendo esse problema. Se você usar <> ou não estiver em uma variável, isso é nulo, resultará em falso. Então, em vez de <> 1, você deve marcar assim:

 AND (isdelete is NULL or isdelete = 0)
user2956206
fonte