Create View

Представление View — это виртуальная таблица, оформленная в виде запроса типа SELECT, который будет подставлен как подзапрос при использовании View.

В отличие от обычных таблиц реляционных СУБД, виртуальная таблица View не является самостоятельной частью набора данных, хранящегося в базе. Содержимое представления формируется динамически на основании данных, находящихся в реальных таблицах. Изменение данных в реальных таблицах отражается в содержимом всех представлений, использующих эти таблицы в своих запросах.

Описание View для СУБД, поддерживающих язык запросов SQL, представляет собой запрос. Поэтому, содержимое представления — это результат выполнения данного запроса. Так, для типичных СУБД типа Oracle, MSSQL, PostgreSQL, Interbase, Firebird, MySQL, Derby представление может содержать :

  • подмножество записей из одной или нескольких таблиц, отвечающие определённым условиям. К примеру, при наличии одной таблицы «Заказы» можно создать два представления : «Список товаров/услуг» и «Стоимость заказов», в каждом из которых будут только соответствующая информация : либо список отпущенных товаров, либо сумма оплаченная за товары сумма;
  • подмножество столбцов из одной или нескольких таблиц. Например, из таблицы «Заказчики» представление может извлекать только информацию о клиенте в виде наименования компании, менеджере компании и его телефоне;
  • результат обработки данных таблицы. Например, текстовые значения реальной таблицы могут быть приведены в верхний или нижний регистр, либо на основании цены и количества вычислена общая стоимость товара в определенной позиции и т.д.;
  • результат соединения (join) нескольких таблиц;
  • результат объединения (union) нескольких таблиц;

Создание представления, CREATE VIEW

Для создания представления необходимо использовать команду CREATE VIEW, включающую необязательное наименования схемы (schema_name), наименование представления, необязательные наименования колонок (column_name) ключевое слова AS и далее текст SQL-запроса :

CREATE VIEW [schema_name.]view_customers [(column_name [, …])]
 AS 
    select name, address, phone
       from [schema.]customers
          [where city = 'Moscow']; 
    [WITH CHECK OPTION]

Схема, в которой создается представление VIEW, может отличаться от схемы с таблицей/ами, определенными в запросе. В этом случае необходимо помнить, что пользователи данного представления должны иметь доступ ко всем "представленным" во View объектам. SQL-запрос представления может включать не только таблицы и условия "where", но также и другие представления.

Выражение WITH CHECK OPTION предназначено для предварительного выполнения проверки, если SQL-запрос представления включает определенные условия и используется для внесения изменений в основную таблицу.

Представление можно использовать в тексте SQL-запроса как обычную таблицу.

-- запрос без дополнительных условий
select * from view_customers;

-- запрос с дополнительными условиями
select name, phone 
  from view_customers
    where address like '%ВДНХ%';  

SQL представление с подзапросами

Представление VIEW может включать подзапросы. В качестве примера рассмотрим задачу определения в компании менеджеров, заказы которых превысили определенную сумму (50000) :

CREATE VIEW view_managers 
  AS 
    select o.odate, o.order_id, o.total, m.manager_id, m.name
      from orders o, managers m
         where m.manager_id = o.manager_id and
               o.order_id in (select order_id
                                from orders c 
                                  where c.odate = o.odate and
                                        c.total > 50000); 

Теперь, если потребуется определить менеджера с самым высоким заказом в определенный период времени, то можно использовать простой запрос с включением в него VIEW :

select odate, manager_id, name, MAX(total)
  from view_managers m
    where m.odate between '2015-01-01' and '2015-12-31' 
	group by odate, manager_id, name;

SQL представление с группировкой данных

Записи в запросе представления VIEW можно сгруппировать, получив, таким образом, групповое представление. В качестве примера можно рассмотреть представление, формирующего статистическую информацию :

CREATE VIEW stat_orders
  select odate, MAX(total), MIN(total), AVG(total), SUM(total), COUNT (order_id)
    from orders 
      group by odate;

Использование данного VIEW позволяет получить всю статистическую информацию по заказам за день :

