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

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

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

⚡ Кратко: примеры

  • Скалярный и многострочный подзапросы.
  • 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 оставляет только тех, у кого нет привилегий.