← К оглавлению занятия

Занятие 28. Summary session 7

📁 Блок: SQL / MySQL / Подзапросы и CTE ⏱️ Время изучения: ~60 мин 🎯 Сложность: Повторение
#in #where #select #from #as #join #null

⚡ Кратко: домашнее задание

  • Продукты и количество заказанных единиц — подзапрос и CTE.
  • Заказы после первого заказа клиента Lee.
  • Продукты с максимальным target_level.

🏠 Домашнее задание

Все задания выполняются в базе northwind. Это домашнее задание занятия 26 с разбором решений.

Задание 1. Продукты и количество заказанных единиц

Выведите названия продуктов из таблицы products, включая количество заказанных единиц quantity для каждого продукта из таблицы order_details. Решите задачу с помощью подзапроса и CTE.

Решение через подзапрос

USE northwind;

SELECT p.product_name, a.total_quantity
FROM products AS p
LEFT JOIN (
    SELECT product_id, SUM(quantity) AS total_quantity
    FROM order_details
    GROUP BY product_id
) AS a ON p.id = a.product_id;

Решение через CTE

USE northwind;

WITH a AS (
    SELECT product_id, SUM(quantity) AS total_quantity
    FROM order_details
    GROUP BY product_id
)
SELECT p.product_name, a.total_quantity
FROM products AS p
LEFT JOIN a ON p.id = a.product_id;

Задание 2. Заказы после первого заказа клиента Lee

Найдите все заказы из таблицы orders, сделанные после даты самого первого заказа клиента Lee из таблицы customers.

Решение через подзапрос

USE northwind;

SELECT *
FROM orders
WHERE order_date > (
    SELECT MIN(order_date)
    FROM orders
    JOIN customers ON orders.customer_id = customers.id
    WHERE customers.last_name = 'Lee'
    GROUP BY customers.last_name
);

Решение через CTE

USE northwind;

WITH min_date AS (
    SELECT MIN(order_date) AS min_date
    FROM orders
    JOIN customers ON orders.customer_id = customers.id
    WHERE customers.last_name = 'Lee'
    GROUP BY customers.last_name
)
SELECT *
FROM orders
WHERE order_date > (SELECT min_date FROM min_date);

Задание 3. Продукты с максимальным target_level

Найдите все продукты из таблицы products, у которых target_level равен максимальному значению target_level в таблице.

Решение через подзапрос

USE northwind;

SELECT *
FROM products
WHERE target_level = (
    SELECT MAX(target_level) FROM products
);

Решение через CTE

USE northwind;

WITH max_level AS (
    SELECT MAX(target_level) AS ml FROM products
)
SELECT *
FROM products
WHERE target_level = (SELECT ml FROM max_level);
Проверить по документации: точные имена столбцов в схеме northwind могут отличаться. Адаптируйте запросы под реальные названия таблиц и полей.