VIEW: сохранённые запросы
246 мин
Писать один и тот же сложный запрос каждый раз заново неудобно. VIEW (представление) — сохранённый запрос: к нему обращаются как к таблице, но сам он данных не хранит.
Создание
CREATE VIEW student_cards AS
SELECT s.id, s.first_name, s.last_name, g.name AS group_name, f.name AS faculty
FROM students s
JOIN study_groups g ON g.id = s.group_id
JOIN faculties f ON f.id = g.faculty_id;Теперь — как с таблицей:
SELECT * FROM student_cards WHERE faculty = 'Kiberxavfsizlik';При каждом обращении запрос внутри выполняется заново, поэтому результат всегда свежий.
Зачем это нужно
- простота — сложные JOIN пишутся один раз;
- безопасность — пользователю открывают не всю таблицу, а только VIEW (например, без столбца зарплаты);
- устойчивость — если структура таблиц изменится, достаточно поправить VIEW, и программы продолжат работать как прежде.
Изменение и удаление
CREATE OR REPLACE VIEW student_cards AS SELECT …;
DROP VIEW student_cards;Изменение данных через представление
Через простое VIEW (одна таблица, без группировки) можно делать и UPDATE — изменения попадут в исходную таблицу. VIEW с JOIN, GROUP BY, DISTINCT обычно только для чтения.
Материализованное представление
В PostgreSQL MATERIALIZED VIEW сохраняет результат — для очень тяжёлых отчётов:
CREATE MATERIALIZED VIEW monthly_revenue AS
SELECT date_trunc('month', ordered_at) AS month, count(*) FROM orders GROUP BY 1;
REFRESH MATERIALIZED VIEW monthly_revenue; -- обновитьЧтение быстрое, но результат остаётся старым, пока не выполнить REFRESH.
Упражнение
В свободном режиме загрузите готовую базу аптеки и создайте представление «каждая продажа: имя покупателя, название лекарства, сумма», а затем сделайте из него SELECT.
Запомните
- VIEW — именованный сохранённый запрос, данных не хранит.
- Упрощает сложные запросы и скрывает лишние столбцы.
- Материализованное VIEW (PostgreSQL) хранит результат и обновляется через
REFRESH.