Можешь привести пример использования временной таблицы с помощью выражения общего табличного выражения (CTE) в SQL?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
CTE — это удобный способ вынести промежуточный результат запроса в именованный блок и использовать его внутри одного SQL-оператора. Это не полноценная временная таблица, а скорее читаемая и локальная подзапросная конструкция. Обычно CTE применяют, чтобы упростить сложные запросы, разбить логику на шаги и избежать повторения одного и того же подзапроса.
Определение:
CTE (Common Table Expression, выражение общего табличного выражения) — это временно именованный набор данных, который существует только в рамках одного SQL-запроса. Его объявляют через WITH, а затем используют как обычную таблицу в SELECT, INSERT, UPDATE или DELETE.
В отличие от физической временной таблицы, CTE обычно не создаётся отдельно в базе и не живёт между запросами. Его основная задача — сделать SQL понятнее и структурированнее.
Пример использования:
Допустим, нужно сначала отобрать активных клиентов, а потом посчитать их заказы за последний месяц.
WITH active_customers AS (
SELECT id, name
FROM customers
WHERE status = 'active'
),
monthly_orders AS (
SELECT customer_id, COUNT(*) AS orders_count
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY customer_id
)
SELECT
ac.id,
ac.name,
COALESCE(mo.orders_count, 0) AS orders_count
FROM active_customers ac
LEFT JOIN monthly_orders mo
ON mo.customer_id = ac.id
ORDER BY orders_count DESC;
Пояснение кода:
Код показывает два CTE, которые используются как промежуточные “виртуальные таблицы”.
Сначала active_customers выбирает только клиентов со статусом active. Затем monthly_orders агрегирует заказы за последние 30 дней и считает количество заказов по каждому клиенту. После этого основной запрос соединяет оба результата по customer_id и выводит список активных клиентов с числом заказов, включая тех, у кого заказов не было — для них COALESCE подставляет 0.
По шагам:
- Отбираются активные клиенты.
- Отбираются заказы за последний месяц.
- Подсчитывается количество заказов по каждому клиенту.
- Два промежуточных результата объединяются в финальном запросе.
Ключевые моменты:
- CTE объявляется через
WITHи используется только в рамках одного SQL-оператора. - Он помогает разбивать сложные запросы на понятные части.
- CTE удобен для повторного использования промежуточного результата внутри запроса.
- Это не физическая временная таблица: данные обычно не сохраняются отдельно и не живут дольше запроса.
- CTE особенно полезен для многошаговой аналитики, агрегаций и рекурсивных запросов.