← Назад к вопросам

Как NULL отличается от 0 и пустой строки в SQL?

1.2 Junior🔥 191 комментариев
#SQL и базы данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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)

Таблица различий

СвойствоNULL0'' (пустая строка)
Сравнение с собойNULL ≠ NULL0 = 0'' = ''
АрифметикаNULL + 5 = NULL0 + 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!

Как NULL отличается от 0 и пустой строки в SQL? | PrepBro