SQL

SQL тренажер: как практиковаться в запросах

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

Хорошая 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. Товары с самым большим спросом

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

Решение:

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;

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

Задача 6. Средний чек только по оплаченным заказам

Посчитайте средний чек, но не учитывайте отмененные заказы

Решение:

SELECT AVG(total) AS avg_paid_order
FROM orders
WHERE status = 'paid';

Проверка: добавьте отмененный заказ на большую сумму и убедитесь, что средний чек не изменился

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

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

Дополнительный набор задач

  • вывести последние 5 заказов
  • найти клиентов из одного города
  • посчитать минимальный и максимальный заказ
  • найти товары без продаж
  • показать дни, где выручка выше 10000

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

Начинайте с 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. Перепишите один длинный запрос в несколько понятных шагов

Мини-сессия на 20 минут

Чтобы тренажер давал результат, занимайтесь короткими подходами. За один подход берите не десять новых тем, а один прием: фильтр, группировку, соединение или поиск отсутствующих данных

Порядок такой:

  1. выбрать одну задачу
  2. выписать таблицы и поля
  3. написать самый простой SELECT
  4. добавить одно условие
  5. проверить результат глазами
  6. придумать похожую задачу и решить без подсказки

Например, после задачи про заказы дороже 5000 сразу сделайте похожую: заказы дешевле 1000, заказы со статусом paid, последние пять заказов клиента. Так один прием закрепляется на разных данных

Проверочная задача

Найдите города, где есть минимум два оплаченных заказа

SELECT c.city, COUNT(o.id) AS paid_orders
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'paid'
GROUP BY c.city
HAVING COUNT(o.id) >= 2;

Проверьте город с одним заказом и город без заказов. Если город без заказов должен попадать в отчет, нужен уже не JOIN, а LEFT JOIN и отдельная логика подсчета

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

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

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

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

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

Настройки cookie

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