В некоторых случаях полезно сохранить результат запроса, чтобы воспользоваться им впоследствии. Для таких целей в SQL применяется оператор CREATE VIEW, который создает представление — временную таблицу, в которой как бы фиксируется результат запроса.

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

С другой стороны, изменения в настоящих таблицах немедленно отображаются в виртуальных. Это происходит потому, что СУБД каждый раз при обращении к представлению использует SQL выражение представления для обновления данных. Рассмотрим пример:

sqlite> CREATE VIEW title_url AS
   ...> SELECT title, url FROM pages;
sqlite> SELECT * FROM title_url;
What is Information|information
Amount of Information|amount-information
Binary System|binary
Boolean Lows|boolean
sqlite> INSERT INTO pages (title, url, theme) VALUES
   ...> ('What is Algorithm', 'algorithm', 4);
sqlite> SELECT * FROM title_url;
What is Information|information
Amount of Information|amount-information
Binary System|binary
Boolean Lows|boolean
What is Algorithm|algorithm

Сначала мы создали представление title_url, после чего добавили новую запись в реальную таблицу pages. Обратившись к представлению, мы видим, что новая запись добавлена.

Обычно представления содержат данные, объединенные из разных таблиц:

sqlite> CREATE VIEW change_page AS
   ...> SELECT pages._id, pages.title, sections.name, dates.date
   ...> FROM pages JOIN dates JOIN sections
   ...> ON pages._id = dates.page_id AND sections._id = pages.theme
   ...> ORDER BY dates.date DESC;
sqlite> SELECT * FROM change_page;
8|Boolean Lows|Boolean Algebra|2019-06-04
3|Amount of Information|Information|2019-06-03
9|What is Algorithm|Algorithm|2019-06-01
8|Boolean Lows|Boolean Algebra|2019-05-30
3|Amount of Information|Information|2019-05-26
7|Binary System|Digital Systems|2019-05-26
1|What is Information|Information|2019-05-25

Чтобы удалить представление, используется команда DROP VIEW:

sqlite> DROP VIEW title_url;

Возникает вопрос: как выбрать только пять самых последних измененных страниц? Для этого применяется оператор LIMIT:

sqlite> SELECT * FROM change_page LIMIT 5;
8|Boolean Lows|Boolean Algebra|2019-06-04
3|Amount of Information|Information|2019-06-03
9|What is Algorithm|Algorithm<|2019-06-01
8|Boolean Lows|Boolean Algebra|2019-05-30
3|Amount of Information|Information|2019-05-26

Оператор LIMIT может быть использован как с виртуальными, так и с реальными таблицами:

sqlite> SELECT * FROM dates LIMIT 3;
1|1|2019-05-25
2|3|2019-05-26
3|7|2019-05-26
sqlite> SELECT * FROM dates LIMIT 2, 3;
3|7|2019-05-26
4|8|2019-05-30
5|9|2019-06-01

При использовании двумя числами первым указывается начальное смещение, вторым — количество строк для выборки. Смещение также можно задать с помощью OFFSET:

sqlite> SELECT * FROM dates LIMIT 3 OFFSET 2;
3|7|2019-05-26
4|8|2019-05-30
5|9|2019-06-01

Вопросы для самопроверки:

  1. Что создает оператор CREATE VIEW в SQL?
  2. Можно ли вносить изменения в данные, хранящиеся в представлениях?
  3. Как изменения в настоящих таблицах оказывают влияние на представления?
  4. Приведите пример SQL-запроса для создания представления.
  5. Каково назначение оператора LIMIT в SQL?
  6. Для чего используется команда OFFSET в SQL-запросах?