Mysql запросы

Отличный выбор! База данных classicmodels — это золотой стандарт для обучения SQL. Она идеально подходит вашей аудитории (бухгалтеры/экономисты), потому что моделирует реальный бизнес (дистрибьютор моделей машин) и содержит все ключевые сущности: клиенты, товары, заказы, платежи, сотрудники.

Я адаптировал вашу программу и задания специально под эту базу, сохранив структуру (от простого к сложному) и добавив «бухгалтерский» контекст к каждой задаче.

Адаптация программы под БД classicmodels

Вот как теперь будут выглядеть блоки в терминах понятных вашим студентам:

  • Таблица customers -> Наши контрагенты (покупатели).

  • Таблица products -> Номенклатура (товары на складе).

  • Таблица orders -> Журнал заказов (реализация).

  • Таблица orderdetails -> Спецификация заказа (расшифровка, что именно купили).

  • Таблица payments -> Банковская выписка (поступление оплат).

  • Таблица employees -> Наши сотрудники (менеджеры по продажам).

  • Таблица offices -> Филиалы компании.


Комплект заданий для первого урока (и далее)

Я сгруппировал задания по темам, как у вас. Эти запросы можно и нужно выполнять на данных classicmodels.

Блок 1: Базовые SELECT запросы (Знакомство с данными)

  • Задание 1.1 (Знакомство с контрагентами): Вывести список всех клиентов (customers) из США (USA). Показать название компании (customerName), город (city) и штат (state).

    • Контекст: «Давайте посмотрим, кто наши основные покупатели в Америке.»

  • Задание 1.2 (Знакомство с товарами): Вывести все товары (products) от производителя „Autoart Studio Design“ (productVendor).

    • Контекст: «Посмотрим весь ассортимент одного поставщика.»

  • Задание 1.3 (Фильтрация по деньгам): Показать все заказы (orders) со статусом „Shipped“ (Отгружен).

    • Контекст: «Отчет по отгруженным заказам. Это наша реализация.»

Блок 2: Агрегирующие функции и GROUP BY (Оборотно-сальдовые ведомости)

  • Задание 2.1 (Анализ остатков): Посчитать, сколько всего товаров (quantityInStock) каждого производителя (productVendor) есть на складе. Отсортировать по убыванию количества.

    • Контекст: «Смотрим, у кого из поставщиков самые большие складские запасы.»

  • Задание 2.2 (Средний чек): Рассчитать среднюю стоимость заказа (total_amount). Подсказка: сумму заказа нужно посчитать в подзапросе или с помощью CTE, либо использовать таблицу orderdetails.

    • Контекст: «Какой у нас средний чек по компании?»

  • Задание 2.3 (Анализ по странам): Посчитать количество клиентов в каждой стране (country). Вывести только те страны, где больше 5 клиентов (используйте HAVING).

    • Контекст: «Определяем ключевые рынки сбыта.»

Блок 3: JOIN операции (Связанные документы)

  • Задание 3.1 (Заказы и клиенты): Вывести список всех заказов (orders), добавив к ним название компании-клиента (customerName).

    • Контекст: «Формируем реестр заказов с расшифровкой контрагента.»

  • Задание 3.2 (Товары в заказах): Показать, какие товары (productName) входят в заказ номер 10101.

    • Контекст: «Смотрим спецификацию конкретного заказа.»

  • Задание 3.3 (Топ-3 клиента по выручке): Найти 3 клиентов (customerName), которые принесли максимальную общую выручку (сумма amount из таблицы payments).

    • Контекст: «Кто наши самые ценные клиенты?»

Блок 4: Подзапросы (Subqueries)

  • Задание 4.1 (Клиенты без заказов): Найти клиентов, которые зарегистрированы, но еще не сделали ни одного заказа.

    • Контекст: «Ищем неактивных контрагентов для отдела продаж.»

  • Задание 4.2 (Лучший товар): Найти товар (или товары), цена которых выше средней цены по всем товарам.

    • Контекст: «Товары премиум-сегмента.»

Блок 5: Оконные функции (Window Functions)

  • Задание 5.1 (Рейтинг клиентов): Проранжировать клиентов по сумме их оплат (из payments). Вывести имя, страну, сумму и ранг.

    • Контекст: «Строим рейтинг клиентов для программы лояльности.»

  • Задание 5.2 (Накопительный итог): Показать помесячную сумму платежей и накопительный итог с начала года (используйте оконную функцию SUM() OVER()).

    • Контекст: «Анализ динамики поступлений денежных средств.»

