Занятие 28. Summary session 7
⚡ Кратко: примеры
- Скалярный и многострочный подзапросы.
- CTE для средней цены и фильтрации.
- Сотрудники без привилегий через LEFT JOIN.
💻 Рабочие примеры
Пример 1. Скалярный подзапрос
USE northwind;
SELECT *
FROM order_details
WHERE unit_price > (
SELECT AVG(unit_price) FROM order_details
);
Подзапрос возвращает одно число — среднюю цену. Внешний запрос сравнивает каждую строку с этим значением.
Пример 2. Многострочный подзапрос
USE northwind;
SELECT *
FROM orders
WHERE employee_id IN (
SELECT id FROM employees WHERE job_title = 'Sales Representative'
);
Подзапрос возвращает список идентификаторов. Внешний запрос фильтрует заказы через IN.
Пример 3. Подзапрос в FROM
USE northwind;
SELECT p.product_name, ps.total_orders
FROM (
SELECT product_id, COUNT(*) AS total_orders
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 готовит агрегат; внешний запрос подтягивает названия продуктов.
Пример 4. CTE для средней цены
USE northwind;
WITH avg_price AS (
SELECT AVG(unit_price) AS ap FROM order_details
)
SELECT *
FROM order_details
WHERE unit_price > (SELECT ap FROM avg_price);
CTE выделяет вычисление среднего ценового значения в отдельный именованный блок.
Пример 5. Сотрудники без привилегий
USE northwind;
SELECT e.first_name, e.last_name
FROM employees AS e
LEFT JOIN employee_privileges AS ep ON e.id = ep.employee_id
WHERE ep.employee_id IS NULL;
LEFT JOIN сохраняет всех сотрудников; фильтр IS NULL оставляет только тех, у кого нет привилегий.