Занятие 28. Summary session 7
⚡ Кратко: суть темы
Повторяем подзапросы и 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 и эквивалентных подзапросов в современных СУБД часто совпадает, но зависит от версии и оптимизатора.