Выражения и NULL: вопросы для собеседования (часть 2)

NULL в SQL ведёт себя неинтуитивно: NULL = NULL возвращает не TRUE, агрегатные функции игнорируют NULL, а CASE WHEN требует аккуратного обращения с пустыми значениями. Интервьюеры любят задачи-ловушки на тему IS NULL, COALESCE, NULLIF и трёхзначной логики. Непонимание NULL — одна из самых частых ошибок даже у опытных кандидатов.

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

Вопросы 610 из 20

6Что вернёт выражение `COALESCE(NULL, NULL, 'web', 'app')`?
A`NULL`
B`'app'`
C`'web'`
DОшибка, потому что есть `NULL`
Ответ: `COALESCE` возвращает первый аргумент, который не равен `NULL`.

`COALESCE` проверяет аргументы слева направо и возвращает первый не-`NULL`. В выражении `COALESCE(NULL, NULL, 'web', 'app')` первые два аргумента — `NULL`, третий — `'web'`, значит результат будет `'web'`. Это удобно для подстановки значения по умолчанию или для выбора из нескольких потенциальных источников данных.

7В таблице `sessions` 5 строк. Значения `utm_source`: `'google'`, `NULL`, `'email'`, `NULL`, `NULL`. Чему равны `COUNT(*)` и `COUNT(utm_source)`?
A`COUNT(*)` = 5, `COUNT(utm_source)` = 2
B`COUNT(*)` = 2, `COUNT(utm_source)` = 5
C`COUNT(*)` = 5, `COUNT(utm_source)` = 5
D`COUNT(*)` = 2, `COUNT(utm_source)` = 2
Ответ: `COUNT(*)` считает строки, а `COUNT(column)` считает только не-`NULL` значения в столбце.

`COUNT(*)` считает количество строк, независимо от того, есть ли `NULL` в каких-либо полях. `COUNT(utm_source)` считает количество строк, где `utm_source` не равен `NULL`. В примере всего 5 строк, но только 2 значения не-`NULL` ( `'google'` и `'email'`), поэтому получаем `COUNT(*) = 5` и `COUNT(utm_source) = 2`.

8Вы хотите заменить `NULL` в `referrer` на `'direct'`. Что проще и эквивалентно по смыслу?
A`CASE WHEN referrer IS NULL THEN 'direct' ELSE referrer END` и `COALESCE(referrer, 'direct')`
B`CASE WHEN referrer = NULL THEN 'direct' ELSE referrer END` и `COALESCE(referrer, 'direct')`
C`CASE WHEN referrer IS NULL THEN 'direct' ELSE referrer END` и `COALESCE('direct', referrer)`
D`CASE WHEN referrer IS NOT NULL THEN 'direct' ELSE referrer END` и `COALESCE(referrer, 'direct')`
Ответ: `COALESCE(referrer, 'direct')` — короткая форма «если `NULL`, то значение по умолчанию».

Логика «подставь значение по умолчанию при `NULL`» может быть записана через `CASE`, но `COALESCE` обычно короче и читабельнее: `COALESCE(referrer, 'direct')`. Важно: `referrer = NULL` — некорректная проверка (даёт `UNKNOWN`). Также порядок аргументов в `COALESCE` важен: он возвращает первый не-`NULL` слева направо.

9Нужно выбрать заказы, где `delivery_city` не равно `'Moscow'`, но при этом включить строки, где `delivery_city` = `NULL` (город неизвестен). Какой фильтр корректен?
A`WHERE delivery_city <> 'Moscow'`
B`WHERE delivery_city <> 'Moscow' OR delivery_city IS NULL`
C`WHERE delivery_city = 'Moscow' OR delivery_city IS NULL`
D`WHERE delivery_city != NULL`
Ответ: Чтобы включить `NULL`, его нужно проверить явно через `IS NULL`.

Выражение `delivery_city <> 'Moscow'` не вернёт `TRUE` для строк с `delivery_city = NULL` (получится `UNKNOWN`), поэтому такие строки будут исключены. Если по смыслу нужно включить неизвестный город, добавляют явную проверку: `delivery_city IS NULL`. Итоговый устойчивый фильтр: `WHERE delivery_city <> 'Moscow' OR delivery_city IS NULL`.

10В таблице `payments` три строки со значениями `amount`: `NULL`, `NULL`, `NULL`. Что вернут запросы `SELECT SUM(amount)` и `SELECT SUM(COALESCE(amount, 0))`?
AОба вернут `NULL`
B`SUM(amount)` вернёт 0, а `SUM(COALESCE(amount, 0))` вернёт `NULL`
C`SUM(amount)` вернёт `NULL`, а `SUM(COALESCE(amount, 0))` вернёт 0
DОба вернут 0
Ответ: Агрегаты обычно игнорируют `NULL`, но если все значения `NULL`, `SUM(amount)` вернёт `NULL`. `COALESCE` может превратить `NULL` в 0 до суммирования.

Функция `SUM` не добавляет `NULL` значения к сумме. Но если нет ни одного не-`NULL` значения (все `NULL`), результат суммы считается неопределённым и возвращается `NULL`. Если же сначала заменить каждое значение через `COALESCE(amount, 0)`, то все `NULL` превратятся в 0, и сумма будет 0. Это частая техника для устойчивых метрик, когда отсутствие значений нужно трактовать как 0.

1234

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

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

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

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

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