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

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

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

Вопросы 1620 из 40

16Нужно вывести только оплаченные заказы (`status = 'paid'`) и отсортировать их по времени создания от новых к старым. Какой запрос соответствует задаче?
A`SELECT order_id, created_at FROM orders ORDER BY created_at DESC`
B`SELECT order_id, created_at FROM orders WHERE status = 'paid' ORDER BY created_at DESC`
C`SELECT order_id, created_at FROM orders WHERE status = 'paid' ORDER BY created_at ASC`
D`SELECT order_id, created_at FROM orders WHERE created_at DESC AND status = 'paid'`
Ответ: Фильтрация делается в `WHERE`, сортировка — в `ORDER BY`; для «от новых к старым» используйте `DESC`.

Чтобы получить только оплаченные строки, нужно условие `WHERE status = 'paid'`. Чтобы показать новые сверху, сортируем по `created_at` по убыванию: `ORDER BY created_at DESC`. Запрос без `WHERE` вернёт заказы всех статусов, а сортировка `ASC` даст старые сверху.

17Вы делаете пагинацию так: `SELECT product_id FROM products LIMIT 20 OFFSET 20`. В чём главный риск такого подхода для аналитической витрины/интерфейса, если нет `ORDER BY`?
AЗапрос обязательно вернёт пустой результат, потому что `OFFSET` нельзя использовать без `ORDER BY`
B`OFFSET` считает строки с 1, поэтому будет пропущена 21-я строка
CПорядок строк не определён, поэтому страницы могут пересекаться или «скакать» между запросами
D`LIMIT` и `OFFSET` игнорируются, если не указать `WHERE`
Ответ: `LIMIT`/`OFFSET` зависят от порядка строк, поэтому без `ORDER BY` страницы не стабильны.

`OFFSET` означает «пропусти N первых строк», но понятие «первых» появляется только при заданном порядке. Без `ORDER BY` СУБД не обязана возвращать строки в одном и том же порядке, поэтому при повторных запросах вы можете увидеть дубликаты на разных страницах или пропуски. Для стабильной пагинации нужен явный `ORDER BY` (и желательно детерминированный).

18Нужно выбрать заказы за декабрь 2025 из таблицы `orders` по полю `created_at`. Какой фильтр надёжнее задаёт диапазон «весь месяц»?
A`WHERE created_at = '2025-12-01'`
B`WHERE created_at >= '2025-12-01' AND created_at < '2026-01-01'`
C`WHERE created_at > '2025-12-01' AND created_at < '2025-12-31'`
D`WHERE created_at <= '2025-12-31'`
Ответ: Для «целого периода» удобно использовать полуинтервал: `>=` начало и `<` следующий период.

Фильтр `created_at >= '2025-12-01' AND created_at < '2026-01-01'` захватывает все значения внутри декабря, включая время внутри дня (если `created_at` содержит время). Варианты с `= '2025-12-01'` или `<= '2025-12-31'` обычно либо слишком узкие, либо могут некорректно обработать время в конце дня.

19Вы сортируете товары по величине скидки `discount` по убыванию. `discount` может быть `NULL` (скидки нет). Чтобы товары без скидки всегда были внизу независимо от настроек СУБД, какой вариант сортировки выбрать?
A`ORDER BY discount DESC LIMIT 100`
B`ORDER BY discount DESC OFFSET 0`
C`ORDER BY discount DESC NULLS LAST`
D`ORDER BY discount DESC WHERE discount IS NOT NULL`
Ответ: `NULLS FIRST` / `NULLS LAST` позволяют явно зафиксировать позицию `NULL` при сортировке.

Поведение `NULL` при сортировке может отличаться между системами, поэтому для отчётов лучше задавать его явно. Если `NULL` означает «нет скидки» и должен быть внизу, добавьте `NULLS LAST`: `ORDER BY discount DESC NULLS LAST`. `LIMIT` и `OFFSET` не управляют положением `NULL`, а `WHERE` используется для фильтрации, а не для сортировки.

20Нужно получить 10 последних событий конкретного пользователя (`user_id = 42`) из таблицы `events`. Какой запрос корректнее всего решает задачу?
A`SELECT event_time, event_name FROM events WHERE user_id = 42 ORDER BY event_time DESC LIMIT 10`
B`SELECT event_time, event_name FROM events ORDER BY event_time DESC LIMIT 10`
C`SELECT event_time, event_name FROM events WHERE user_id = 42 ORDER BY event_time ASC LIMIT 10`
D`SELECT event_time, event_name FROM events WHERE user_id = 42 LIMIT 10`
Ответ: Чтобы получить «последние N» по пользователю, нужна и фильтрация в `WHERE`, и сортировка в `ORDER BY`, и ограничение через `LIMIT`.

Если не указать `WHERE user_id = 42`, вы получите события всех пользователей. Если сортировать `ASC`, вы получите самые ранние события, а не последние. Если убрать `ORDER BY`, то `LIMIT 10` вернёт произвольные 10 строк пользователя без гарантии, что они последние. Поэтому правильный паттерн: `WHERE ... ORDER BY ... DESC LIMIT ...`.

12345678

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

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

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

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

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