Как NULL отличается от 0 и пустой строки в SQL?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
NULL vs 0 vs пустая строка в SQL
NULL — это не значение, а отсутствие значения. Это критическое отличие, которое создаёт немало проблем, если не понять логику NULL в SQL.
Что это такое?
NULL = "неизвестно" или "не определено". Это не ноль, не пустая строка, а именно отсутствие информации.
0 = число ноль (конкретное значение)
Пустая строка ('') = текстовое значение нулевой длины (тоже конкретное значение)
Отличие в логике сравнения
Самое важное: NULL не равен ничему, даже самому себе!
-- Неправильно! Вернёт НОЛЬ строк
SELECT * FROM users WHERE phone = NULL;
-- Правильно! Используй IS NULL
SELECT * FROM users WHERE phone IS NULL;
-- NULL = NULL вернёт NULL, не TRUE!
SELECT NULL = NULL; -- Результат: NULL (неизвестно)
SELECT NULL IS NULL; -- Результат: TRUE
Вычисления с NULL
Любое вычисление с NULL даёт NULL (правило неопределённости):
SELECT
10 + 5 as result1, -- 15
10 + NULL as result2, -- NULL (неизвестно)
NULL + NULL as result3, -- NULL
0 + 0 as result4; -- 0
Это особенно важно в агрегирующих функциях:
-- Если phone = NULL, то SUM(phone) не добавит это значение
SELECT
SUM(salary) as total, -- NULL значения игнорируются
COUNT(*) as row_count, -- Считает все строки, включая NULL
COUNT(salary) as non_null -- Считает только не-NULL значения
FROM employees;
Сравнение всех трёх
CREATE TABLE test_values (
id INT,
value_int INT,
value_str VARCHAR(50)
);
INSERT INTO test_values VALUES
(1, 0, ''), -- 0 и пустая строка
(2, NULL, NULL), -- NULL и NULL
(3, 5, 'text'), -- нормальные значения
(4, 0, 'zero'); -- 0 и текст
-- Выбрать все нулевые значения:
SELECT * FROM test_values WHERE value_int = 0; -- Вернёт: (1, 0, '') и (4, 0, 'zero')
-- Выбрать пустые строки:
SELECT * FROM test_values WHERE value_str = ''; -- Вернёт: (1, 0, '')
-- Выбрать NULL:
SELECT * FROM test_values WHERE value_int IS NULL; -- Вернёт: (2, NULL, NULL)
Таблица различий
| Свойство | NULL | 0 | '' (пустая строка) |
|---|---|---|---|
| Сравнение с собой | NULL ≠ NULL | 0 = 0 | '' = '' |
| Арифметика | NULL + 5 = NULL | 0 + 5 = 5 | 'a' + '' = 'a' |
| Оператор | IS NULL | = 0 | = '' |
| Логика | Неизвестно | Число | Текст |
| В COUNT | Не считается | Считается | Считается |
| Хранит информацию? | Нет | Да (ноль) | Да (пусто) |
Практические примеры
Пример 1: Фильтрация с NULL
-- Задача: найти все клиентов БЕЗ телефона
SELECT name, phone FROM customers WHERE phone IS NULL;
-- Найти с телефоном (включая пустые строки):
SELECT name, phone FROM customers WHERE phone IS NOT NULL;
-- Найти с реальным телефоном (не NULL, не пусто):
SELECT name, phone FROM customers
WHERE phone IS NOT NULL AND phone != '';
Пример 2: Коалесцирование (COALESCE)
Замени NULL на значение по умолчанию:
SELECT
customer_name,
COALESCE(phone, 'No phone'), -- Если NULL, то 'No phone'
COALESCE(email, phone, 'No contact') -- Первое не-NULL значение
FROM customers;
Пример 3: Агрегирование
SELECT
department,
COUNT(*) as total_employees, -- Все строки: 15
COUNT(bonus) as with_bonus, -- Только не-NULL: 8
SUM(salary) as total_salary, -- NULL значения пропускаются
AVG(salary) as avg_salary, -- Среднее без NULL
COALESCE(SUM(bonus), 0) as total_bonus -- 0, если все NULL
FROM employees
GROUP BY department;
Пример 4: Условная логика
-- CASE с NULL
SELECT
id,
CASE
WHEN status IS NULL THEN 'Unknown'
WHEN status = '' THEN 'Empty'
WHEN status = '0' THEN 'Zero string'
ELSE status
END as status_display
FROM orders;
Частые ошибки
Ошибка 1:
-- Неправильно!
WHERE field = NULL -- Это никогда не найдёт NULL значения
-- Правильно!
WHERE field IS NULL
Ошибка 2:
-- Неправильно! SUM вернёт NULL
SELECT SUM(price) FROM orders WHERE status = 'pending';
-- Если в pending нет заказов, результат: NULL
-- Правильно!
SELECT COALESCE(SUM(price), 0) FROM orders WHERE status = 'pending';
-- Если нет заказов: 0
Ошибка 3:
-- Неправильно для целочисленных полей!
WHERE quantity != 0 -- Пропустит NULL значения!
-- Правильно!
WHERE quantity != 0 OR quantity IS NULL
Итог
- NULL — отсутствие значения, требует IS NULL / IS NOT NULL
- 0 — число ноль, используй = 0
- '' (пустая строка) — текст длины 0, используй = ''
Основная ошибка: сравнивать NULL с оператором = вместо IS NULL. Помни: NULL ≠ NULL!