Представления (VIEW)
Прячем сложные запросы за простым именем с помощью представлений.
Представление (VIEW) — это сохранённый запрос, к которому обращаются как к таблице; оно не хранит данные, а вычисляет их при каждом обращении.
Зачем нужны представления
Когда один и тот же сложный SELECT с несколькими JOIN повторяется в десятках мест, его удобно один раз спрятать за именем. Представление даёт три выгоды: переиспользование (один запрос — много обращений), упрощение (читателю видна простая «таблица») и безопасность (можно показать только часть столбцов).
Создание представления
Сначала переносимый пример: создадим таблицы и сделаем «представление» через обычный запрос, чтобы увидеть результат в песочнице.
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
client TEXT,
amount INTEGER,
status TEXT
);
INSERT INTO orders (id, client, amount, status) VALUES
(1, 'Анна', 500, 'paid'),
(2, 'Борис', 300, 'pending'),
(3, 'Анна', 800, 'paid'),
(4, 'Вера', 200, 'paid');
-- Логика будущего представления «оплаченные заказы по клиентам»
SELECT client, SUM(amount) AS paid_total
FROM orders
WHERE status = 'paid'
GROUP BY client
ORDER BY paid_total DESC;
Вывод:
Анна|1300 Вера|200
Этот запрос мы и «завернём» в представление. В реальном PostgreSQL это делается одной командой:
CREATE VIEW paid_by_client AS
SELECT client, SUM(amount) AS paid_total
FROM orders
WHERE status = 'paid'
GROUP BY client;
-- Теперь обращаемся как к таблице:
SELECT * FROM paid_by_client WHERE paid_total > 500;
Каждое обращение к paid_by_client заново выполняет лежащий внутри запрос на свежих данных. Представление всегда актуально, но за это платим вычислением при каждом обращении.
Материализованные представления
Если запрос тяжёлый (агрегирует миллионы строк), пересчитывать его каждый раз дорого. MATERIALIZED VIEW вычисляет запрос один раз и сохраняет результат на диск, как таблицу-снимок.
CREATE MATERIALIZED VIEW daily_revenue AS
SELECT status, SUM(amount) AS total
FROM orders
GROUP BY status;
-- Данные «застыли» на момент создания. Обновить вручную:
REFRESH MATERIALIZED VIEW daily_revenue;
| Свойство | VIEW | MATERIALIZED VIEW |
| Хранит данные | нет, считает на лету | да, снимок на диске |
| Актуальность | всегда свежая | до следующего REFRESH |
| Скорость чтения | как у запроса | быстрая (читает готовое) |
Когда что выбирать
- Обычный VIEW — когда важна актуальность и запрос не слишком тяжёлый: отчёты, удобные «срезы», скрытие сложности.
- MATERIALIZED VIEW — для тяжёлой аналитики, которую достаточно обновлять по расписанию (например, дашборд раз в час).
Итог
- Представление — сохранённый запрос; обращение к нему выполняет логику заново на свежих данных.
- VIEW упрощает код, переиспользует запросы и ограничивает видимость столбцов; данные не хранит.
MATERIALIZED VIEWхранит результат-снимок на диске и обновляется поREFRESH— быстро, но не всегда свежо.