Урок 9.3: Временные таблицы
В предыдущем уроке мы говорили о создании таблиц с помощью 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.
В следующем уроке мы рассмотрим, чем временные таблицы отличаются от представлений и в каких случаях лучше использовать каждый из этих инструментов.