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

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

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

Вопросы 610 из 40

6Для отчёта по регистрациям нужны только идентификатор пользователя `user_id` и дата `signup_at` из таблицы пользователей. Какой запрос лучше соответствует задаче и не тянет лишние поля?
A`SELECT user_id, signup_at FROM users ORDER BY signup_at DESC`
B`SELECT * FROM users ORDER BY user_id ASC`
C`SELECT signup_at FROM users WHERE signup_at IS NOT NULL`
D`SELECT user_id, signup_at FROM users WHERE signup_at IS NULL`
Ответ: Лучше выбирать только нужные столбцы: это упрощает дальнейшую работу и снижает риск лишней выгрузки данных.

`SELECT *` вытаскивает все столбцы, что часто приводит к лишнему объёму данных в выгрузке и может случайно утащить поля, которые не нужны для аналитики. Если для отчёта требуются только `user_id` и `signup_at`, то точнее и безопаснее `SELECT user_id, signup_at FROM users`. Вариант только с `signup_at` теряет идентификатор и не годится для отчёта по регистрациям. А `WHERE signup_at IS NULL` меняет смысл выборки и оставит только строки с пропущенной датой.

Подробный разбор →
7Нужно получить 5 самых дешёвых товаров категории `'electronics'` из таблицы `products`. Какой запрос верный?
A`SELECT product_id, price FROM products WHERE category = 'electronics' ORDER BY price DESC LIMIT 5;`
B`SELECT product_id, price FROM products WHERE category = 'electronics' LIMIT 5 ORDER BY price ASC;`
C`SELECT product_id, price FROM products WHERE category = 'electronics' ORDER BY price ASC LIMIT 5;`
D`SELECT product_id, MIN(price) FROM products WHERE category = 'electronics' LIMIT 5;`
Ответ: Чтобы получить топ-N по критерию, нужна сортировка по этому критерию и `LIMIT` после неё.

Сначала отбираем нужную категорию через `WHERE category = 'electronics'`, затем сортируем по цене по возрастанию (`ORDER BY price ASC`), чтобы дешёвые оказались сверху, и берём первые 5 строк через `LIMIT 5`. Сортировка по убыванию (`DESC`) даст самые дорогие. Перестановка `LIMIT` перед `ORDER BY` синтаксически некорректна. Использование `MIN(price)` без `GROUP BY` соберёт всё в одну строку и не вернёт 5 товаров.

Подробный разбор →
8Нужно получить 20 самых новых событий из таблицы `events` (по времени `event_time`) и показать их в выдаче сверху. Какой запрос верный?
A`SELECT event_id, event_time FROM events ORDER BY event_time ASC LIMIT 20`
B`SELECT event_id, event_time FROM events LIMIT 20`
C`SELECT event_id, event_time FROM events ORDER BY event_time ASC`
D`SELECT event_id, event_time FROM events ORDER BY event_time DESC LIMIT 20`
Ответ: Чтобы получить «самые новые сверху», используйте `ORDER BY ... DESC` и затем ограничьте результат через `LIMIT`.

Сортировка определяет порядок строк, а `LIMIT` отрезает первые N строк уже отсортированного результата. Если нужны самые новые события сверху, сортируем по `event_time` по убыванию (`ORDER BY event_time DESC`) и затем берём 20 строк через `LIMIT 20`. Запрос без сортировки не гарантирует порядок: СУБД вернёт любые 20 строк. Сортировка по возрастанию даст самые старые события, что противоположно задаче.

Подробный разбор →
9У пользователя `first_name = ' Анна '` и `last_name = ' Иванова '` (с лишними пробелами по краям). Что вернёт `SELECT CONCAT(TRIM(first_name), ' ', TRIM(last_name))`?
AРезультат `'Анна Иванова'`: `TRIM` уберёт пробелы по краям, а `CONCAT` склеит части через разделитель
BРезультат `'АннаИванова'`: `CONCAT` склеит значения подряд и проигнорирует переданный пробел-разделитель
CРезультат `NULL`: `CONCAT` с пробелом-разделителем приводит к ошибке преобразования внутри выражения
DРезультат `' Анна Иванова '`: `TRIM` обрабатывает только числовые типы и не убирает пробелы у строк
Ответ: `TRIM` убирает пробелы по краям строки, а `CONCAT` склеивает несколько строк в одну.

`TRIM(' Анна ')` вернёт `'Анна'`: пробелы слева и справа удалены. Аналогично `TRIM(' Иванова ')` вернёт `'Иванова'`. Затем `CONCAT` склеит три части — `'Анна'`, `' '` и `'Иванова'` — и итог будет `'Анна Иванова'`. Это стандартный приём для формирования полного имени из отдельных полей с очисткой от лишних пробелов.

Подробный разбор →
10В таблице `payments` нужно выбрать платежи из России (`country = 'RU'`) со статусом либо `'failed'`, либо `'chargeback'`. Какой `WHERE` корректный?
A`WHERE country = 'RU' AND (status = 'failed' OR status = 'chargeback')`
B`WHERE country = 'RU' AND status = 'failed' OR status = 'chargeback'`
C`WHERE (country = 'RU' OR status = 'failed') AND status = 'chargeback'`
D`WHERE country = 'RU' OR status = 'failed' OR status = 'chargeback'`
Ответ: Скобки фиксируют смысл: сначала объединяем допустимые статусы, затем применяем условие по стране через `AND`.

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

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

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

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

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

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

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