Ответ 1

В SQL сравнение между значением null и любым другим значением (включая другое null) с использованием оператора сравнения (например, =, !=, < и т.д.) Приведет к null, который рассматривается как false для целей предложения where (строго говоря, это "не правда", а не "ложь", но эффект тот же).

Причина заключается в том, что null означает "неизвестный", поэтому результат любого сравнения с null также "неизвестен". Таким образом, вы не получите удар по строкам, если закодируете where my_column = null.

SQL предоставляет специальный синтаксис для проверки, если столбцом является null, через is null и is not null, что является специальным условием для проверки для null (или нет null).

Вот некоторые SQL, показывающие различные условия и их влияние, как указано выше.

create table t (x int, y int);
insert into t values (null, null), (null, 1), (1, 1);

select 'x = null' as test , x, y from t where x = null
union all
select 'x != null', x, y from t where x != null
union all
select 'not (x = null)', x, y from t where not (x = null)
union all
select 'x = y', x, y from t where x = y
union all
select 'not (x = y)', x, y from t where not (x = y);

возвращает только 1 строку (как и ожидалось):

TEST    X   Y
x = y   1   1

Посмотрите, как работает SQLFiddle

Ответ 2

Важно отметить, что NULL не равно NULL.

NULL не является значением и поэтому не может сравниться с другим значением.

where x is null проверяет, является ли x нулевым значением.

where x = null проверяет, равен ли x равному NULL, который никогда не будет истинным

Ответ 3

Сначала правильный способ проверить, является ли значение поля null, а позже не будет работать так, как вы ожидаете, потому что null - это особое значение, которое не равно никому, поэтому вы не можете использовать сравнение равенства используя = для него.

Поэтому, когда вам нужно проверить, является ли значение поля null или нет, используйте:

where x is null

вместо:

where x = null

Ответ 4

Я думаю, что равенство - это то, что может быть абсолютно определено. Проблема с null в том, что он по сути неизвестен. Null в сочетании с любым другим значением является null - неизвестно. Запрашиваемая SQL "Мое значение равно null?" будет неизвестен каждый раз, даже если ввод null. Я думаю, что реализация IS NULL проясняет ситуацию.