Практика: подробности заказов
Пора собрать весь урок вместе. Магазин хочет увидеть подробности своих заказов: что в них было, кто их сделал и на какую сумму. Для каждого запроса нужно несколько таблиц, и когда вы его пишете, помогает идти шаг за шагом:
- В каких таблицах лежат данные? Перечислите столбцы, которые хотите показать, по которым хотите фильтровать и сортировать, и найдите таблицы, где они лежат.
- Как таблицы связаны? Идите по внешним ключам: каждый из них — это JOIN со своим ON. Запускайте запрос после каждого JOIN и смотрите на строки: разумно ли их количество?
- JOIN или LEFT JOIN? Нужны ли строки без пары, например клиенты без заказов? Тогда LEFT JOIN, а условия на его правую таблицу ставьте в ON.
- WHERE, GROUP BY, HAVING, ORDER BY работают так же, как с одной таблицей, только с полными именами. Добавляйте в сортировку второй столбец, чтобы порядок строк всегда был однозначным.
- Проверьте числа. Не слишком ли они велики? Тогда, возможно, строки размножились: считайте через COUNT(DISTINCT …).
Итоги заказов считаются как выручка: каждая позиция принесла i.quantity * i.price, а итог заказа — это сумма его позиций, поэтому группируйте по заказу.
Задание
- 1
Чеки Sophie Adams: покажите каждую позицию каждого её заказа —
order_id,ordered_atзаказа,titleигры,quantity,price, которую она заплатила за один экземпляр, и стоимость всей позиции (количество, умноженное на цену) какsubtotal. Находите её заказы по имени и отсортируйте строки поorder_id, затем поtitle:order_id ordered_at title quantity price subtotal 23 2025-08-30 Word Quest 1 10 10 28 2025-11-28 Shadow Ninja 1 15 15 28 2025-11-28 Zombie Town 1 20 20 - 2
Ниже покажите итог каждого оплаченного заказа с именем его клиента:
order_id,ordered_at,nameклиента, количество экземпляров в заказе какcopiesи итог какtotal. Отсортируйте заказы поtotalот большего к меньшему, затем поorder_id:order_id ordered_at name copies total 11 2024-09-30 Liam Turner 2 85 14 2024-12-20 Emma Clark 2 75 5 2024-04-02 Noah Wilson 2 65 10 2024-08-23 Leo Walker 2 65 25 2025-10-10 Jack Harris 2 65 … … … … … - 3
Наконец, магазин хочет узнать, откуда берутся его деньги. Для каждого города покажите количество оплаченных заказов его клиентов как
order_countи их выручку какrevenue. Клиенты без города идут под значением'unknown': покажите город с помощьюCOALESCEкакcity. Осторожно: в заказе может быть несколько позиций, поэтому считайте заказы так, чтобы каждый был посчитан один раз. Отсортируйте города поrevenueот большего к меньшему, затем поcity:city order_count revenue London 11 500 Manchester 7 290 Leeds 4 210 Bristol 4 130 unknown 2 70