Занятие 25. Подзапросы
⚡ Кратко: решения
WHERE customer_id IN (SELECT id FROM customers WHERE city = 'Los Angeles')FROM (SELECT product_id, COUNT(*), SUM(...) FROM order_details GROUP BY product_id) AS psWHERE unit_price > (SELECT AVG(unit_price) FROM order_details)WHERE employee_id IN (SELECT id FROM employees WHERE job_title = 'Sales Representative')
✅ Решения заданий
Задание 1. Заказы клиентов из Лос-Анджелеса
USE northwind;
SELECT *
FROM orders
WHERE customer_id IN (
SELECT id FROM customers WHERE city = 'Los Angeles'
);
Объяснение: подзапрос возвращает множество id клиентов из Лос-Анджелеса. Внешний запрос выбирает заказы, чей customer_id входит в это множество.
Задание 2. Топ-10 продуктов
USE northwind;
SELECT p.product_name, ps.total_orders, ps.total_revenue
FROM (
SELECT product_id,
COUNT(*) AS total_orders,
SUM(unit_price * quantity) AS total_revenue
FROM order_details
GROUP BY product_id
) AS ps
JOIN products AS p ON ps.product_id = p.id
ORDER BY ps.total_orders DESC
LIMIT 10;
Объяснение: подзапрос в FROM готовит агрегат по каждому продукту. Внешний запрос присоединяет названия продуктов и сортирует по убыванию количества заказов.
Задание 3. Строки дороже средней цены
USE northwind;
SELECT *
FROM order_details
WHERE unit_price > (
SELECT AVG(unit_price) FROM order_details
);
Объяснение: скалярный подзапрос возвращает одно число — среднюю цену. Внешний запрос сравнивает каждую строку с этим значением.
Задание 4. Заказы Sales Representative
USE northwind;
SELECT *
FROM orders
WHERE employee_id IN (
SELECT id FROM employees WHERE job_title = 'Sales Representative'
);
Объяснение: многострочный подзапрос возвращает список id сотрудников с нужной должностью. Внешний запрос фильтрует заказы через IN.