В предыдущем уроке мы говорили о создании таблиц с помощью 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;
Результат: мы получим список активных клиентов и сможем повторно использовать уже подготовленный набор данных без повторного выполнения исходной агрегации.
Хотя временные и обычные таблицы похожи по структуре, между ними есть несколько важных различий.
Временные таблицы стоит использовать, если:
Например, сначала можно собрать временную таблицу с нужными фильмами, а затем отдельно рассчитать метрики только по ним.
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 (WITH). Разница в том, что:
Если результат нужен только один раз, 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;
Такой подход особенно удобен, если после этого списка нужно выполнить еще несколько отдельных аналитических запросов.
Ключевые выводы этого урока:
В следующем уроке мы рассмотрим, чем временные таблицы отличаются от представлений и в каких случаях лучше использовать каждый из этих инструментов.