Что такое общие табличные выражения (CTE) в SQL?

«Что такое общие табличные выражения (CTE) в SQL?» — вопрос из категории Базы данных, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Общие табличные выражения (CTE, Common Table Expressions) — это именованные временные результирующие наборы, которые определяются в рамках выполнения одного SQL-запроса (инструкции SELECT, INSERT, UPDATE, DELETE или MERGE). CTE существуют только на время выполнения этого запроса.

Ключевые особенности и синтаксис:

  • Определяются с помощью ключевого слова WITH.
  • Улучшают читаемость и поддерживаемость, позволяя разбивать сложные запросы на логические блоки.
  • Могут ссылаться на себя, что позволяет создавать рекурсивные запросы (например, для обхода иерархий).

Базовый пример (нерекурсивный CTE):

WITH HighValueOrders AS (
    -- Определение CTE
    SELECT OrderID, CustomerID, TotalAmount
    FROM Orders
    WHERE TotalAmount > 10000
)
-- Основной запрос, использующий CTE как обычную таблицу
SELECT 
    c.CustomerName,
    hvo.TotalAmount
FROM HighValueOrders hvo
JOIN Customers c ON hvo.CustomerID = c.CustomerID
ORDER BY hvo.TotalAmount DESC;

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

  1. Улучшенная читаемость: Заменяет вложенные подзапросы, делая логику запроса более линейной и понятной.
  2. Избегание дублирования: Если один и тот же подзапрос используется в запросе несколько раз, его можно вынести в CTE и ссылаться на него по имени.
  3. Рекурсивные запросы: Единственный стандартный SQL-способ для рекурсивной обработки данных (например, построение дерева подчинённых из таблицы сотрудников).

CTE — это мощный инструмент для структурирования запросов, особенно когда логика становится сложной.