Представления. Другие возможности SQL.
Вспомните, о чем говорилось выше в этой главе, – при группировке по полю title функция count() подсчитывает количество записей в каждой группе (в данном случае – для каждого названия книги). Наконец, для поля ship_date таблицы shipments вызывается функция max(), чтобы в результатах запроса выводилась дата последней поставки по каждой книге и количество экземпляров:
booktown=# SELECT count(*) AS num_shipped, max(ship_date), title booktown-# FROM shipments booktown-# JOIN editions USING (isbn) booktown-# NATURAL JOIN books AS b (book_id) booktown-# GROUP BY b.title booktown-# ORDER BY num_shipped DESC; num_shipped | max | title 5 | 2001-08-13 09:47:04-07 | The Cat in the Hat 5 | 2001-08-14 13:45:51-07 | The Shining 4 | 2001-08-11 09:55:05-07 | Bartholomew and the Oobleck 3 | 2001-08-14 13:49:00-07 | Franklin in the Dark 3 | 2001-08-15 11:57:40-07 | Goodnight Moon 3 | 2001-08-14 13:41:39-07 | The Tell-Tale Heart 2 | 2001-08-15 14:02:01-07 | 2001: A Space Odyssey 2 | 2001-08-14 08:42:58-07 | Dune 2 | 2001-08-07 13:00:48-07 | Little Women 2 | 2001-08-09 09:30:46-07 | The Velveteen Rabbit 1 | 2001-08-14 07:33:47-07 | Dynamic Anatomy (11 rows)
Запрос выдает полезную информацию, но синтаксис получается слишком громоздким, и часто вводить его вручную нежелательно. В листинге 4.62 показано, как на базе этого запроса создать представление командой CREATE VIEW.
Листинг 4.62. Создание представления.
booktown=# CREATE VIEW recent_shipments booktown-# AS SELECT count(*) AS num_shipped, max(ship_date), title booktown-# FROM shipments booktown-# JOIN editions USING (isbn) booktown-# NATURAL JOIN books AS b (book_id) booktown-# GROUP BY b.title booktown-# ORDER BY num_shipped DESC; CREATE
Ответ сервера CREATE подтверждает, что представление было успешно создано. В результате в базе данных booktown создается представление recent_shipments с информацией обо всех поставках книг, о количестве заказанных экземпляров и дате последней поставки по каждой позиции.