В postgres есть возможность создавать представления, view представляют собой
результат запросов, который будет сохранен для переиспользования, представления
сохраняются в своем под пространстве имен, по сути представления это витрина с данными
выборки.
Представления созданные раз изменить нельзя.
Пример создания представления
CREATE VIEW view_name AS
SELECT name, title, count
FROM table_name
WHERE count > 1000
;- Повторное использование
SQL - После создания сложного запроса его можно легко использовать
- Вывод фрагментов таблицы в место всей таблицы
- Представления дают доступ к подмножеству таблиц, а не ко всем таблицам
- Представления могут изменять данные и выводить их не так как те хранятся в таблицах.
Созданные представления можно использовать и работать с ними как с реальными таблицами, фильтровать группировать и сортировать, объединять одни представления с другими представлениями.
Представления это виртуальные таблицы данные которых хранятся в других реальных таблицах, так что если реальные данные в таблицах изменятся то и изменятся данные возвращаемые самими представлениями.
-
Представления, как и таблицы должны иметь уникальные имена, и не должны пересекаются с реальными таблицами.
-
Можно создать сколько угодно представлений
-
Представления могут быть вложенными
-
Иногда запрещается использовать
ORDER BYфильтрацию в запросах представлений -
Иногда требуется использовать псевдонимы для возвращаемых столбцов
-
Представления нельзя индексировать и они не могут иметь триггеров
Предположим что у нас есть запрос что объединяет 3 таблицы, и получает данные
по условию WHERE.
SELECT name, contact
FROM Customers, Orders, OrderItem
WHERE Customers.cust_id = Orders.cust_id
AND OrderItem.order_num = Orders.order_num
AND prod_id = 'RGAN01';Теперь предположим что весь этот запрос можно сохранить в виде
Динамически сгенерированной таблицы ProductCustomers.
Тогда уже имея эту новую таблицу, можно извлечь из нее данные при помощи след запроса.
SELECT name, contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';Таблица ProductCustomers и называется представлением, она не хранит
столбцов с их описанием, в место этого она хранит сам запрос.
Создаются представления при помощи CREATE VIEW по аналогии с
CREATE TABLE. Такую инструкцию можно использовать только для
создания представления.
Удаления представления происходит при помощи DROP VIEW. Обновить
представление не получится так что просто удаляем его и создаем заново.
// Создаем представление
CREATE VIEW ProductCustomers AS
// Далее указываем просто сам запрос
SELECT name, contact, prod_id
FROM Customers, Orders, OrderItem
WHERE Customers.cust_id = Orders.cust_id
AND OrderItem.order_num = Orders.order_num;Эта команда создает представление с названием ProductCustomers. После этого если сделать запрос типа:
SELECT *
FROM ProductCustomers;То получим всех клиентов сделавших заказ, то есть в таблице ProductCustomers уже будут находиться все записи объединенные по условию:
WHERE Customers.cust_id = Orders.cust_id
AND OrderItem.order_num = Orders.order_num;Когда мы делаем извлечение данных из представления, то просто берется наше условие в SELECT и добавляется к условию выборки самого представления.
Также представления часто используются для изменения формата возвращаемых данных, к примеру:
SELECT CONCAT(vend_name || ' ( ' || vend_country ||' ) ' )
AS vend_title
FROM Vendors
ORDER BY vend_name;Данный запрос не просто измает данные и соединяет 2 поля в одно, так образ запрос вернет данные не в том формате в котором данные хранятся в таблице.
Создадим представление для этого запроса:
CREATE VIEW VendorLocatiob AS
SELECT CONCAT(vend_name || ' ( ' || vend_country ||' ) ' )
AS vend_title
FROM Vendors;В Postgres имеется уникальная особенность, при использовании CRUD операций на
представлении, при условии, что представление является простым, то есть в представлении
выборка происходит из одной единственной таблицы, то в таком случае все CRUD
операции направленные на представление будут переадресованы на оригинальной таблицу,
и все операции удаления, изменения ... будут применимы с реальной таблице в БД.
Простейшее представление:
CREATE VIEW view_name AS
SELECT *
FROM table_name
;Чем нам это может помочь, в postgres нет возможности изменить порядок уже
существующих столбцов в таблице, так же и нет возможности вставить новый столбец
в нужное место, все новые столбцы будут добавляться всегда только в конец таблицы.
В случае если нам требуется изменить порядок столбцов в таблице то вместо
пересоздания всей таблицы, мы можем создать на нее представление и использовать
его в место самой таблицы, благодаря уникальной фичи postgres с переадресацией,
это позволит не пересоздавая таблицу, работать с ней как если бы все столбцы были
в указанном порядке, и в то же время не сохраняется возможность CRUD операций над
таблицей.