Основы SQL-запросов: вопросы для собеседования (часть 5)
SELECT, FROM, WHERE, ORDER BY, LIMIT — базовый синтаксис SQL, с которого начинается любое собеседование. Кажется простым, но интервьюеры проверяют порядок выполнения клауз, приоритет операторов и понимание DISTINCT. Твёрдое знание основ — фундамент, без которого сложные задачи не решить.
Вопросы 21–25 из 40
21Что произойдёт при выполнении запроса `SELECT product_id, price - cost AS margin FROM products`, если столбцы `price` и `cost` числовые?
AЗапрос выполнится успешно и покажет столбец `margin` с разницей между ценой и себестоимостью
BЗапрос вызовет ошибку, потому что арифметические операции нельзя использовать в `SELECT`
CЗапрос создаст новый физический столбец `margin` в самой таблице `products` с данными
DЗапрос выполнится, но столбец `margin` будет содержать `NULL` для всех строк без исключений
Ответ: В `SELECT` можно использовать арифметические выражения — результат станет вычисляемым столбцом.
SQL позволяет использовать арифметику прямо в `SELECT`: `price - cost` вычислит разницу для каждой строки, а `AS margin` даст этому столбцу имя в результате. Вычисляемый столбец существует только в результате запроса и не изменяет структуру таблицы. Если оба столбца числовые и не содержат `NULL`, результат будет числовым.
22В таблице `support_tickets` поле `resolved_at` равно `NULL`, если тикет ещё не решён. Нужно вывести сначала нерешённые тикеты, а внутри них — по `created_at` по возрастанию (самые старые сверху). Какой `ORDER BY` лучше?
A`ORDER BY created_at ASC`
B`ORDER BY resolved_at ASC NULLS FIRST, created_at ASC`
C`ORDER BY resolved_at ASC NULLS LAST, created_at ASC`
D`ORDER BY resolved_at DESC NULLS FIRST, created_at ASC`
Ответ: Сортируйте сначала по признаку «решён/не решён» через `NULLS FIRST`, а затем по времени создания.
Чтобы нерешённые тикеты шли первыми, удобно сортировать по `resolved_at` так, чтобы `NULL` оказался сверху: `resolved_at ASC NULLS FIRST`. Затем добавляем вторичный критерий для очереди обработки: `created_at ASC`. Это даёт выдачу, где вверху будут нерешённые и среди них — самые старые.
23В таблице `orders` нужно вывести заказы так, чтобы сначала шли самые дорогие (`amount`), а при одинаковой сумме — более ранние по `created_at` (чтобы вверху был «первый» из одинаковых). Какой `ORDER BY` подходит?
A`ORDER BY amount ASC, created_at ASC`
B`ORDER BY created_at ASC, amount DESC`
C`ORDER BY amount DESC, created_at ASC`
D`ORDER BY amount DESC, created_at DESC`
Ответ: В `ORDER BY` можно задавать приоритет столбцов и направления сортировки для каждого столбца.
Основной критерий — сумма заказа, поэтому `amount` должен идти первым. «Самые дорогие сверху» означает `amount DESC`. Вторичный критерий применяется только при равном `amount`: «более ранние выше» означает `created_at ASC`. Итог: `ORDER BY amount DESC, created_at ASC`.
24В запросе используется выражение: `SELECT user_id, CASE WHEN age < 18 THEN 'подросток' WHEN age < 30 THEN 'молодой' WHEN age < 50 THEN 'средний' ELSE 'старший' END AS segment FROM users`. Пользователю 25 лет — какое значение он получит и почему?
AЗапрос вызовет ошибку, потому что `CASE` нельзя использовать внутри `SELECT`
BСтолбец `segment` будет содержать `NULL` для всех строк, если не указан `ELSE`
CСтолбец `segment` получит значение первого подходящего условия `WHEN` для каждой строки
DСтолбец `segment` получит значение последнего подходящего условия `WHEN` для каждой строки
Ответ: `CASE WHEN` проверяет условия по порядку сверху вниз и возвращает результат первого истинного.
Выражение `CASE` перебирает ветки `WHEN` последовательно. Для пользователя 25 лет первое условие `age < 18` ложно, второе `age < 30` истинно — он получит значение `'молодой'`. Третье условие даже не проверяется. Этот порядок важен: если бы `age < 50` стояло первым, пользователь попал бы в группу `'средний'`.
25Нужно показать 3-ю страницу каталога товаров: по 20 товаров на страницу, сортировка по цене по возрастанию (`price`). Какой запрос корректный?
A`SELECT product_id, price FROM products ORDER BY price ASC LIMIT 20 OFFSET 20`
B`SELECT product_id, price FROM products ORDER BY price DESC LIMIT 20 OFFSET 40`
C`SELECT product_id, price FROM products ORDER BY price ASC LIMIT 20 OFFSET 40`
D`SELECT product_id, price FROM products LIMIT 20 OFFSET 40`
Ответ: Для страницы N при размере страницы P используйте `LIMIT P OFFSET (N-1)*P` вместе с явным `ORDER BY`.
3-я страница при размере 20 означает, что нужно пропустить первые 40 строк и взять следующие 20: `LIMIT 20 OFFSET 40`. Так как требуется сортировка по цене по возрастанию, добавляем `ORDER BY price ASC`. Без `ORDER BY` страницы не будут стабильными, потому что исходный порядок строк не гарантирован.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram