Как сделать не равно в sql

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

Может ли кто-нибудь объяснить следующее поведение в SQL?

<> - стандартный SQL-92; != - его эквивалент. Оба оценивают значения, которые не являются NULL - NULL - это заполнитель, указывающий на отсутствие значения.

Вот почему вы можете использовать только IS NULL / IS NOT NULL в качестве предикатов для таких ситуаций.

Это поведение не характерно для SQL Server. Все диалекты SQL, соответствующие стандартам, работают одинаково.

Примечание . Для сравнения, если ваше значение не равно нулю , вы используете IS NOT NULL , а для сравнения с не нулевым значением вы используете <> 'YOUR_VALUE' . Я не могу сказать, равно ли мое значение NULL или нет, но я могу сказать, является ли мое значение NULL или NOT NULL. Я могу сравнить, отличается ли мое значение от NULL.

NULL - это ничего . неизвестно. NULL ничего не равно. Вот почему вам нужно использовать волшебную фразу IS NULL вместо = NULL в ваших SQL-запросах.

Я хотел бы предложить этот код, который я сделал, чтобы узнать, есть ли изменение в значении, i - новое значение, а d - старое (хотя порядок не имеет значения). В этом отношении изменение от значения к нулю или наоборот - это изменение, а от нуля к нулю - нет (конечно, от значения к другому значению это изменение, но от значения к тому же нет).

Чтобы использовать эту функцию, вы можете

Использование sql_variant делает его совместимым с множеством типов.

Старый вопрос, но следующее может предложить более подробную информацию.

null не представляет значения или неизвестное значение. В нем не указывается, почему нет значения, что может привести к некоторой двусмысленности.

Предположим, вы запускаете такой запрос:

То есть вы ищете строки, в которых даты ordered и delivered совпадают.

Чего ожидать, если один или оба столбца равны нулю?

Поскольку по крайней мере одна из дат неизвестна, нельзя ожидать, что эти две даты совпадают. Это также относится к случаям, когда обе даты неизвестны: как они могут быть одинаковыми, если мы даже не знаем, какие они?

По этой причине любое выражение, обрабатывающее null как значение, должно завершиться ошибкой. В этом случае он не будет совпадать. Это также верно, если вы попробуете следующее:

Опять же, как мы можем сказать, что два значения не одинаковы, если мы не знаем, что они из себя представляют.

В SQL есть специальный тест на пропущенные значения:

В частности, это не сравнение значений, а поиск отсутствующих значений.

Наконец, что касается оператора != , насколько мне известно, он фактически не входит ни в один из стандартов, но очень широко поддерживается. Он был добавлен для того, чтобы программисты, знающие некоторые языки, чувствовали себя как дома. Откровенно говоря, если программисту сложно запомнить, какой язык он использует, значит, у него плохой старт.

NULL Невозможно сравнить ни с одним значением с помощью операторов сравнения. NULL = NULL ложно. Null - это не значение. Оператор IS специально разработан для обработки NULL-сравнений.

Единственный тест на NULL - IS NULL или IS NOT NULL. Проверка на равенство бессмысленна, потому что по определению неизвестно, каково значение.

Вот статья в Википедии, которую стоит прочитать:

В SQL все, что вы оцениваете / вычисляете с NULL , приводит к НЕИЗВЕСТНОМУ

Вот почему SELECT * FROM MyTable WHERE MyColumn != NULL или SELECT * FROM MyTable WHERE MyColumn <> NULL не дают результатов.

Для проверки значений NULL предоставляется функция isNull.

Кроме того, вы можете использовать оператор IS , как в третьем запросе.

Надеюсь это поможет.

Рассмотрим этот код:

Вот код, который привел меня сюда:

Мне просто нужно сравнить, имеют ли два поля (где) разные значения, я мог бы использовать функцию, но .

Простые условия (операторы сравнения) в запросах Oracle SQL

Простые условия сравнения в Oracle вполне привычны:

Меньше или равно

Больше или равно

