Статья основана на 24 видео из 30 тем курса SQL c 0 от Аристова Евгения. Ссылки на видео на платформах RUTUBE и VK видео.
Ранее мы уже разбирали разные объекты в PostgreSQL – Database, Scheme, Table. Сегодня рассмотрим один из видов Relation – VIEW.
VIEW
VIEW (по-русски – представление) – это именованный запрос, который выполняется каждый раз при обращении к нему. Используется во избежание дублирования кода.
Для СУБД нет разницы, что именно указано в графе FROM – TABLE или VIEW. Соответственно, имена таблиц и представлений не могут совпадать. Также из одного VIEW можно вызывать другой.
Синтаксис VIEW:
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ]
[WITH ( view_option_name [= view_option_value] [, ... ] )]
AS query
[WITH [ CASCADED | LOCAL ] CHECK OPTION]
Практика
Создадим таблицу Склад и добавим туда значения:
CREATE TABLE warehouse (
id serial UNIQUE,
name text NOT NULL DEFAULT '',
kolvo int NOT NULL DEFAULT 0,
price numeric NOT NULL DEFAULT 0.0,
salesTime timestamp with time zone NOT NULL DEFAULT current_timestamp, -- UTC
salesTime2 timestamp NOT NULL DEFAULT current_timestamp
);
INSERT INTO warehouse (name,kolvo,price) VALUES
('apple',10,10.2),
('grape',20,'20.2'),
('grape',100,'20.2');

Создадим представление asta из двух полей, выведем его:
CREATE VIEW asta AS SELECT 1 as id, 'Hello' as hello;
SELECT *
FROM asta;

Теперь создадим представление vista из тех же двух полей, но укажем конкретный тип поля, выведем его:
CREATE VIEW vista AS SELECT 1 as id, text 'World' AS world;
SELECT *
FROM vista;

Так как результат вызова VIEW – по сути таблица, с ней можно выполнять стандартные действия, например, JOIN:
SELECT a.hello || ', ' || v.world
FROM asta a
JOIN vista v
ON a.id=v.id;

Колонка не получила названия, так как мы не указали AS.
Создадим представление, вызывающее другое представление. Вызовем его:
CREATE VIEW vista2 AS select world || '!' from vista;
SELECT *
FROM vista2;

Преимущество VIEW – внутри него полям можно дать короткие имена, а затем использовать их при обращении к этому VIEW:
CREATE VIEW v AS
SELECT name AS n, sum(kolvo)
FROM warehouse
GROUP BY name;
Вызовем представление v:
SELECT *
FROM v;

Обратимся к полям представления v:
CREATE VIEW v2 AS
SELECT n
FROM v;
Вызовем представление v2:
SELECT *
FROM v2;

Добавим новую строчку в таблицу:
INSERT INTO warehouse(name,kolvo,price) VALUES
('banana',10,10.2);

Проверим, что VIEW действительно выполняется заново каждый раз (то есть данные в нем обновились):
SELECT *
FROM v2;

Презентация к статье здесь.
25 из 30 тем будет скоро доступна. Если вы хотите быстрее получить доступ – присоединяйтесь к онлайн группе, ссылка доступна в описании курса.
Добавить комментарий