Основы SQL-запросов: вопросы для собеседования (часть 3)

SELECT, FROM, WHERE, ORDER BY, LIMIT — базовый синтаксис SQL, с которого начинается любое собеседование. Кажется простым, но интервьюеры проверяют порядок выполнения клауз, приоритет операторов и понимание DISTINCT. Твёрдое знание основ — фундамент, без которого сложные задачи не решить.

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

Вопросы 1115 из 40

11Поле `nickname` у пользователя равно `NULL`, а `email` — `'anna@mail.ru'`. Что вернёт `SELECT COALESCE(nickname, email, 'аноним') FROM users` для этой строки?
AФункция вернёт `NULL`, потому что хотя бы один из аргументов равен `NULL`
BФункция вернёт первый аргумент, который не равен `NULL`, по порядку слева направо
CФункция вернёт последний аргумент, который не равен `NULL`, по порядку слева направо
DФункция вернёт среднее арифметическое всех аргументов, которые не равны `NULL`
Ответ: `COALESCE` перебирает аргументы слева направо и возвращает первый, который не равен `NULL`.

`COALESCE(nickname, email, 'аноним')` проверяет значения по порядку: `nickname` равен `NULL` — пропускаем, `email` равен `'anna@mail.ru'` — это не `NULL`, возвращаем его. Третий аргумент `'аноним'` не проверяется. Функция полезна для подстановки значений по умолчанию и создания цепочек подстановки.

12Аналитик пишет: `SELECT clicks / NULLIF(views, 0) AS ctr FROM campaigns`. Зачем здесь используется `NULLIF(views, 0)`?
AВыражение `NULLIF` заменяет `NULL` в `views` на `0`, чтобы деление всегда возвращало число
BВыражение `NULLIF` вернёт `NULL` вместо `views`, если `views` равен `0`, и деление даст `NULL`
CВыражение `NULLIF` вернёт `0` вместо `views`, если `views` равен `NULL`, для безопасного деления
DВыражение `NULLIF` вернёт ошибку, если `views` равен `0`, чтобы предотвратить некорректный расчёт
Ответ: `NULLIF(a, b)` возвращает `NULL`, если `a = b`, иначе возвращает `a`. Это защищает от деления на ноль.

`NULLIF(views, 0)` вернёт `NULL`, если `views` равен `0`, и само значение `views` в остальных случаях. Деление на `NULL` в SQL возвращает `NULL` (а не ошибку), поэтому строки с нулём просмотров получат `NULL` в столбце `ctr` вместо ошибки деления на ноль. Это стандартный защитный паттерн при расчёте метрик.

13В таблице `users` нужно выбрать только активных пользователей из России или Казахстана. Какой `WHERE` соответствует требованию?
A`WHERE is_active = 1 AND country = 'RU' OR country = 'KZ'`
B`WHERE is_active = 1 OR (country = 'RU' OR country = 'KZ')`
C`WHERE is_active = 1 AND (country = 'RU' OR country = 'KZ')`
D`WHERE is_active = 1 AND country = 'RU' AND country = 'KZ'`
Ответ: При смешивании `AND` и `OR` важно использовать скобки, чтобы зафиксировать нужную логику фильтрации.

Запрос должен отобрать строки, где одновременно выполняются два условия: пользователь активен и страна входит в набор из двух значений. Поэтому правильно писать `is_active = 1 AND (country = 'RU' OR country = 'KZ')`. Без скобок выражение с `AND` и `OR` может трактоваться не так, как вы ожидаете, и начнёт пропускать, например, всех пользователей из `'KZ'` независимо от активности.

14У пользователя `price = 100` и `discount = NULL`. Что вернёт выражение `SELECT price + discount FROM products` для этой строки?
AРезультат будет `NULL`, потому что любая арифметическая операция с `NULL` возвращает `NULL`
BРезультат будет `100`, потому что `NULL` в сложении автоматически заменяется на `0`
CЗапрос вызовет ошибку, потому что нельзя складывать число и `NULL` в SQL
DРезультат будет `0`, потому что `NULL` интерпретируется как нулевое значение
Ответ: Любая арифметическая операция с `NULL` в SQL даёт `NULL`, а не числовой результат.

В SQL `NULL` означает «неизвестное значение», а не ноль. Поэтому `100 + NULL` даёт `NULL`: результат сложения известного числа с неизвестным тоже неизвестен. Чтобы заменить `NULL` на конкретное значение, используют `COALESCE`: `price + COALESCE(discount, 0)` вернёт `100`.

15Таблицы `orders_2024` и `orders_2025` имеют одинаковую структуру. Некоторые заказы случайно попали в обе таблицы. Чем будут отличаться результаты `SELECT * FROM orders_2024 UNION SELECT * FROM orders_2025` и того же запроса с `UNION ALL`?
AОба запроса вернут одинаковый результат, потому что `UNION ALL` — синоним `UNION`
BЗапрос с `UNION` уберёт дубликаты из общего результата, а `UNION ALL` вернёт все строки
CЗапрос с `UNION ALL` отсортирует результат, а `UNION` оставит строки без сортировки
DЗапрос с `UNION` объединит столбцы двух таблиц, а `UNION ALL` объединит строки
Ответ: `UNION` убирает дублирующиеся строки из объединённого результата, а `UNION ALL` возвращает все строки без проверки.

`UNION` выполняет дополнительный шаг дедупликации: если одна и та же строка есть в обоих запросах, она попадёт в результат один раз. `UNION ALL` просто склеивает результаты без проверки на дубликаты. На практике `UNION ALL` обычно быстрее, потому что не тратит ресурсы на поиск и удаление дубликатов.

12345678

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

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

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

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

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