users столбец is_test может быть 0, 1 или NULL. Нужно исключить тестовых пользователей (is_test = 1), но оставить остальных, включая NULL. Какой фильтр корректен?NULL в SQL ведёт себя неинтуитивно: NULL = NULL возвращает не TRUE, агрегатные функции игнорируют NULL, а CASE WHEN требует аккуратного обращения с пустыми значениями. Интервьюеры любят задачи-ловушки на тему IS NULL, COALESCE, NULLIF и трёхзначной логики. Непонимание NULL — одна из самых частых ошибок даже у опытных кандидатов.
Всего в этом разделе 20 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 4 части по 5 вопросов.
Проверка `age IS NULL` для пропущенного возраста истинна, поэтому первая ветка срабатывает и вернётся `'unknown'`. Это типичный паттерн в аналитике: сначала обрабатываем пропуски (чтобы не терять строки и не смешивать смысл), затем ветвим по числовым значениям. Без явной ветки для `NULL` строка попадёт в `ELSE` и будет ошибочно отнесена к `'adult'`, что искажает сегментацию.
Подробный разбор →В SQL сравнения вида `email = NULL` или `email <> NULL` возвращают не `TRUE` или `FALSE`, а `UNKNOWN`, потому что `NULL` означает «неизвестно». В `WHERE` проходят только строки с истинным условием, поэтому такие сравнения не отберут пропуски. Для проверки пропуска используется `email IS NULL`. Вариант с `COALESCE(email, '') = ''` смешивает `NULL` и пустую строку и может дать неверный смысл, если пустая строка встречается как отдельное допустимое значение.
Подробный разбор →Сравнения `channel <> NULL` и `channel = NULL` не работают как ожидается, потому что результат таких сравнений — `UNKNOWN`, и строка не проходит фильтр. Правильный способ отобрать строки с заполненным значением — `WHERE channel IS NOT NULL`. Вариант `COALESCE(channel, 'unknown') = 'unknown'`, наоборот, отбирает строки, где `channel` равен `NULL`, а не наоборот. Это базовая ловушка трёхзначной логики в SQL.
Подробный разбор →В выражении `CASE WHEN is_active = 1 THEN 'active' END` есть только одна ветка и нет `ELSE`. Для строки с `is_active = 0` условие `is_active = 1` ложно, поэтому ни одна ветка не сработает и `CASE` вернёт `NULL`. Чтобы получить явное значение, добавляют `ELSE 'inactive'`.
Подробный разбор →В `CASE` ветки проверяются по порядку. Для значения `NULL` первое условие `amount IS NULL` истинно, поэтому сразу возвращается `'missing'`, и до проверки `amount = 0` дело не доходит. Если бы ветка с `IS NULL` стояла последней, проверка `amount = 0` для `NULL` дала бы неизвестный результат, и значение попало бы в `ELSE`. Поэтому наиболее специфичные условия (часто `IS NULL`) удобно ставить выше по списку.
Подробный разбор →В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать SQL в Telegram