Отметим только два момента:

  • иногда у пользователей бывают проблемы с тем, как именно пишется больше или равно (или меньше или равно) — что идет вначале: символ равенства или знак больше/меньше. Здесь можно просто запомнить принцип: как говорим, так и пишем;
  • "не равно" в Oracle может обозначаться сразу четырьмя разными способами, в том числе достаточно экзотическими. Однако рекомендуется по возможности использовать стандартное обозначение вида (<>).

Пример применения простого условия сравнения уже приводился в предыдущем разделе:

Для всех примеров далее будем использовать базу данных книжного магазина - Bookstore.

Выведем все строки которые содержаться в таблице books.

Получим следующие данные.

mysql> SELECT id, title, author, price, amount FROM books;
+----+---------------------------+--------------------+--------+--------+
| id | title | author | price | amount |
+----+---------------------------+--------------------+--------+--------+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 | 20 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 | 7 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 8 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 | 3 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 3 |
| 6 | Война и мир | Лев Толстой | 341.00 | 1 |
| 7 | Анна Каренина | Лев Толстой | 346.00 | 0 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 | 3 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 | 10 |
| 10 | Бесы | Фёдор Достоевский | 212.00 | 8 |
+----+---------------------------+--------------------+--------+--------+
10 rows in set (0.00 sec)

Команда WHERE

Команда WHERE предназначена для создания условий (фильтров).

WHERE используется тогда, когда нужно вывести только те строки, которые соответствуют одному или нескольким условиям.

WHERE похожа на условный оператор if , который используется во многих языках программирования для создания условий.

WHERE применяется только совместно с командами SELECT , UPDATE и DELETE .

Синтаксис команды WHERE

Рассмотрим несколько примеров создания условий.

Выведем все книги, которые написал Лев Толстой.

Выведем все книги, доступное количество которых равно трём.

mysql> SELECT id, title, author, price, amount FROM books WHERE amount=3;
+----+---------------------------+--------------------+--------+--------+
| id | title | author | price | amount |
+----+---------------------------+--------------------+--------+--------+
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 | 3 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 3 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 | 3 |
+----+---------------------------+--------------------+--------+--------+
3 rows in set (0.00 sec)

Операторы сравнения в MySQL

Команда WHERE , помимо оператора = , использует также целый набор других операторов сравнения.

Далее представлена таблица операторов сравнения с примерами их использования.

