# 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);
```