Представления. Другие возможности SQL.
При работе с SQL нередко возникают ситуации, когда один и тот же запрос приходится использовать повторно. Ничто не раздражает так, как необходимость многократного ввода больших и сложных запросов в psql. Кроме того, было бы крайне неэффективно пересылать большие наборы данных по сети на сервер PostgreSQL при выполнении стандартных процедур.
В подобных ситуациях обычно используются представления (views). Представление можно рассматривать как хранимый запрос, на основе которого создается объект базы данных. Этот объект очень похож на таблицу, но в его содержимом динамически отражается состояние только тех записей, которые были заданы при создании. Представления весьма гибки и универсальны; они могут строиться на основе как простых и стандартных запросов к одной таблице, так и чрезвычайно сложных запросов, в которых задействовано несколько таблиц.
Создание представления
Представления создаются командой CREATE VIEW, синтаксис которой выглядит следующим образом:
CREATE VIEW представление AS запрос
Где:
- представление. Имя (идентификатор) создаваемого представления.
- запрос. Полная команда SQL SELECT, определяющая содержимое представления.
Предположим, таблица shipments связывает уникальный код поставки с кодом клиента, кодом ISBN книги и датой отправки заказа. Структуру таблицы shipments иллюстрирует табл. 4.1.
Таблица 4.1. Таблица shipments.
Поле | Тип | Модификатор |
---|---|---|
id | integer | NOT NULL DEFAULT nextval ('shipments_ship_id_seq') |
customer_id | integer | |
isbn | text | |
ship_date | timestamp |
Допустим, вы хотите узнать количество поставок, сведения о которых хранятся в таблице. Это можно сделать несколькими способами, но для простоты начнем со следующего решения:
booktown=# SELECT COUNT(*) FROM shipments; count 32 (1 row)
Звездочка (*) в этом запросе просто указывает PostgreSQL на необходимость подсчета всех записей вместе со значениями NULL, которые могли бы присутствовать в поле с явно заданным именем. Запрос подсчитывает общее количество записей, то есть количество зарегистрированных поставок.
Предположим, данные из таблиц editions и books были объединены секцией JOIN, чтобы в выходные данные входили названия всех книг. Более того, в запрос была включена секция GROUP BY, обеспечивающая группировку поставок по названиям книг.