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

Можете объяснить, что такое common table expressions (CTE) в SQL и для чего они используются?

Компании, где спрашивали
Почтатех

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

CTE — это именованное временное результирующее множество, которое используется внутри одного SQL-запроса. Оно помогает делать сложные запросы читаемее и разбивать логику на понятные шаги. Также CTE удобно использовать для рекурсивных запросов, например для обхода иерархий.

Определение:

Common Table Expression (CTE) — это выражение WITH, которое задаёт временную таблицу-результат на время выполнения одного SQL-оператора. CTE не сохраняется в базе данных и существует только в рамках текущего запроса. По сути, это способ вынести часть логики запроса в отдельный, именованный блок.

CTE используют, чтобы:

  • упростить сложные запросы;
  • избежать повторения одного и того же подзапроса;
  • сделать запросы понятнее и поддерживаемее;
  • реализовать рекурсивные сценарии.

Пример использования:

WITH ActiveUsers AS (
    SELECT Id, Name, CreatedAt
    FROM Users
    WHERE IsActive = 1
)
SELECT Name, CreatedAt
FROM ActiveUsers
ORDER BY CreatedAt DESC;

В этом примере сначала создаётся CTE ActiveUsers, а затем он используется как обычная таблица в основном запросе.

Пояснение кода:

Код показывает простой не рекурсивный CTE.

  1. В части WITH ActiveUsers AS (...) формируется временный набор данных.
  2. Внутри CTE выбираются только активные пользователи из таблицы Users.
  3. Основной SELECT обращается к ActiveUsers, как к обычной таблице.
  4. Затем результат сортируется по CreatedAt по убыванию.

Если нужен пример с рекурсией, CTE также позволяет строить запросы для дерева или списка подчинённости, но для базового понимания достаточно запомнить, что это именованный подзапрос для одного SQL-оператора.

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

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