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

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

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

⚡ Кратко: суть темы

Повторяем подзапросы и CTE. Подзапросы делят запрос на части; CTE дают имена временным результатам.

  • Скалярный подзапрос — одно значение; многострочный — список.
  • CTE объявляется через WITH имя AS (SELECT ...).
  • CTE vs подзапрос: читаемость против простоты.

📖 Что такое подзапрос

Подзапрос (или вложенный запрос) — это оператор SELECT, размещённый внутри другого SQL-оператора. Внешний запрос использует результат подзапроса для фильтрации, агрегации или как временную таблицу.

SELECT *
FROM orders
WHERE customer_id IN (
    SELECT id FROM customers WHERE city = 'Los Angeles'
);

📖 Типы подзапросов

По возвращаемому значению

  • Скалярный (однострочный) — возвращает одно значение. Используется с =, <>, >, <.
  • Многострочный — возвращает набор строк. Используется с IN, ANY, ALL, EXISTS.

По месту использования

  • Подзапрос в WHERE — фильтрует строки внешнего запроса.
  • Подзапрос в FROM — создаёт временный набор данных для агрегации.

📖 Подзапросы в WHERE и FROM

В WHERE

SELECT *
FROM order_details
WHERE unit_price > (
    SELECT AVG(unit_price) FROM order_details
);

В FROM

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;

📖 Common Table Expression

CTE — это конструкция SQL, которая позволяет создать временный набор данных и использовать его в основном запросе по имени. CTE объявляется с помощью ключевого слова WITH.

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

  • Улучшение читаемости.
  • Повторное использование логики.
  • Упрощение сложных операций.

📖 CTE vs подзапросы

Критерий CTE Подзапрос
Читаемость Высокая, особенно в сложных запросах Хороша в простых случаях
Повторное использование Можно ссылаться несколько раз Нужно дублировать код
Область видимости Только текущий запрос Локально в месте использования
Простота Требует имени и WITH Минимум синтаксиса
Проверить по документации: производительность CTE и эквивалентных подзапросов в современных СУБД часто совпадает, но зависит от версии и оптимизатора.