SQL
SQL Academy тренажер: как практиковаться
SQL Academy и похожие онлайн-тренажеры лучше проходить не ради процента завершения, а ради устойчивого приема: прочитать условие, найти нужные таблицы, написать запрос, проверить результат и разобрать ошибку
Хорошая SQL-практика строится не вокруг угадывания синтаксиса, а вокруг вопроса к данным. Сначала нужно понять, какие таблицы участвуют, какая связь между ними, что фильтруем, что группируем и какой результат можно проверить глазами
Таблицы для тренировки
В примерах будем опираться на четыре таблицы:
customers(id, name, city)orders(id, customer_id, total, created_at, status)products(id, title, category, price)order_items(order_id, product_id, quantity)
Если вы тренируетесь в онлайн-тренажере, не копируйте схему буквально. Сначала найдите похожие таблицы в своей задаче: кто покупает, что покупает, где сумма, где дата, где связь между таблицами
Как работать с задачами
Перед каждым запросом запишите ожидаемый результат словами. Например: показать заказы дороже 5000, найти клиентов без заказов, посчитать продажи по городам
После запуска не смотрите только на отсутствие ошибки. Проверьте количество строк, сортировку, пустые случаи и дубли. Именно на таких проверках становится видно, понимаете ли вы запрос
Задачи с решениями
Задача 1. Выбрать дорогие заказы
Найдите заказы дороже 5000 и отсортируйте их от большей суммы к меньшей
Решение:
SELECT id, customer_id, total
FROM orders
WHERE total > 5000
ORDER BY total DESC;
Проверка: добавьте заказ ровно на 5000 и убедитесь, что он не попал в выборку
Задача 2. Посчитать заказы по клиентам
Покажите customer_id и количество заказов для каждого клиента
Решение:
SELECT customer_id, COUNT(*) AS orders_count
FROM orders
GROUP BY customer_id
ORDER BY orders_count DESC;
Проверка: сравните количество строк с числом клиентов, у которых есть хотя бы один заказ
Задача 3. Найти клиентов без заказов
Выведите клиентов, у которых нет записей в таблице заказов
Решение:
SELECT c.id, c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;
Проверка: добавьте клиента без заказа и проверьте, что он появился в результате
Задача 4. Сумма продаж по городам
Посчитайте выручку по городам клиентов
Решение:
SELECT c.city, SUM(o.total) AS revenue
FROM customers c
JOIN orders o ON o.customer_id = c.id
GROUP BY c.city
ORDER BY revenue DESC;
Проверка: проверьте город, где есть несколько клиентов и несколько заказов
Задача 5. Заказы за последний месяц
Выберите заказы после 2026-06-01
Решение:
SELECT id, customer_id, total, created_at
FROM orders
WHERE created_at >= '2026-06-01'
ORDER BY created_at DESC;
Проверка: добавьте заказ на дату границы и проверьте, входит ли он в результат
Задача 6. Средний чек только по оплаченным заказам
Посчитайте средний чек, но не учитывайте отмененные заказы
Решение:
SELECT AVG(total) AS avg_paid_order
FROM orders
WHERE status = 'paid';
Проверка: добавьте отмененный заказ на большую сумму и убедитесь, что средний чек не изменился
По этой теме полезно отдельно посмотреть SQL тренажер: как практиковаться в запросах, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Задачи по SQL с решениями, чтобы расширить контекст и сравнить подходы
Как переносить приемы из тренажера в работу
После каждой решенной задачи запишите не ответ, а прием: фильтр по дате, группировка по клиенту, поиск отсутствующей связи через LEFT JOIN, подсчет уникальных значений
Так тренажер перестает быть набором отдельных задач и превращается в личную шпаргалку для рабочих запросов
Как читать готовый запрос
Начинайте с FROM: откуда берутся данные. Потом смотрите JOIN, потому что именно там часто теряются строки или появляются дубли. После этого переходите к WHERE, GROUP BY, HAVING, SELECT и ORDER BY
Если запрос длинный, запускайте его слоями: сначала одна таблица, затем соединение, затем фильтр, затем группировка. Такой порядок быстрее показывает место ошибки
Типичные ошибки
- использовать
SELECT *, когда нужны конкретные поля - забывать условие соединения в
JOIN - фильтровать агрегаты через
WHERE, хотя нуженHAVING - не проверять клиентов или товары без связанных записей
- считать строки вместо уникальных значений
- не смотреть на
NULL
Почти любую SQL-задачу можно упростить до маленькой проверки. Если результат странный, временно уберите часть условий и посмотрите, на каком шаге данные изменились не так
План практики
- Напишите пять запросов
SELECTс разными полями - Добавьте фильтры
WHERE - Потренируйте
ORDER BYиLIMIT - Перейдите к
GROUP BYи агрегатам - Добавьте
JOIN - Проверьте
LEFT JOINи отсутствующие связи - Перепишите один длинный запрос в несколько понятных шагов
Как разбирать ошибку в тренажере
Если ответ не принят, не переписывайте запрос полностью. Сначала проверьте, правильные ли поля выбраны в SELECT. Потом убедитесь, что сортировка совпадает с условием. Затем проверьте, не потеряли ли вы строки из-за обычного JOIN, когда нужен LEFT JOIN
Полезная привычка — сохранять не финальный ответ, а причину ошибки:
- перепутал
WHEREиHAVING - забыл сгруппировать поле
- выбрал лишнюю колонку
- отсортировал по возрастанию вместо убывания
- потерял строки без связанных записей
Самостоятельная проверка после урока
Возьмите принятую задачу и измените ее одним способом: другой порог суммы, другой статус, другая сортировка, группировка по другому полю. Если после изменения вы снова можете написать запрос без подсказки, прием закрепился
Пример:
SELECT customer_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(total) > 10000
ORDER BY revenue DESC;
Сначала объясните, что делает каждая строка. Потом поменяйте порог 10000 на 5000 и проверьте, как изменится выдача
Проверка решения перед ответом
Перед тем как считать задачу решенной, проверьте четыре вещи. Первая — не потерялись ли строки при соединении таблиц. Если в условии важны клиенты без заказов или товары без продаж, обычный JOIN может скрыть нужные строки. Вторая — не появились ли дубли после соединения. Один заказ с несколькими позициями может размножить строки, и обычный COUNT(*) начнет считать не то
Третья проверка — границы фильтра. Если написано «от 5000», уточните, входит ли сама сумма 5000. Для этого есть разница между > и >=. Четвертая проверка — смысл итоговой строки. После GROUP BY одна строка результата должна соответствовать одной группе: клиенту, городу, дню, товару или категории
Мини-задание для закрепления: возьмите любой запрос из статьи и перепишите его в два варианта — сначала через обычный JOIN, потом через LEFT JOIN. Сравните количество строк и объясните, почему результат отличается. Это упражнение быстро показывает, понимаете ли вы связь между таблицами