Основы 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` даст старые сверху. Конструкция `WHERE created_at DESC` синтаксически невалидна — `DESC` уместен только в `ORDER BY`.

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

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

Подробный разбор →
18Нужно выбрать заказы за декабрь 2025 из таблицы заказов по полю `created_at` с временем. Какой фильтр надёжнее задаёт диапазон «весь месяц» без потерь по краям?
A`WHERE created_at = '2025-12-01' OR created_at = '2025-12-31'`
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' AND created_at >= '2025-12-15'`
Ответ: Для «целого периода» удобно использовать полуинтервал: `>=` начало и `<` следующий период.

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

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

Поведение `NULL` при сортировке отличается между системами: где-то `NULL` сверху, где-то снизу. Для отчётов лучше задавать порядок явно: если `NULL` означает «нет скидки» и должен оказаться внизу, добавляют `NULLS LAST`. `LIMIT` не управляет положением `NULL`, а замена `NULL` через `COALESCE` смешивает «нет скидки» с реальной нулевой скидкой и искажает интерпретацию. Явный `NULLS LAST` — самый чистый способ.

Подробный разбор →
20Нужно получить 10 последних событий конкретного пользователя (`user_id = 42`) из таблицы `events(user_id, event_time, event_name)`. Какой запрос корректнее всего решает задачу?
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 ... DESC` и `LIMIT`.

Без `WHERE user_id = 42` в результат попадут события всех пользователей. Сортировка `ASC` вернёт самые ранние, а не последние. Без `ORDER BY` СУБД возвращает произвольные 10 строк без гарантии порядка. Корректный паттерн объединяет все три условия: фильтрация, сортировка по времени убыванием и ограничение.

Подробный разбор →
12345678

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

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

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

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

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