Основы SQL-запросов: вопросы для собеседования (часть 6)
SELECT, FROM, WHERE, ORDER BY, LIMIT — базовый синтаксис SQL, с которого начинается любое собеседование. Кажется простым, но интервьюеры проверяют порядок выполнения клауз, приоритет операторов и понимание DISTINCT. Твёрдое знание основ — фундамент, без которого сложные задачи не решить.
Вопросы 26–30 из 40
26Что можно корректно утверждать про результат запроса `SELECT user_id FROM users LIMIT 10`, если в запросе нет `ORDER BY`?
ASQL не гарантирует, какие именно 10 строк вернутся без `ORDER BY`
BВсегда вернутся 10 самых ранних пользователей по `created_at`
CВсегда вернутся 10 самых новых пользователей по `created_at`
DЗапрос не выполнится: `LIMIT` нельзя использовать без `ORDER BY`
Ответ: Без `ORDER BY` порядок строк не определён, поэтому `LIMIT` ограничивает «первые N» в неопределённом порядке.
`LIMIT` сам по себе не выбирает «первые по времени» или «последние по id» — он просто берёт первые N строк из результата. Но если вы не задали `ORDER BY`, СУБД не обязана возвращать строки в одном и том же порядке. Поэтому при аналитических задачах (топ-N, списки, страницы) обычно всегда задают явную сортировку.
27Вы строите выдачу «последние заказы» и используете `LIMIT 50`. Поле `created_at` не уникально (много заказов в одну секунду). Какой `ORDER BY` лучше, чтобы порядок был детерминированным?
A`ORDER BY created_at DESC`
B`ORDER BY created_at DESC, order_id DESC`
C`ORDER BY order_id DESC, created_at DESC`
D`ORDER BY created_at ASC, order_id DESC`
Ответ: Если основной ключ сортировки не уникален, добавляйте второй (обычно уникальный) столбец как tie-breaker.
При `ORDER BY created_at DESC` строки с одинаковым `created_at` могут возвращаться в разном порядке, а это влияет на `LIMIT` и пагинацию. Добавив второй столбец, который однозначно различает строки (например, `order_id`), вы фиксируете порядок: `ORDER BY created_at DESC, order_id DESC`. Тогда «верхние 50» будут воспроизводимыми при повторных запросах к тем же данным.
28Что вернёт запрос `SELECT COUNT(DISTINCT user_id) FROM orders`, если у некоторых пользователей несколько заказов?
AЗапрос вернёт общее количество строк в таблице `orders` без какой-либо дедупликации
BЗапрос вернёт количество строк, где `user_id` не равен `NULL`, включая повторяющиеся значения
CЗапрос вернёт количество уникальных значений `user_id`, пропуская `NULL` и дубликаты
DЗапрос вернёт ошибку, потому что `DISTINCT` нельзя использовать внутри агрегатной функции
Ответ: `COUNT(DISTINCT столбец)` считает количество уникальных непустых значений в указанном столбце.
`COUNT(DISTINCT user_id)` сначала убирает дубликаты и `NULL` из значений `user_id`, а затем считает оставшиеся уникальные значения. Если в таблице 1000 заказов от 300 разных пользователей — результат будет 300. Это стандартный способ подсчёта уникальных сущностей: уникальных покупателей, уникальных товаров и т.д.
29Первый `SELECT` возвращает два столбца `name, email`, а второй — три столбца `name, email, phone`. Что произойдёт при `SELECT name, email FROM users UNION ALL SELECT name, email, phone FROM contacts`?
AЗапрос вызовет ошибку, потому что количество и типы столбцов в обоих `SELECT` должны совпадать
BЗапрос выполнится успешно: лишние столбцы второго `SELECT` будут обрезаны автоматически
CЗапрос выполнится успешно: недостающие столбцы первого `SELECT` заполнятся значением `NULL`
DЗапрос объединит все столбцы из обоих запросов в один широкий результирующий набор
Ответ: Для `UNION` / `UNION ALL` количество столбцов и их типы должны совпадать во всех объединяемых запросах.
SQL требует, чтобы все части `UNION` или `UNION ALL` возвращали одинаковое количество столбцов с совместимыми типами. Если первый `SELECT` возвращает 2 столбца, а второй — 3, запрос завершится ошибкой. Чтобы это исправить, нужно либо убрать лишний столбец из второго запроса, либо добавить `NULL AS phone` в первый.
30В таблице `imports` столбец `amount_text` хранит числа в текстовом формате (`'100.50'`, `'200'`). Что произойдёт при выполнении `SELECT CAST(amount_text AS NUMERIC) FROM imports`, если часть значений содержит буквы (`'N/A'`)?
AЗапрос вернёт `NULL`, потому что текстовое значение невозможно преобразовать в число ни при каких условиях
BЗапрос вернёт `0`, потому что `CAST` заменяет нечисловые строки нулём при преобразовании типов
CЗапрос выполнится успешно для любых строк, потому что `CAST` молча пропускает ошибки конвертации
DЗапрос вызовет ошибку, если в `amount_text` есть значения, которые нельзя интерпретировать как число
Ответ: `CAST` выполняет строгое преобразование типов и вызывает ошибку, если значение не может быть преобразовано.
Функция `CAST(value AS type)` пытается преобразовать каждое значение в указанный тип. Для строк вроде `'100.50'` преобразование в `NUMERIC` пройдёт успешно. Но если встретится значение `'N/A'`, которое невозможно интерпретировать как число, запрос завершится ошибкой. Для безопасного преобразования в PostgreSQL можно использовать конструкцию с `CASE WHEN` или специальные функции.
Хотите тренировать интерактивно?
В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.
Тренировать в Telegram