Вопросы по теме «Основы SQL-запросов»

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

Всего в этом разделе 40 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 8 частей по 5 вопросов.

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

Вопросы 15 из 40

1Что сделает запрос `INSERT INTO archive (order_id, amount, status) SELECT order_id, amount, status FROM orders WHERE status = 'completed'`?
AЗапрос вставит в `archive` только столбцы, совпадающие по имени с таблицей `orders`
BЗапрос вызовет ошибку, потому что `INSERT` и `SELECT` нельзя использовать в одном запросе
CЗапрос скопирует все строки из `orders` в `archive` без применения условия по статусу
DЗапрос вставит в `archive` только заказы со статусом `'completed'` из таблицы `orders`
Ответ: `INSERT INTO ... SELECT` копирует результат запроса `SELECT` в указанную таблицу.

Конструкция `INSERT INTO ... SELECT` берёт результат выборки и вставляет его в целевую таблицу. Здесь `SELECT` фильтрует заказы со статусом `'completed'` и выбирает три столбца. Эти строки вставляются в таблицу `archive` в указанные столбцы. Условие `WHERE` применяется к исходным данным, поэтому копируются не все заказы, а только завершённые.

2Что вернёт запрос `SELECT DISTINCT city, country FROM users`, если в таблице есть повторяющиеся пары `city`-`country`?
AВернёт только уникальные комбинации `city` и `country`, убирая полные дубликаты строк
BВернёт все строки без изменений, потому что `DISTINCT` работает только с одним столбцом
CВернёт уникальные значения `city`, но все значения `country` без дедупликации
DУдалит дублирующиеся строки из самой таблицы `users` и вернёт оставшиеся записи
Ответ: `DISTINCT` применяется ко всей комбинации столбцов в `SELECT`, а не к одному столбцу.

`SELECT DISTINCT` убирает из результата полные дубликаты строк — то есть строки, в которых совпадают все выбранные столбцы. Если указаны `city` и `country`, то дубликатом считается строка с одинаковой парой значений. При этом `DISTINCT` не изменяет саму таблицу — он действует только на результат запроса.

3В таблице `orders` поле `cancelled_at` заполняется только для отменённых заказов, а для активных — `NULL`. Какой фильтр выберет активные (не отменённые) заказы?
A`WHERE cancelled_at IS NULL`
B`WHERE cancelled_at = NULL`
C`WHERE cancelled_at <> NULL`
D`WHERE cancelled_at IS NOT NULL`
Ответ: Чтобы отобрать строки с пропуском, используйте `IS NULL`, а не сравнение через `=`.

Условие `cancelled_at IS NULL` вернёт `TRUE` для активных заказов, где дата отмены отсутствует. Сравнения вида `cancelled_at = NULL` не работают как «равно пропуску» и обычно дают не `TRUE`, поэтому такие фильтры приводят к неожиданным пустым результатам.

4В таблице `users` 1000 строк, из них у 200 пользователей поле `email` равно `NULL`. Чем будут отличаться результаты `SELECT COUNT(*) FROM users` и `SELECT COUNT(email) FROM users`?
AОба вернут одинаковое значение, потому что `COUNT` подсчитывает все строки таблицы
BОба вернут `0`, потому что `NULL`-значения не считаются ни одной из функций подсчёта
CПервый вернёт число строк без `NULL`, второй вернёт общее число строк в таблице
DПервый вернёт общее число строк, второй пропустит строки с `NULL` в `email`
Ответ: `COUNT(*)` считает все строки, а `COUNT(столбец)` считает только строки, где значение столбца не равно `NULL`.

`COUNT(*)` подсчитывает количество строк в результате независимо от значений в столбцах — для 1000 строк вернёт 1000. `COUNT(email)` подсчитывает только строки, где `email` не равен `NULL` — вернёт 800. Это важное отличие при работе с данными, где есть пропуски.

5В таблице `users` email хранится в разном регистре: `'Anna@mail.ru'`, `'anna@MAIL.ru'` и т.д. Как надёжнее всего найти все записи с конкретным адресом вне зависимости от регистра?
AПрименить `UPPER(email)` в `WHERE`, чтобы привести к верхнему регистру перед сравнением
BИспользовать `TRIM(email)` в `WHERE`, чтобы удалить пробелы и привести регистр к единому
CНаписать `WHERE email = 'anna@mail.ru' OR email = 'Anna@mail.ru'` для обоих вариантов
DПрименить `LOWER(email)` в `WHERE`, чтобы привести к нижнему регистру перед сравнением
Ответ: Функции `LOWER` и `UPPER` приводят строку к единому регистру, что позволяет сравнивать без учёта регистра.

Чтобы сравнение не зависело от того, какие буквы заглавные, удобно привести обе стороны к одному регистру: `WHERE LOWER(email) = LOWER('anna@mail.ru')`. Перечисление всех возможных вариантов написания ненадёжно. Функция `TRIM` убирает пробелы, но не меняет регистр букв.

12345678

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

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

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

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

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