Представления (VIEW)

Сохраняем сложный запрос под именем и используем его как таблицу.

Представление (VIEW) — это сохранённый SELECT с именем; обращение к нему выполняет запрос и возвращает результат, как будто это таблица.

Зачем нужны представления

Если один и тот же сложный запрос используется во многих местах, его удобно сохранить под именем. Представление не хранит данные — это «виртуальная таблица», за которой стоит запрос. Каждый раз при обращении к ней запрос выполняется заново на актуальных данных.

Создание и использование

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

CREATE TABLE orders (id INTEGER PRIMARY KEY, customer TEXT, amount INTEGER);

INSERT INTO orders (customer, amount) VALUES
    ('Аня', 500), ('Аня', 1200), ('Борис', 800);

CREATE VIEW customer_totals AS
    SELECT customer, SUM(amount) AS total
    FROM orders
    GROUP BY customer;

SELECT * FROM customer_totals ORDER BY total DESC;

Вывод:

Аня|1700
Борис|800

Теперь вместо длинного запроса с GROUP BY можно писать просто SELECT * FROM customer_totals. К представлению применимы WHERE, ORDER BY, его можно соединять с другими таблицами через JOIN — как настоящую таблицу.

Чем полезны представления

  • Упрощение. Сложная логика прячется за коротким именем; запросы становятся читаемее.
  • Повторное использование. Один раз описали — используем везде, не копируя SQL.
  • Слой абстракции. Если структура таблиц изменится, можно поправить только представление, а внешние запросы останутся прежними.

Важные ограничения

Представление в SQLite по умолчанию доступно только для чтения: напрямую делать INSERT/UPDATE/DELETE в него нельзя (для этого существуют специальные триггеры INSTEAD OF). И помните: представление не ускоряет запрос — оно лишь сохраняет его текст, а сам SELECT выполняется каждый раз заново. Удаляют представление командой DROP VIEW customer_totals;.

Итог

  • VIEW — это сохранённый запрос; обращение к нему выполняет SELECT на актуальных данных.
  • К представлению можно применять WHERE, ORDER BY, JOIN, как к таблице.
  • Представления упрощают и переиспользуют логику, но не хранят данные и не ускоряют запрос.
Проверьте себя
1. Что такое представление (VIEW)?
AКопия таблицы с данными
BСохранённый запрос с именем, который выполняется при обращении
CИндекс особого вида
DРезервная копия базы
2. Ускоряет ли обычное представление запрос?
AДа, всегда в разы
BНет — оно лишь сохраняет текст запроса, который выполняется заново
CДа, оно кэширует результат навсегда
DТолько при наличии индекса на VIEW
3. Можно ли по умолчанию делать INSERT прямо в представление SQLite?
AДа, как в обычную таблицу
BНет, представление по умолчанию только для чтения
CДа, но только одну строку
DТолько если оно без GROUP BY
Поддержать проект