SELECT * FROM users WHERE status <> 'banned';
не возвращает Charlie, если у него
status = NULL?Потому что в SQL
NULL означает «неизвестное значение», а не пустую строку и не какое-то конкретное значение.Когда SQL проверяет условие:
status <> 'banned'
для строки, где:
status = NULL
результат будет не
TRUE и не FALSE, а UNKNOWN.То есть SQL не может определить, равно ли неизвестное значение
'banned' или нет.Получается:
NULL = 'banned' → UNKNOWN
NULL <> 'banned' → UNKNOWN
А в секцию
WHERE попадают только строки, для которых условие вернуло TRUE.TRUE → строка возвращается
FALSE → строка отбрасывается
UNKNOWN → строка тоже отбрасывается
Поэтому Charlie не попадает в результат.
Если нужно включить строки с
NULL, условие следует написать так:SELECT *
FROM users
WHERE status <> 'banned'
OR status IS NULL;
или в некоторых СУБД (например, PostgreSQL):
SELECT *
FROM users
WHERE status IS DISTINCT FROM 'banned';
Этот оператор рассматривает
NULL как отдельное значение и вернёт все строки, где статус не 'banned', включая NULL.👉 @SQLPortal