SQL код скопирован в буфер обмена
EN PT FR

Урок 8.2: Временные таблицы

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

В отличие от обычных таблиц, временные таблицы не предназначены для постоянного хранения данных. Они создаются на ограниченное время и затем автоматически удаляются или становятся недоступны после завершения сессии.

Что такое временная таблица

Временная таблица — это таблица, которая создается для временного хранения данных во время работы пользователя или выполнения скрипта.

Обычно такие таблицы:

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

Во многих СУБД временные таблицы создаются с помощью ключевого слова TEMPORARY или TEMP.

Базовый синтаксис

Один из распространенных вариантов создания временной таблицы выглядит так:

CREATE TEMPORARY TABLE table_name (
    column1 data_type,
    column2 data_type,
    column3 data_type
);

После этого с временной таблицей можно работать почти так же, как и с обычной: вставлять данные, выбирать их, обновлять и удалять.

Пример создания временной таблицы

Допустим, мы хотим сохранить список клиентов, которые сделали более 30 оплат:

CREATE TEMPORARY TABLE active_customers AS
SELECT customer_id, COUNT(*) AS payment_count
FROM payment
GROUP BY customer_id
HAVING COUNT(*) > 30;

Теперь мы можем использовать эту временную таблицу в следующих запросах:

SELECT ac.customer_id, ac.payment_count, c.first_name, c.last_name
FROM active_customers ac
JOIN customer c ON ac.customer_id = c.customer_id
ORDER BY ac.payment_count DESC;

Результат: мы получим список активных клиентов и сможем повторно использовать уже подготовленный набор данных без повторного выполнения исходной агрегации.


Чем временная таблица отличается от обычной

Хотя временные и обычные таблицы похожи по структуре, между ними есть несколько важных различий.

1. Срок жизни

  • Обычная таблица хранится в базе постоянно, пока вы явно ее не удалите.
  • Временная таблица существует ограниченное время: обычно до конца сессии или транзакции.

2. Назначение

  • Обычная таблица используется для постоянного хранения бизнес-данных.
  • Временная таблица используется для промежуточных, технических или подготовительных данных.

3. Область видимости

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

4. Практическое применение

  • Обычная таблица хранит клиентов, заказы, товары, платежи и другую основную информацию.
  • Временная таблица хранит результаты промежуточной фильтрации, агрегации или подготовки данных для отчета.

Когда временные таблицы особенно полезны

Временные таблицы стоит использовать, если:

  • запрос слишком сложный и его удобнее разбить на этапы;
  • один и тот же промежуточный результат нужен несколько раз;
  • требуется временно сохранить очищенные или агрегированные данные;
  • нужно упростить чтение и поддержку SQL-скрипта.

Например, сначала можно собрать временную таблицу с нужными фильмами, а затем отдельно рассчитать метрики только по ним.

CREATE TEMPORARY TABLE expensive_films AS
SELECT film_id, title, rental_rate
FROM film
WHERE rental_rate >= 4.00;

SELECT COUNT(*) AS film_count, AVG(rental_rate) AS avg_rate
FROM expensive_films;

Результат: логика разделена на два понятных шага — подготовка набора данных и его анализ.


Временная таблица и обычный CTE

Иногда вместо временной таблицы можно использовать CTE (WITH). Разница в том, что:

  • CTE существует только в рамках одного запроса;
  • временная таблица может использоваться в нескольких запросах в течение сессии;
  • CTE удобен для компактной логики внутри одного SQL-выражения;
  • временная таблица удобна, если промежуточный результат нужен повторно.

Если результат нужен только один раз, CTE часто проще. Если его нужно использовать в нескольких шагах, временная таблица обычно удобнее.


На что стоит обращать внимание

При работе с временными таблицами полезно помнить несколько правил:

  • не используйте их там, где достаточно одного простого запроса;
  • давайте временным таблицам понятные имена, отражающие их назначение;
  • следите за тем, когда именно таблица будет удалена в вашей СУБД;
  • не храните во временных таблицах данные дольше, чем это реально нужно;
  • проверяйте особенности синтаксиса в конкретной СУБД, так как поведение TEMPORARY TABLE может отличаться.

Хорошо использованная временная таблица делает сложный SQL более читаемым и управляемым.


Пример из практики

Представим, что нам нужно найти клиентов, которые брали фильмы из категории Action, а затем построить по ним отдельный отчет.

CREATE TEMPORARY TABLE action_customers AS
SELECT DISTINCT r.customer_id
FROM rental r
JOIN inventory i      ON r.inventory_id = i.inventory_id
JOIN film_category fc ON i.film_id = fc.film_id
JOIN category c       ON fc.category_id = c.category_id
WHERE c.name = 'Action';

SELECT ac.customer_id, cu.first_name, cu.last_name
FROM action_customers ac
JOIN customer cu ON ac.customer_id = cu.customer_id
ORDER BY cu.last_name, cu.first_name;

Такой подход особенно удобен, если после этого списка нужно выполнить еще несколько отдельных аналитических запросов.


Ключевые выводы этого урока:

  • Временные таблицы используются для временного хранения промежуточных данных.
  • Обычно они существуют только в рамках текущей сессии или транзакции.
  • По синтаксису и работе они похожи на обычные таблицы, но не предназначены для постоянного хранения данных.
  • Временные таблицы особенно полезны в сложных многошаговых запросах и аналитических сценариях.
  • Если промежуточный результат нужен только в одном запросе, иногда лучше использовать CTE.

В следующем уроке мы рассмотрим, чем временные таблицы отличаются от представлений и в каких случаях лучше использовать каждый из этих инструментов.