theory_02__CTE.md
← К репозиторию занятия · 07__SubQuery__CTE/theory_02__CTE.md
CTE (Common Table Expression)
CTE (Общее табличное выражение) — это именованный временный результат запроса, который можно использовать в основном SQL-запросе.
CTE создаётся с помощью ключевого слова WITH и часто используется для улучшения читаемости, для рекурсивных запросов и для повторного использования логики.
✅ Синтаксис
WITH имя_cte (опциональные_поля) AS (
подзапрос
)
SELECT ...
FROM имя_cte;
Пример CTE
WITH recent_orders AS (
SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
)
SELECT customer_id, COUNT(*) AS order_count
FROM recent_orders
GROUP BY customer_id;
Здесь recent_orders — это временная "таблица", которая существует только во время выполнения запроса.
Преимущества и недостатки CTE
| Преимущество | Описание |
|---|---|
| Улучшает читаемость | Особенно для вложенных и многоступенчатых запросов |
| Повторное использование | Один и тот же подзапрос можно использовать несколько раз |
| Позволяет рекурсию | Поддержка WITH RECURSIVE для иерархических данных |
| Модулярность | Легко разбить сложную логику на части |
| Недостаток | Описание |
|---|---|
| Может быть менее эффективным | Иногда хуже оптимизируется, чем подзапросы или временные таблицы |
| Только во время выполнения | CTE нельзя сохранить — она существует только во время запроса |
Не всегда заменяет JOIN | Для некоторых задач JOIN даёт более эффективное решение |
Важное дополнение❗
Имейте в виду, что конструкция WITH всегда возвращает таблицу, даже если в ней содержится только одно значение. Поэтому извлекать это единственное значение из таблицы придётся отдельным запросом:
WITH avg_price AS (
SELECT AVG(unit_price) AS avg_p FROM order_details
)
SELECT
unit_price
FROM
order_details
WHERE unit_price > (SELECT avg_p FROM avg_price);