Глава 15. Создание обзора

Обзор — это способ представить вычисляемую информацию как если бы она хранилась в таблице. Можно, создав обзор, обращаться к нему как к таблице с помощью запросов SELECT. Сами по себе обзоры на содержат данных, однако содержат сведения, как эти данные вычислить и представить как таблицу. Можно представлять себе обзор как сохранённый на стороне сервера запрос SELECT.

Создадим обзор planet_info, включающий все колонки таблицы planet, а также вычисляемую колонку density:

test54=# CREATE OR REPLACE VIEW planet_info
test54-# AS SELECT *, 1E-9*6*mass/3.1415926/diameter^3 AS density
test54-# FROM planet
test54-# ORDER BY orbit;
CREATE VIEW
test54=# SELECT * FROM planet_info;
   name   | token | diameter |    mass    | orbit  |     density      
----------+-------+----------+------------+--------+------------------
 Меркурий | ☿     |     4880 |    3.3e+23 |   0.38 | 5423.20300055831
 Венера   | ♀     |  12103.6 |  4.869e+24 |   0.72 | 5244.42083382882
 Земля    | ♁     |  12756.3 | 5.9736e+24 |      1 |  5496.2105803137
 Марс     | ♂     |     6794 | 6.4219e+23 |   1.52 | 3911.00452011731
 Юпитер   | ♃     |   142984 |    1.9e+27 |    5.2 | 1241.34547590606
 Сатурн   | ♄     |   120536 |   5.68e+26 |   9.54 | 619.440218250837
 Уран     | ♅     |    51118 |  8.683e+25 | 19.218 | 1241.50823272514
 Нептун   | ♆     |    49532 | 1.0247e+26 |  30.06 | 1610.42514063507
(8 rows)

Обратите внимание, что наличие фразы ORDER BY orbit при создании обзора гарантирует, что обращения к обзору planet_info с помощью SELECT будет возвращать планеты в их естественном порядке (по мере удаления от Солнца), если в таком запросе не будет указано иное упорядочение:

test54=# SELECT name, diameter, density FROM planet_info ORDER BY diameter;
   name   | diameter |     density      
----------+----------+------------------
 Меркурий |     4880 | 5423.20300055831
 Марс     |     6794 | 3911.00452011731
 Венера   |  12103.6 | 5244.42083382882
 Земля    |  12756.3 |  5496.2105803137
 Нептун   |    49532 | 1610.42514063507
 Уран     |    51118 | 1241.50823272514
 Сатурн   |   120536 | 619.440218250837
 Юпитер   |   142984 | 1241.34547590606
(8 rows)

[Замечание]Замечание

В PostgreSQL обзор реализуется как пустая таблица и правило, которое подменяет клиентский запрос SELECT на другой, в основе которого находится запрос, указанный при создании обзора. В нашем примере правило подменяет запрос

SELECT name, diameter, density FROM planet_info ORDER BY diameter;

на запрос

SELECT name, diameter, 1E-9*6*mass/3.1415926/diameter^3 AS density
ORDER BY diameter;

В других СУБД обзоры могут быть реализованы иначе.

Информатика-54