SQL WHERE condición no es igual a?

94

¿Es posible negar una cláusula where?

p.ej

DELETE * FROM table WHERE id != 2;
Frank Vilea
fuente
4
Para su información, id != NULLno no funcionará como se espera.
Joshua Pinter

Respuestas:

159

Puedes hacer esto

DELETE FROM table WHERE id NOT IN ( 2 )

O

DELETE FROM table WHERE id <>  2 

Como señaló @Frank Schmitt, es posible que también desee tener cuidado con los valores NULL. Si desea eliminar todo lo que no lo es 2(incluidos los NULL), agregue OR id IS NULLa la cláusula WHERE.

Praveen Lobo
fuente
Probé este comando un par de veces ... pero no pareció funcionar hasta que me di cuenta de que DELETE en MySQL no usa el * ..
Frank Vilea
Ahí lo tienes, editó la respuesta para eliminar el * Gracias por señalar.
Praveen Lobo
5
Solo un comentario general para las personas que llegaron aquí y se preguntaron por qué != NULLno funcionan: "No puede usar operadores de comparación aritmética como =, <o <> para probar NULL". ( de la documentación de MySQL ). Eso significa que tienes que usar IS NOT NULL .
Byson
31

Tu pregunta ya fue respondida por los otros carteles, solo me gustaría señalar que

 delete from table where id <> 2

(o variantes de los mismos, no id = 2, etc.) no eliminará filas donde id es NULL.

Si también desea eliminar filas con id = NULL:

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



editar: para corregir la sintaxis de MySQL

Fosco
fuente
12

Podrías hacer lo siguiente:

DELETE * FROM table WHERE NOT(id = 2);
Magicianeer
fuente
1
Funciona bien si el valor no es numérico DONDE NO (id = 'dos');
Kareem
9

Úselo <>para negar la cláusula where.

Brandon
fuente
7

Mira hacia atrás a la lógica formal y al álgebra. Una expresión como

A & B & (D | E)

se puede negar de dos maneras:

  • La forma obvia:

    !( A & B & ( D | E ) )
  • Lo anterior también se puede reformular, solo necesita recordar algunas propiedades de las expresiones lógicas:

    • !( A & B )es el equivalente de (!A | !B).
    • !( A | B )es el equivalente de (!A & !B).
    • !( !A ) es el equivalente de (A).

    Distribuya el NOT (!) En toda la expresión a la que se aplica, invirtiendo los operadores y eliminando los dobles negativos a medida que avanza:

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

Entonces, en general, cualquier cláusula where puede ser negada de acuerdo con las reglas anteriores. La negación de este

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

es

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

o

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

¿Cual es mejor? Esa es una pregunta muy sensible al contexto. Solo tú puedes decidir eso.

Sin embargo, tenga en cuenta que el uso de NOT puede afectar lo que el optimizador puede o no puede hacer. Es posible que obtenga un plan de consulta menos que óptimo.

Nicolás Carey
fuente
6

WHERE id <> 2 debería funcionar bien ... ¿Es eso lo que buscas?

JNK
fuente
4

Si. Si la memoria no me falla, debería funcionar. Nuestro podría utilizar:

DELETE FROM table WHERE id <> 2
dkruythoff
fuente
3

La mejor solución es usar

DELETE FROM table WHERE id NOT IN ( 2 )
trusha
fuente
0

Solo estaba resolviendo este problema. Si usa <> o no está dentro de una variable, eso es nulo, resultará en falso. Entonces, en lugar de <> 1, debe marcarlo así:

 AND (isdelete is NULL or isdelete = 0)
usuario2956206
fuente