Views – представления

Бывает удобно сохранить результат выборки для дальнейшего использования. Для этих целей в языке 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

Работает он как с виртуальными, так и реальными таблицами:

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

Если после LIMIT указано два числа, то первое обозначает смещение, и только второе – количество выбираемых строк. Кроме того, можно указывать смещение с помощью ключевого слова OFFSET:

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