select * from stat_orders; 

Представления предоставляют чрезвычайно гибкий и мощный инструмент для определения порядка использования данных. Кроме этого, VIEW позволяют облегчить работу более простым, переформатированием данных.

Удаление представления, DROP View

Синтаксис удаления представления из базы данных включает ключевые слова DROP VIEW. При необходимости нужно указать наименование схемы :

DROP VIEW [schema_name.]view_name

Следует помнить, что для удаления представления нужно иметь соответствующие права.

Изменение значений с помощью VIEW

Команды изменения значений в таблицах базы данных DML (Insert, Update, Delete) можно использовать и с представлениями. Но не все представления позволяют сделать это. Основные критерии, по которым можно сказать, что с помощью данного представления можно модифицировать данные, следующие:

  • запрос представления использует только одну базовую таблицу;
  • в запрос включены поля первичного ключа таблицы;
  • запрос не содержит никаких полей, которые бы являлись агрегатными функциями, константами или выражениями;
  • в запросе не должны использоваться ключевые слова DISTINCT, GROUP BY или HAVING;
  • в запросе не должны быть использованы подзапросы;
  • для вставки INSERT представление должно содержать любые поля таблицы которые имеют ограничение NOT NULL, если другое ограничение по умолчанию, не определено.

Примеры CREATE VIEW

-- Представление только для чтения, т.к. присутствует GROUP BY
CREATE VIEW view_orders (odate, total) 
  AS select odate, SUM (total) as total
      from orders 
        group by odate; 

-- Представление позволяет модифицировать данные
CREATE VIEW view_customers 
  AS select * from customers 
       where country = 'Germany';

-- Представление только для чтения, т.к. присутствует выражение в последнем поле 
CREATE VIEW managers_tver
  AS select id, name, num, comm * 100 
      from managers 
        where city = 'Tver'; 

Проверка значения при модификации

В следующем примере представление делает выборку записей заказов, в которых сумма превышает заданное значение (5000) :

CREATE VIEW order_5000
  AS select order_id, odate, onumber, total
    from orders 
      where total > 5000; 

Данное представление ограничивает доступ к определенным заказам в таблице и позволяет модифицировать данные. Для вставки записи необходимо использовать следующий SQL-скрипт :

INSERT INTO order_5000 
   VALUES (123456, '2015-11-23', '20151123/24', 2000); 

Данный скрипт будет выполнен и запись будет добавлена в таблицу. Однако с помощью данного представления "order_5000" мы это не увидим, т.к. данная запись не попадет в результирующий набор в виду ограничения на значение поля "total". Чтобы гарантировать выполнение проверки значений перед записью следует в скрипте создания представления использовать ключевое выражение WITH CHECK OPTION, т.е. с опцией проверки.

Вышеупомянутая вставка будет отклонена следующим VIEW :

CREATE VIEW order_5000_check
  AS select order_id, odate, onumber, total
    from orders 
      where total > 5000
  WITH CHECK OPTION;

Необходимо отметить, что выражение WITH CHECK OPTION не делает каскадированного изменения. Оно применяется только в представлениях в которых оно определено, но не в представлениях основанных на этом представлении.

Исключенные поля представления

Необходимо быть аккуратным при использовании представления с условиями для вставки записей. Рассмотрим такое представление, в котором поле страны "country" отсутствует.

CREATE VIEW customers_germany
  AS select id, name, address, phone from customers 
       where country = 'Germany';

Внешне все нормально и представление можно использовать для внесения изменений в записи таблицы. Но вот как быть с "country", которое отсутствует в полях набора? Что будет при вставке записи через данное представление, если "country" не допускает ввода нулевых (NULL) значений? А как вообще управлять этим полем "country" в основной таблице, не создавать же под каждую страну свое представление. Ответа на данные вопросы не последует, они очевидные. Полагаю, что Вы не будете создавать подобные представления, которые будут Вас ограничивать при выполнении определенных транзакций.

  Рейтинг@Mail.ru