NULL в SQL ведёт себя неинтуитивно: NULL = NULL возвращает не TRUE, агрегатные функции игнорируют NULL, а CASE WHEN требует аккуратного обращения с пустыми значениями. Интервьюеры любят задачи-ловушки на тему IS NULL, COALESCE, NULLIF и трёхзначной логики. Непонимание NULL — одна из самых частых ошибок даже у опытных кандидатов.
`COALESCE` проверяет аргументы слева направо и возвращает первый не-`NULL`. В выражении `COALESCE(NULL, NULL, 'web', 'app')` первые два аргумента — `NULL`, третий — `'web'`, значит результат будет `'web'`. Это удобно для подстановки значения по умолчанию или для выбора из нескольких потенциальных источников данных.
Подробный разбор →`COUNT(*)` считает количество строк, независимо от того, есть ли `NULL` в каких-либо полях. `COUNT(utm_source)` считает количество строк, где `utm_source` не равен `NULL`. В примере всего 5 строк, но только 2 значения не-`NULL` ( `'google'` и `'email'`), поэтому получаем `COUNT(*) = 5` и `COUNT(utm_source) = 2`.
Подробный разбор →Логика «подставь значение по умолчанию при `NULL`» может быть записана через `CASE`, но `COALESCE` обычно короче и читабельнее: `COALESCE(referrer, 'direct')`. Важно: `referrer = NULL` — некорректная проверка (даёт `UNKNOWN`). Также порядок аргументов в `COALESCE` важен: он возвращает первый не-`NULL` слева направо.
Подробный разбор →Выражение `delivery_city <> 'Moscow'` не вернёт `TRUE` для строк с `delivery_city = NULL` (получится `UNKNOWN`), поэтому такие строки будут исключены. Если по смыслу нужно включить неизвестный город, добавляют явную проверку: `delivery_city IS NULL`. Итоговый устойчивый фильтр: `WHERE delivery_city <> 'Moscow' OR delivery_city IS NULL`.
Подробный разбор →Функция `SUM` не добавляет `NULL` значения к сумме. Но если нет ни одного не-`NULL` значения (все `NULL`), результат суммы считается неопределённым и возвращается `NULL`. Если же сначала заменить каждое значение через `COALESCE(amount, 0)`, то все `NULL` превратятся в 0, и сумма будет 0. Это частая техника для устойчивых метрик, когда отсутствие значений нужно трактовать как 0.
Подробный разбор →В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать SQL в Telegram