В базе данных представление — это набор результатов сохраненного запроса , который представляет ограниченную перспективу базы данных для пользователя. [1] Эта предустановленная команда запроса хранится в словаре данных . В отличие от обычных базовых таблиц в реляционной базе данных представление не является частью физической схемы : как набор результатов, это виртуальная таблица [1], вычисляемая или сопоставляемая динамически из данных в базе данных, когда запрашивается доступ к этому представлению. Изменения, применяемые к данным в соответствующей базовой таблице, отражаются в данных, отображаемых при последующих вызовах представления.
Представления могут обеспечить преимущества по сравнению с таблицами:
Так же, как функция (в программировании) может предоставлять абстракцию , так же может и представление базы данных. В другой параллели с функциями пользователи базы данных могут манипулировать вложенными представлениями, таким образом, одно представление может агрегировать данные из других представлений. Без использования представлений нормализация баз данных выше второй нормальной формы стала бы намного сложнее. Представления могут облегчить создание декомпозиции соединения без потерь.
Так же, как строки в базовой таблице не имеют определенного порядка, строки, доступные через представление, не отображаются с какой-либо сортировкой по умолчанию. Представление — это реляционная таблица, а реляционная модель определяет таблицу как набор строк. Поскольку наборы не упорядочены — по определению — то же самое касается и строк представления. Следовательно, предложение ORDER BY в определении представления бессмысленно; стандарт SQL ( SQL:2003 ) не допускает предложение ORDER BY в подзапросе команды CREATE VIEW, так же как оно отклонено в операторе CREATE TABLE. Однако отсортированные данные могут быть получены из представления, так же как и из любой другой таблицы — как часть оператора запроса к этому представлению. Тем не менее, некоторые СУБД (например, Oracle Database ) не соблюдают это ограничение стандарта SQL.
Представления могут быть определены как доступные только для чтения или обновляемые. Если система базы данных может определить обратное отображение из схемы представления в схему базовых таблиц, то представление является обновляемым. Операции INSERT , UPDATE и DELETE могут выполняться над обновляемыми представлениями. Представления только для чтения не поддерживают такие операции, поскольку СУБД не может сопоставить изменения с базовыми таблицами. Обновление представления выполняется путем сохранения ключей.
Некоторые системы поддерживают определение триггеров INSTEAD OF в представлениях. Этот метод позволяет определять другую логику для выполнения вместо операции вставки, обновления или удаления в представлениях. Таким образом, системы баз данных могут реализовывать изменения данных на основе представлений только для чтения. Однако триггер INSTEAD OF не изменяет свойство только для чтения или обновляемости самого представления.
Различные системы управления базами данных расширили представления из подмножеств данных , доступных только для чтения, в частности, материализованные представления : предварительно выполненные, невиртуальные представления, обычно используемые в хранилищах данных . Они дают статический снимок данных и могут включать данные из удаленных источников. Точность материализованного представления зависит от частоты запускающих механизмов, стоящих за его обновлениями.
Материализованные представления были введены Oracle Database , в то время как IBM Db2 предоставляет так называемые «материализованные таблицы запросов» (MQT) для той же цели. Microsoft SQL Server ввел в своей версии 2000 индексированные представления, которые хранят только отдельный индекс из таблицы, но не все данные. PostgreSQL реализовал материализованные представления в своей версии 9.3.
Представление эквивалентно исходному запросу. Когда запросы выполняются по представлениям, запрос изменяется. Например, если существует представление с именем accounts_view со следующим содержимым:
-- accounts_view : ------------- ВЫБРАТЬ имя , получено_денег , отправлено_денег , ( получено_денег - отправлено_денег ) КАК баланс , адрес , ... ИЗ table_customers c ПРИСОЕДИНИТЬ accounts_table a К a.customer_id = c.customer_id
то приложение может выполнить простой запрос, например:
-- Простой запрос ------------ ВЫБРАТЬ имя , баланс ИЗ accounts_view
-- Предварительно обработанный запрос : ------------------ SELECT имя , баланс FROM ( SELECT имя , money_received , money_sent , ( money_received - money_sent ) AS баланс , адрес , ... FROM table_customers c JOIN accounts_table a ON a.customer_id = c.customer_id )
Затем оптимизатор удаляет ненужные поля и усложняет задачу (например, нет необходимости считывать адрес, поскольку родительский вызов его не использует), а затем отправляет запрос в SQL-движок для обработки.
Представления — это сохраненные запросы, которые при вызове производят набор результатов. Представление действует как виртуальная таблица.