Оператор Значение
= Равенство
mysql> SELECT id, title, author, price, amount FROM books WHERE amount = 0;
+----+----------------+--------------+--------+--------+
| id | title | author | price | amount |
+----+----------------+--------------+--------+--------+
| 7 | Анна Каренина | Лев Толстой | 346.00 | 0 |
+----+----------------+--------------+--------+--------+
1 row in set (0.00 sec)
<>, != Неравенство
mysql> SELECT id, title, author, price, amount FROM books WHERE author != 'Николай Гоголь' ;
+----+---------------------------+--------------------+--------+--------+
| id | title | author | price | amount |
+----+---------------------------+--------------------+--------+--------+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 | 20 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 8 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 3 |
| 6 | Война и мир | Лев Толстой | 341.00 | 1 |
| 7 | Анна Каренина | Лев Толстой | 346.00 | 0 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 | 3 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 | 10 |
| 10 | Бесы | Фёдор Достоевский | 212.00 | 8 |
+----+---------------------------+--------------------+--------+--------+
8 rows in set (0.00 sec)
> Больше
mysql> SELECT id, title, author, price, amount FROM books WHERE price > 245;
+----+----------------------+------------------+--------+--------+
| id | title | author | price | amount |
+----+----------------------+------------------+--------+--------+
| 2 | Нос (Акция) | Николай Гоголь | 255.20 | 7 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 8 |
| 6 | Война и мир | Лев Толстой | 341.00 | 1 |
| 7 | Анна Каренина | Лев Толстой | 346.00 | 0 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 | 3 |
+----+----------------------+------------------+--------+--------+
5 rows in set (0.00 sec)
mysql> SELECT id, title, author, price, amount FROM books WHERE price
>= Больше либо равно
mysql> SELECT id, title, author, price, amount FROM books WHERE price >= 245;
+----+---------------------------+--------------------+--------+--------+
| id | title | author | price | amount |
+----+---------------------------+--------------------+--------+--------+
| 2 | Нос (Акция) | Николай Гоголь | 255.20 | 7 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 8 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 3 |
| 6 | Война и мир | Лев Толстой | 341.00 | 1 |
| 7 | Анна Каренина | Лев Толстой | 346.00 | 0 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 | 3 |
+----+---------------------------+--------------------+--------+--------+
6 rows in set (0.00 sec)
mysql> SELECT id, title, author, price, amount FROM books WHERE price
BETWEEN Между двумя значениями
mysql> SELECT id, title, author, price, amount FROM books WHERE id BETWEEN 1 AND 5;
+----+------------------------------------------------+-----------------------------------+--------+--------+
| id | title | author | price | amount |
+----+------------------------------------------------+-----------------------------------+--------+--------+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 | 20 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 | 7 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 8 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 | 3 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 3 |
+----+------------------------------------------------+-----------------------------------+--------+--------+
5 rows in set (0.00 sec)
LIKE Соответствует шаблону
mysql> SELECT id, title, author, price, amount FROM books WHERE title LIKE '%Акция%';
+----+---------------------------+--------------------+--------+--------+
| id | title | author | price | amount |
+----+---------------------------+--------------------+--------+--------+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 | 20 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 | 7 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 | 3 |
+----+---------------------------+--------------------+--------+--------+
3 rows in set (0.00 sec)
IN Соответствует набору значений
mysql> SELECT id, title, author, price, amount FROM books WHERE price IN (341,230,263,173);
+----+---------------------------+--------------------+--------+--------+
| id | title | author | price | amount |
+----+---------------------------+--------------------+--------+--------+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 | 20 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 8 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 | 3 |
| 6 | Война и мир | Лев Толстой | 341.00 | 1 |
+----+---------------------------+--------------------+--------+--------+
4 rows in set (0.00 sec)

Логические операторы AND, OR, NOT, XOR в MySQL

Наравне с языками программирования MySQL имеет свои логические операторы.

Операторы AND , OR , NOT , XOR используются для создания нескольких условий (фильтров) вывода и обработки записей таблиц базы данных.

Все логические операторы могут использоваться не только с командами SELECT и WHERE , но и с многими другими.

Оператор AND

Выводит запись если оба условия принимают истинное значение.

Синтаксис оператора AND

mysql> SELECT column1, column2, . , columnN
-> FROM table_name
-> WHERE condition1 AND condition2 AND conditionN;

В примере ниже мы выбираем книги, количество которых больше либо равно 10 и их цена ниже 245.

Оператор OR

Выводит запись если хотя бы одно из условий принимает истинное значение.

Синтаксис оператора OR

mysql> SELECT column1, column2, . , columnN
-> FROM table_name
-> WHERE condition1 OR condition2 OR conditionN;

В примере ниже мы выбираем книги, за авторством Льва Толстого или Антона Чехова. Так как книг Антона Чехова в нашей БД нет, то в выводе получим только книги Льва Толстого.

mysql> SELECT id, title, author, price, amount
-> FROM books
-> WHERE author = 'Лев Толстой' OR author = 'Антон Чехов';
+----+---------------------------+--------------------+--------+--------+
| id | title | author | price | amount |
+----+---------------------------+--------------------+--------+--------+
| 6 | Война и мир | Лев Толстой | 341.00 | 1 |
| 7 | Анна Каренина | Лев Толстой | 346.00 | 0 |
+----+---------------------------+--------------------+--------+--------+
2 rows in set (0.00 sec)

Оператор XOR

XOR (исключающее ИЛИ), также как OR выводит записи, если хотя бы одно из условий истинно, но не выводит запись если оба условия либо истинны, либо ложны.

XOR аналогичен следующей конструкции: (a AND ( NOT b)) OR (( NOT a) AND b).

Синтаксис оператора XOR

mysql> SELECT column1, column2, . , columnN
-> FROM table_name
-> WHERE condition1 XOR condition2 XOR conditionN;

