SQL условие WHERE не равно?

95

Можно ли отменить предложение where?

например

DELETE * FROM table WHERE id != 2;
Фрэнк Вилеа
источник
4
К вашему сведению, id != NULLработает не так, как вы ожидаете.
Джошуа Пинтер,

Ответы:

160

Вы можете сделать это

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 в MySQL не использует * ..
Фрэнк Вилеа
Итак, отредактировал ответ, чтобы удалить * Спасибо за указание.
Правин Лобо
5
Просто общий комментарий для людей, которые пришли сюда и задаются вопросом, почему они != NULLне работают: «Вы не можете использовать операторы арифметического сравнения, такие как =, <или <>, для проверки на NULL». ( из документации MySQL ). Значит, нужно использовать IS NOT NULL .
Byson
31

На ваш вопрос уже ответили другие постеры, я просто хочу отметить, что

 delete from table where id <> 2

(или его варианты, не id = 2 и т. д.) не удаляют строки, где id равен NULL.

Если вы также хотите удалить строки с id = NULL:

delete from table where id <> 2 or id is NULL
Франк Шмитт
источник
12
delete from table where id <> 2



edit: исправить синтаксис MySQL

Fosco
источник
12

Вы можете сделать следующее:

DELETE * FROM table WHERE NOT(id = 2);
Маг
источник
1
Хорошо работает, если значение не является числовым WHERE NOT (id = 'two');
Карим,
9

Используйте, <>чтобы отрицать предложение where.

Брэндон
источник
7

Вернитесь к формальной логике и алгебре. Выражение вроде

A & B & (D | E)

может быть отменено двумя способами:

  • Очевидный способ:

    !( A & B & ( D | E ) )
    
  • Вышесказанное также можно переформулировать, вам просто нужно запомнить некоторые свойства логических выражений:

    • !( A & B )эквивалентно (!A | !B).
    • !( A | B )эквивалентно (!A & !B).
    • !( !A ) эквивалентен (A).

    Распределите НЕ (!) По всему выражению, к которому оно применяется, инвертируя операторы и устраняя двойные отрицания по мере продвижения:

        !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 может повлиять на то, что оптимизатор может или не может делать. Вы можете получить неоптимальный план запроса.

Николас Кэри
источник
6

WHERE id <> 2 должно работать нормально ... Это то, что вам нужно?

JNK
источник
4

Да. Если мне не изменяет память, это должно сработать. Наши вы можете использовать:

DELETE FROM table WHERE id <> 2
Dkruythoff
источник
3

Лучшее решение - использовать

DELETE FROM table WHERE id NOT IN ( 2 )
труша
источник
0

Я как раз решал эту проблему. Если вы используете <> или не указан в переменной, то есть null, это приведет к false. Поэтому вместо <> 1 вы должны проверить это так:

 AND (isdelete is NULL or isdelete = 0)
user2956206
источник