Sobes.tech
Назад к вопросам
Junior — Middle
44

Можешь привести пример использования временной таблицы с помощью выражения общего табличного выражения (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.

По шагам:

  1. Отбираются активные клиенты.
  2. Отбираются заказы за последний месяц.
  3. Подсчитывается количество заказов по каждому клиенту.
  4. Два промежуточных результата объединяются в финальном запросе.

Ключевые моменты:

  • CTE объявляется через WITH и используется только в рамках одного SQL-оператора.
  • Он помогает разбивать сложные запросы на понятные части.
  • CTE удобен для повторного использования промежуточного результата внутри запроса.
  • Это не физическая временная таблица: данные обычно не сохраняются отдельно и не живут дольше запроса.
  • CTE особенно полезен для многошаговой аналитики, агрегаций и рекурсивных запросов.