Вопросы по теме «Выражения и NULL»

Проверь себя · 1/3разбор после ответа
В таблице 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 вопросов.

Агрегация, GROUP BY и HAVINGДаты и времяEXPLAIN и оптимизацияJOIN и операции множествОсновы SQL-запросовСтроки и приведение типовПодзапросы и CTEОконные функции

Вопросы 15 из 20

1Есть логика сегментации: `CASE WHEN age IS NULL THEN 'unknown' WHEN age < 18 THEN 'minor' ELSE 'adult' END`. Что вернётся для строки, где значение `age` равно `NULL`?
A`'minor'`
B`'adult'`
C`NULL`
D`'unknown'`
Ответ: В `CASE` пропуски удобно обрабатывать явной веткой через проверку `IS NULL`, иначе строка попадёт в `ELSE` без нужного смысла.

Проверка `age IS NULL` для пропущенного возраста истинна, поэтому первая ветка срабатывает и вернётся `'unknown'`. Это типичный паттерн в аналитике: сначала обрабатываем пропуски (чтобы не терять строки и не смешивать смысл), затем ветвим по числовым значениям. Без явной ветки для `NULL` строка попадёт в `ELSE` и будет ошибочно отнесена к `'adult'`, что искажает сегментацию.

Подробный разбор →
2Нужно выбрать пользователей без электронной почты. Какое условие в `WHERE` корректно найдёт строки, где `email` отсутствует?
A`WHERE email = NULL`
B`WHERE email <> NULL`
C`WHERE email IS NULL`
D`WHERE COALESCE(email, '') = ''`
Ответ: С `NULL` нельзя сравнивать через `=` или `<>` — для проверки пропусков используется `IS NULL` или `IS NOT NULL`.

В SQL сравнения вида `email = NULL` или `email <> NULL` возвращают не `TRUE` или `FALSE`, а `UNKNOWN`, потому что `NULL` означает «неизвестно». В `WHERE` проходят только строки с истинным условием, поэтому такие сравнения не отберут пропуски. Для проверки пропуска используется `email IS NULL`. Вариант с `COALESCE(email, '') = ''` смешивает `NULL` и пустую строку и может дать неверный смысл, если пустая строка встречается как отдельное допустимое значение.

Подробный разбор →
3Какой фильтр в `WHERE` корректно оставит только строки, где столбец `channel` задан (не равен `NULL`)?
A`WHERE channel IS NOT NULL`: отбираются строки со значением, отличным от `NULL`
B`WHERE channel <> NULL`: сравнение с `NULL` через `<>` пропускает заполненные строки
C`WHERE COALESCE(channel, 'unknown') = 'unknown'`: остаются строки с `NULL` или со значением `'unknown'`
D`WHERE channel = NULL`: сравнение `=` с `NULL` пропускает строки с заполненным `channel`
Ответ: Проверка «не равно `NULL`» делается через `IS NOT NULL`, а не через `<>` или `=`.

Сравнения `channel <> NULL` и `channel = NULL` не работают как ожидается, потому что результат таких сравнений — `UNKNOWN`, и строка не проходит фильтр. Правильный способ отобрать строки с заполненным значением — `WHERE channel IS NOT NULL`. Вариант `COALESCE(channel, 'unknown') = 'unknown'`, наоборот, отбирает строки, где `channel` равен `NULL`, а не наоборот. Это базовая ловушка трёхзначной логики в SQL.

Подробный разбор →
4Что вернёт выражение `CASE WHEN is_active = 1 THEN 'active' END` для строки, где `is_active` = 0?
A`'active'`
B`NULL`
C`0`
D`'inactive'`
Ответ: Если в `CASE` нет `ELSE`, то при отсутствии подходящего `WHEN` результат — `NULL`.

В выражении `CASE WHEN is_active = 1 THEN 'active' END` есть только одна ветка и нет `ELSE`. Для строки с `is_active = 0` условие `is_active = 1` ложно, поэтому ни одна ветка не сработает и `CASE` вернёт `NULL`. Чтобы получить явное значение, добавляют `ELSE 'inactive'`.

Подробный разбор →
5В выражении `CASE` ветки проверяются сверху вниз. Что вернёт `CASE WHEN amount IS NULL THEN 'missing' WHEN amount = 0 THEN 'zero' ELSE 'positive' END` для строки, где `amount` равен `NULL`?
A`'zero'`
B`'positive'`
C`'missing'`
D`NULL`
Ответ: `CASE` выбирает первую подходящую ветку `WHEN` (где условие `TRUE`).

В `CASE` ветки проверяются по порядку. Для значения `NULL` первое условие `amount IS NULL` истинно, поэтому сразу возвращается `'missing'`, и до проверки `amount = 0` дело не доходит. Если бы ветка с `IS NULL` стояла последней, проверка `amount = 0` для `NULL` дала бы неизвестный результат, и значение попало бы в `ELSE`. Поэтому наиболее специфичные условия (часто `IS NULL`) удобно ставить выше по списку.

Подробный разбор →
1234

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Тренировать SQL в Telegram

Другие темы: SQL

Агрегация, GROUP BY и HAVINGДаты и времяEXPLAIN и оптимизацияJOIN и операции множествОсновы SQL-запросовСтроки и приведение типовПодзапросы и CTEОконные функции