Основы SQL-запросов: вопросы для собеседования (часть 2)
SELECT, FROM, WHERE, ORDER BY, LIMIT — базовый синтаксис SQL, с которого начинается любое собеседование. Кажется простым, но интервьюеры проверяют порядок выполнения клауз, приоритет операторов и понимание DISTINCT. Твёрдое знание основ — фундамент, без которого сложные задачи не решить.
Вопросы 6–10 из 40
6Для отчёта по регистрациям вам нужны только `user_id` и `signup_at` из таблицы `users`. Какой запрос лучше соответствует задаче и не тянет лишние поля?
A`SELECT user_id, signup_at FROM users`
B`SELECT * FROM users`
C`SELECT signup_at FROM users`
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`. Вариант с дополнительным `WHERE signup_at IS NULL` меняет смысл выборки и оставит только строки с пропущенной датой регистрации.
7Нужно получить 5 самых дешёвых товаров категории `'electronics'` из таблицы `products`. Какой запрос верный?
A`SELECT product_id, price FROM products WHERE category = 'electronics' ORDER BY price ASC LIMIT 5`
B`SELECT product_id, price FROM products WHERE category = 'electronics' ORDER BY price DESC LIMIT 5`
C`SELECT product_id, price FROM products ORDER BY price ASC LIMIT 5`
D`SELECT product_id, price FROM products WHERE category = 'electronics' LIMIT 5`
Ответ: Чтобы взять «топ-N по критерию», нужна сортировка по критерию и `LIMIT` после неё.
Сначала отфильтровываем нужную категорию через `WHERE category = 'electronics'`. Затем сортируем по цене по возрастанию, чтобы дешёвые были сверху: `ORDER BY price ASC`. И берём первые 5 строк через `LIMIT 5`. Если убрать `ORDER BY`, то `LIMIT 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`. Запрос без `ORDER BY` не гарантирует, что вы увидите именно последние события.
9У пользователя `first_name = ' Анна '` и `last_name = ' Иванова '` (с лишними пробелами по краям). Что вернёт `SELECT CONCAT(TRIM(first_name), ' ', TRIM(last_name))`?
AРезультат будет `'Анна Иванова'` — `CONCAT` склеит строки, а `TRIM` уберёт лишние пробелы
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'`
Ответ: Скобки фиксируют смысл: сначала объединяем допустимые статусы, затем применяем страну.
Задача требует одновременно соблюдения страны и принадлежности статуса к одному из двух значений. Поэтому правильно: `country = 'RU' AND (status = 'failed' OR status = 'chargeback')`. Если убрать скобки, условие может начать пропускать все строки со статусом `'chargeback'` из любых стран, что исказит выборку для анализа.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram