SQL

Stepik SQL тренажер: как заниматься

В SQL-тренажере на Stepik или в любом похожем курсе важно не проскочить задачу после зеленой галочки. Зеленая галочка говорит, что ответ принят, но навык появляется только после повторного решения и проверки на похожем условии

Хорошая 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. Заказы конкретного клиента

Покажите все заказы клиента с customer_id = 3

Решение:

SELECT id, total, created_at
FROM orders
WHERE customer_id = 3
ORDER BY created_at DESC;

Проверка: проверьте клиента, у которого нет заказов

Задача 4. Найти клиентов без заказов

Выведите клиентов, у которых нет записей в таблице заказов

Решение:

SELECT c.id, c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;

Проверка: добавьте клиента без заказа и проверьте, что он появился в результате

Задача 5. Сумма продаж по городам

Посчитайте выручку по городам клиентов

Решение:

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;

Проверка: проверьте город, где есть несколько клиентов и несколько заказов

Задача 6. Товары с самым большим спросом

Найдите товары, которые чаще всего встречаются в заказах

Решение:

SELECT p.title, SUM(oi.quantity) AS sold
FROM order_items oi
JOIN products p ON p.id = oi.product_id
GROUP BY p.id, p.title
ORDER BY sold DESC
LIMIT 10;

Проверка: проверьте товар с одинаковым количеством продаж у двух позиций

По этой теме полезно отдельно посмотреть SQL тренажер: как практиковаться в запросах, чтобы расширить контекст и сравнить подходы

По этой теме полезно отдельно посмотреть SQL Academy тренажер: как практиковаться, чтобы расширить контекст и сравнить подходы

Как не застревать на одной задаче

Если задача не решается 10-15 минут, выпишите таблицы и нужные поля. Потом напишите самый простой SELECT без фильтров. Затем добавляйте условия по одному

Как читать готовый запрос

Начинайте с FROM: откуда берутся данные. Потом смотрите JOIN, потому что именно там часто теряются строки или появляются дубли. После этого переходите к WHERE, GROUP BY, HAVING, SELECT и ORDER BY

Если запрос длинный, запускайте его слоями: сначала одна таблица, затем соединение, затем фильтр, затем группировка. Такой порядок быстрее показывает место ошибки

Типичные ошибки

  • использовать SELECT *, когда нужны конкретные поля
  • забывать условие соединения в JOIN
  • фильтровать агрегаты через WHERE, хотя нужен HAVING
  • не проверять клиентов или товары без связанных записей
  • считать строки вместо уникальных значений
  • не смотреть на NULL

Почти любую SQL-задачу можно упростить до маленькой проверки. Если результат странный, временно уберите часть условий и посмотрите, на каком шаге данные изменились не так

План практики

  1. Напишите пять запросов SELECT с разными полями
  2. Добавьте фильтры WHERE
  3. Потренируйте ORDER BY и LIMIT
  4. Перейдите к GROUP BY и агрегатам
  5. Добавьте JOIN
  6. Проверьте LEFT JOIN и отсутствующие связи
  7. Перепишите один длинный запрос в несколько понятных шагов

Как повторять после принятого ответа

После принятой задачи сделайте три повтора. Первый — сразу перепишите запрос без просмотра ответа. Второй — измените условие. Третий — объясните запрос словами, как будто показываете его другому человеку

Пример изменения условия:

SELECT customer_id, COUNT(*) AS paid_orders
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING COUNT(*) >= 3;

Если в исходной задаче было «минимум два заказа», поменяйте на «минимум три оплаченных заказа». Это маленькое изменение заставляет заново понять WHERE, GROUP BY и HAVING

Что записывать в конспект

Записывайте не весь SQL целиком, а короткую схему приема:

  • WHERE фильтрует строки до группировки
  • HAVING фильтрует группы после GROUP BY
  • LEFT JOIN нужен, чтобы увидеть строки без пары
  • COUNT(DISTINCT ...) считает уникальные значения

Так конспект останется рабочим, а не превратится в архив ответов

Проверка решения перед ответом

Перед тем как считать задачу решенной, проверьте четыре вещи. Первая — не потерялись ли строки при соединении таблиц. Если в условии важны клиенты без заказов или товары без продаж, обычный JOIN может скрыть нужные строки. Вторая — не появились ли дубли после соединения. Один заказ с несколькими позициями может размножить строки, и обычный COUNT(*) начнет считать не то

Третья проверка — границы фильтра. Если написано «от 5000», уточните, входит ли сама сумма 5000. Для этого есть разница между > и >=. Четвертая проверка — смысл итоговой строки. После GROUP BY одна строка результата должна соответствовать одной группе: клиенту, городу, дню, товару или категории

Мини-задание для закрепления: возьмите любой запрос из статьи и перепишите его в два варианта — сначала через обычный JOIN, потом через LEFT JOIN. Сравните количество строк и объясните, почему результат отличается. Это упражнение быстро показывает, понимаете ли вы связь между таблицами

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x