Вопросы по теме «Выражения и 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` отдельной веткой.

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

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

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

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

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

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` условия проверяются по порядку. Для `amount = NULL` условие `amount IS NULL` истинно (`TRUE`), поэтому сразу возвращается `'missing'`, и до следующих `WHEN` дело не дойдёт. Это важно при построении категорий: наиболее специфичные/важные случаи (часто `IS NULL`) удобно ставить выше.

1234

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

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

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

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

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