В примере ниже выведем все книги, автором которых будет Михаил Булгаков или цена книги будет больше 241. Однако, если автором книги будет Михаил Булгаков и при этом ее цена будет выше 241, то такая запись не выведется.

Запись с не была выведена, т.к. автор книги - Михаил Булгаков и ее цена = 263.

mysql> SELECT id, title, author, price, amount
-> FROM books
-> WHERE author = 'Михаил Булгаков' XOR price > 241;
+----+---------------------------+--------------------+--------+--------+
| id | title | author | price | amount |
+----+---------------------------+--------------------+--------+--------+
| 2 | Нос (Акция) | Николай Гоголь | 255.20 | 7 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 3 |
| 6 | Война и мир | Лев Толстой | 341.00 | 1 |
| 7 | Анна Каренина | Лев Толстой | 346.00 | 0 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 | 3 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 | 10 |
+----+---------------------------+--------------------+--------+--------+
6 rows in set (0.01 sec)

Оператор NOT

С помощью оператора NOT можно вывести все записи, которые не соответствуют условию.

Синтаксис оператора NOT

mysql> SELECT column1, column2, . , columnN
-> FROM table_name
-> WHERE NOT condition;

В примере ниже выведем все книги, кроме тех, которых нет в наличии.

mysql> SELECT id, title, author, price, amount FROM books WHERE NOT amount=0;
+----+-------------------------- +--------------------+--------+--------+
| id | title | author | price | amount |
+----+-------------------------- +--------------------+--------+--------+
| 1 | Дубровский (Акция) | Александр Пушкин | 230.00 | 20 |
| 2 | Нос (Акция) | Николай Гоголь | 255.20 | 7 |
| 3 | Мастер и Маргарита | Михаил Булгаков | 263.00 | 8 |
| 4 | Мёртвые души (Акция) | Николай Гоголь | 173.00 | 3 |
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 3 |
| 6 | Война и мир | Лев Толстой | 341.00 | 1 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 | 3 |
| 9 | Собачье сердце | Михаил Булгаков | 232.00 | 10 |
| 10 | Бесы | Фёдор Достоевский | 212.00 | 8 |
+----+-------------------------- +--------------------+--------+--------+
9 rows in set (0.00 sec)

Комбинации логических операторов

Используя круглые скобки, все логические операторы можно комбинировать и получать более сложные и многоуровневые условия.

Выведем все записи книг за авторством Ивана Тургенева и Фёдора Достоевсткого с ценой меньше 240, и которые при этом не имеют слова "Акция" в названии.

mysql> SELECT id, title, author, price, amount
-> FROM books
-> WHERE (price > 241 AND (author='Иван Тургенев' OR author='Фёдор Достоевский'))
-> AND title NOT LIKE '%Акция%';
+----+---------------------------+--------------------+--------+--------+
| id | title | author | price | amount |
+----+---------------------------+--------------------+--------+--------+
| 5 | Преступление и наказание | Фёдор Достоевский | 245.00 | 3 |
| 8 | Отцы и дети | Иван Тургенев | 371.00 | 3 |
+----+---------------------------+--------------------+--------+--------+
2 rows in set (0.00 sec)


Как заметил @Frank Schmitt, вы также можете быть осторожны с значениями NULL. Если вы хотите удалить все, что не 2 (включая NULL), затем добавьте OR id IS NULL к предложению WHERE.

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

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

Если вы также хотите удалить строки с >

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

  • 1 Хорошо работает, если значение не является числовым WHERE NOT (id = 'two');

Использовать <> чтобы отменить предложение where.

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

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

Вышесказанное также можно переформулировать, вам просто нужно запомнить некоторые свойства логических выражений:

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

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

Итак, как правило, любое предложение where может быть отменено в соответствии с приведенными выше правилами. Отрицание этого

Что лучше? Это очень зависимый от контекста вопрос. Только вы можете это решить.

Однако имейте в виду, что использование NOT может повлиять на то, что оптимизатор может или не может делать. Вы можете получить неоптимальный план запроса.

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

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

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

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

Читайте также: