Вы сортируете товары по величине скидки discount по убыванию. discount может быть NULL (скидки нет). Чтобы товары без скидки всегда были внизу независимо от настроек СУБД, какой вариант сортировки выбрать?
SELECT, FROM, WHERE, ORDER BY, LIMIT — базовый синтаксис SQL, с которого начинается любое собеседование. Кажется простым, но интервьюеры проверяют порядок выполнения клауз, приоритет операторов и понимание DISTINCT. Твёрдое знание основ — фундамент, без которого сложные задачи не решить.
Всего в этом разделе 40 вопросов. Каждый — с правильным ответом и кратким разбором теории. Разбито на 8 частей по 5 вопросов.
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` убирает пробелы, но не меняет регистр букв.