Блок 6: Работа с датами

  • Задание 6.1 (Дни просрочки): Для каждого заказа (orders) посчитать разницу в днях между датой отгрузки (shippedDate) и требуемой датой (requiredDate). Вывести для тех заказов, которые были отгружены с опозданием.

    • Контекст: «Анализ качества логистики и своевременности доставки.»

  • Задание 6.2 (Поквартальный анализ): Посчитать общую сумму платежей по кварталам за 2004 год.

    • Контекст: «Квартальный отчет по поступлениям.»

Блок 7: CASE выражения (Аналитические группировки)

  • Задание 7.1 (Сегментация товаров): Создать новое поле price_category, которое будет классифицировать товары (products) по цене (buyPrice): „Low“ (< 50), „Medium“ (50-100), „High“ (> 100).

    • Контекст: «Разбиваем товары на ценовые сегменты для маркетинга.»

  • Задание 7.2 (Надежность клиента): В зависимости от кредитного лимита (creditLimit) клиента (customers) присвоить ему категорию: „VIP“ ( > 100000), „Standard“ (50000-100000), „Low“ (< 50000).

    • Контекст: «Оценка надежности контрагента.»

Блок 8: CTE (Common Table Expressions) и витрины данных

  • Задание 8.1 (Витрина по продажам): Создать «витрину» для отчета по продажам. Используя CTE, собрать данные: номер заказа, дата заказа, имя клиента, страна клиента, название товара, категория товара (productLine), количество, цена.

    • Контекст: «Собираем единую таблицу для загрузки в Power BI.»

Блок 9: Аналитические паттерны

  • Задание 9.1 (Повторные покупки): Найти клиентов, которые делали заказы в разные месяцы. (Классика RFM-анализа).

    • Контекст: «Выявляем лояльных клиентов с историей.»

  • Задание 9.2 (Самые популярные категории): Для каждой линейки продуктов (productLine) посчитать общую выручку и процент от общей выручки компании.

    • Контекст: «Анализ структуры продаж по направлениям.»

Методические рекомендации по проведению первого урока с этой БД

  1. Начало (15 мин): «Коллеги, перед вами база данных небольшой фирмы, которая продает коллекционные модели машинок по всему миру. Здесь есть клиенты, заказы, платежи — все, как в 1С или ERP-системе, с которой вы работали. Только теперь мы будем «выдергивать» данные не через стандартные отчеты, а с помощью универсального языка — SQL.»

  2. Практика «Первый запрос» (15 мин):

    • Покажите таблицу customers.

    • Задача: «Давайте посмотрим, кто есть в нашей базе». Запрос: SELECT * FROM customers; — просто смотрим.

    • Задача: «А теперь давайте найдем всех наших клиентов в Москве (NYC)». Запрос: SELECT customerName, city FROM customers WHERE city = 'NYC'; — видите, как просто заменить фильтр в Excel?

  3. Практика «Сводная таблица» (20 мин):

    • Задача: «Руководитель просит отчет: сколько клиентов в каждой стране. В Excel вы бы сделали сводную таблицу. А мы сделаем так:»

    • Запрос: SELECT country, COUNT(*) as client_count FROM customers GROUP BY country ORDER BY client_count DESC;

    • Комментарий: «Обратите внимание, мы не просто посчитали, но и отсортировали — страны с максимальным числом клиентов сверху.»

  4. Практика «ВПР мечты» (INNER JOIN) (25 мин):

    • Задача: «Самое интересное — связать заказы и клиентов. Нам нужно распечатать накладную, чтобы было понятно, кому везти товар.»

    • Запрос: Объясните, что данные лежат в двух таблицах: в orders (номер заказа, дата, customerNumber) и в customers (название, адрес).

    • Напишите JOIN:

      SELECT orders.orderNumber, orders.orderDate, customers.customerName, customers.country
      FROM orders
      INNER JOIN customers ON orders.customerNumber = customers.customerNumber
      WHERE orders.status = 'Shipped';
      
    • Комментарий: «Это как ВПР в Excel, только мы сразу из двух таблиц данные тянем, и Excel не виснет на 10 тысяч строк.»

  5. Заключение (5 мин): «Вот за 1,5 часа мы научились делать выгрузки, которые в 1С приходится заказывать у программистов или долго вымучивать в Excel. Разницу почувствовали? На следующем занятии научимся считать выручку и строить аналитические отчеты.»

Важное дополнение по настройке БД

В вашем скрипте для classicmodels есть одна особенность для первого урока. Таблицы создаются с помощью CREATE TABLE, но если вы будете показывать SELECT * FROM productlines, то увидите, что поля htmlDescription и image содержат NULL. Это нормально.

Для первого урока, чтобы сразу получить красивый результат, начните с таблиц, которые максимально понятны и хорошо заполнены:

  1. customers (клиенты)

  2. products (товары) — там много текста, это наглядно.

  3. orders (заказы)

Это даст быстрый визуальный отклик и понимание, что «здесь есть данные».